AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

procedure wird nicht aufgerufen

Ein Thema von JnZn558 · begonnen am 5. Sep 2010 · letzter Beitrag vom 6. Sep 2010
Antwort Antwort
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#1

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 15:58
so hier den ganzen komponente quellcode
ist nur so ne beispiel, deshalb kein besondere sagenhafte Name vergeben.
Delphi-Quellcode:
unit PageControl1;

interface

uses
  SysUtils, Classes, Controls, ComCtrls;

type
  TAb = class(TPersistent)
  private
    m_owndraw: Boolean;

  public
    constructor Create;

  published
    property DrawOwn: Boolean read m_owndraw write m_owndraw;

  end;

  TTest = class(TPageControl)
  private
    m_tab: TAb;

    procedure SetTab( ab: TAb );

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    property DrawOwn: TAb read m_tab write SetTab;

  end;

procedure Register;

implementation

  procedure Register;
  begin
    RegisterComponents('Samples', [TTest]);
  end;

  { TAb }

  constructor TAb.Create;
  begin
    Self.m_owndraw := True;
  end;

{ TTest }

constructor TTest.Create(AOwner: TComponent);
begin
  inherited;
  Self.m_tab := TAb.Create;
end;

destructor TTest.Destroy;
begin
  Self.m_tab.Free;
  inherited;
end;

procedure TTest.SetTab(ab: TAb);
begin
  Self.m_tab := ab;
  Self.OwnerDraw := ab.DrawOwn;
end;

end.
was mache ich falsch?
Du hältst dich nicht an die Namenskonventionen von Borland und verwirrst dadurch die Mitleser und auch dich selbst.
Daher sollte der Code so aussehen:
Delphi-Quellcode:
private
  FDrawOwn : Boolean;
  procedure SetDrawOwn(const Value:Boolean);
public
 property DrawOwn: Boolean read FDrawOwn write SetDrawOwn;
So erkennt man leichter was zusammengehört (weil "DrawOwn" konsistent verwendet wird).

Wenn auf das Property DrawOwn niegends schreibend zugegriffen wird, dann optimiert der Kompiler die Procedure SetDrawOwn einfach weg.
Man erkennt es daran, dass die blauen Punkte nach dem Kompilieren fehlen.
ich komme von C++ da ist gewoehnlich membervariable mit einem m voranzustellen.

ich weiss nicht was F bei klassevariable bei delphi bedeutet, kann mir jemand bitte aufklaeren wofuer das steht?
Peace on the world
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 16:05
"F" steht wohl für das englische Wort field, zu deutsch Feld. Als Felder, Eigenschaften oder Attribute bezeichnet man in der OOP private Variablen einer Klasse.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#3

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 16:59
was ist falsch an meinem code, das SetTab nicht aufgerufen wird
Peace on the world
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 19:00
Dein bisher gezeigter Code enthält keinerlei Aufrufe von TTest.SetTab, daher ist die Antwort einfach: Weils nicht aufgerufen wird Innerhalb von TTest greifst du direkt auf m_tab zu ohne den Setter zu benutzen und von außen wird es im gezeigten Code auch nirgends angesprochen. Warum also sollte TTest.SetTab überhaupt aufgerufen werden?
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#5

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 20:19
Dein bisher gezeigter Code enthält keinerlei Aufrufe von TTest.SetTab, daher ist die Antwort einfach: Weils nicht aufgerufen wird Innerhalb von TTest greifst du direkt auf m_tab zu ohne den Setter zu benutzen und von außen wird es im gezeigten Code auch nirgends angesprochen. Warum also sollte TTest.SetTab überhaupt aufgerufen werden?
irgendwie kappiere ich deine antwort nicht, ich hab doch ein setter funktion "SetTab", das hast du doch auch erwaehnt, und von aussen, is vorgesehen, wenn die eigentschaft "TTest.DrawOwn" gesetzt is, sollte SetTab dadurch aufgerufen, aber es tut nicht wie geplant
Peace on the world
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: procedure wird nicht aufgerufen

  Alt 5. Sep 2010, 21:04
Wir sehen hier aber nicht ein Gramm Code, wo DrawOwn etwas zugewiesen wird!

Wir sehen nur die Deklaration, aber nicht wie es benutzt wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#7

AW: procedure wird nicht aufgerufen

  Alt 6. Sep 2010, 01:50
also ich hab jez ein beispiel von delphi.about.com

ich hab zum testen code reingeschrieben, hier kann ich euch zeigen was ich gemeint hab

hier komponente quellcode
Delphi-Quellcode:
unit ExpandingComponent;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OurCollection;

type
  TExpandingRecord = class(TPersistent)
  private
    FIntegerProp : Integer;
    FStringProp : String;
    FCollectionProp : TOurCollection;
    procedure SetCollectionProp(const Value: TOurCollection);
  public
    constructor Create(AOwner : TComponent);
    destructor Destroy; override;

    procedure Assign(Source : TPersistent); override;
  published
    property IntegerProp : Integer
      read FIntegerProp
      write FIntegerProp;
    property StringProp : String
      read FStringProp
      write FStringProp;
    property CollectionProp : TOurCollection
      read FCollectionProp
      write SetCollectionProp;
  end;

  TExpandingComponent = class(TComponent)
  private
    { Private declarations }
    FProperty1,
    FProperty2,
    FProperty3 : TExpandingRecord;
    FTest: string;
  protected
    { Protected declarations }
    procedure SetProperty1(const Value : TExpandingRecord);
    procedure SetProperty2(const Value : TExpandingRecord);
    procedure SetProperty3(const Value : TExpandingRecord);
    procedure SetTest( str: string );
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property Property1 : TExpandingRecord
      read FProperty1
      write SetProperty1;
    property Property2 : TExpandingRecord
      read FProperty2
      write SetProperty2;
    property Property3 : TExpandingRecord
      read FProperty3
      write SetProperty3;
    property testproperty: string read FTest write SetTest;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TExpandingComponent]);
end;

{ TExpandingRecord }

procedure TExpandingRecord.Assign(Source: TPersistent);
begin
  if Source is TExpandingRecord then
    with TExpandingRecord(Source) do begin
      Self.IntegerProp := IntegerProp;
      Self.StringProp := StringProp;
      Self.CollectionProp := CollectionProp; //This actually assigns
    end else
      inherited; //raises an exception
end;

constructor TExpandingRecord.Create(AOwner : TComponent);
begin
  inherited Create;
  FCollectionProp := TOurCollection.Create(AOwner);
end;

destructor TExpandingRecord.Destroy;
begin
  FCollectionProp.Free;
  inherited;
end;

procedure TExpandingRecord.SetCollectionProp(const Value: TOurCollection);
begin
  FCollectionProp.Assign(Value);
end;

{ TExpandingComponent }

constructor TExpandingComponent.Create(AOwner: TComponent);
begin
  inherited;
  FProperty1 := TExpandingRecord.Create(Self);
  FProperty2 := TExpandingRecord.Create(Self);
  FProperty3 := TExpandingRecord.Create(Self);
end;

destructor TExpandingComponent.Destroy;
begin
  FProperty1.Free;
  FProperty2.Free;
  FProperty3.Free;
  inherited;
end;

procedure TExpandingComponent.SetProperty1(const Value: TExpandingRecord);
begin
  ShowMessage('Property1');
  FProperty1.Assign(Value);
end;

procedure TExpandingComponent.SetProperty2(const Value: TExpandingRecord);
begin
  ShowMessage('Property2');
  FProperty2.Assign(Value);
end;

procedure TExpandingComponent.SetProperty3(const Value: TExpandingRecord);
begin
  ShowMessage('Property3');
  FProperty3.Assign(Value);
end;

procedure TExpandingComponent.SetTest(str: string);
begin
  ShowMessage('testproperty');
  FTest := str;
end;
hier testanwendung
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExpandingComponent;

type
  TForm1 = class(TForm)
    ExpandingComponent1: TExpandingComponent;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
ich aendere alle properties in objekt inspekter von der komponente in testanwendung nacheinander,

Property1 bis Property3 zeigen leider keine Meldung, also nur bei testproperty gibt es eine meldung "testproperty" aus, und breakpoint haelt auch nur bei testproperty an, property1 bis property3 ignorieren breakpoint, es macht mich voll verrueckt. is das normal? ich hoffe ihr koennt mich jez viel besser verstehen
Peace on the world

Geändert von JnZn558 ( 6. Sep 2010 um 01:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz