Objekt erzeugen/an Prozedur uebergeben

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Objekt erzeugen/an Prozedur uebergeben

Beitrag von Eclipticon »

Hi,

momentan arbeite ich mit folgendem Code:

Code: Alles auswählen

procedure TMainForm.FormCreate(Sender: TObject);
 
  procedure AddObjectToTreeView(PSomeObject: Pointer);
  begin
    MyTreeView.Items.AddObject(MyTreeView.Items.Item[0], TSomeObject(PSomeObject^).Caption,  PSomeObject);
  end;
 
var
  SomeObject1, SomeObject2: TSomeObject;
begin
 
  // ...
 
  SomeObject1 := TSomeDerivedObject.Create
  AddObjectToTreeView(@SomeObject1);
  SomeObject2 := TSomeOtherDerivedObject.Create
  AddObjectToTreeView(@SomeObject2);
 
  // ...
 
end;
Das funktioniert zwar, gefaellt mir aber nicht.

Wie kann ich das Objekt uebergeben und nicht einen Pointer drauf? Das muss doch irgendwie moeglich sein ... bei meinen bisherigen Versuchen bekomm ich aber immer einen Segfault, sobald ich ein Objekt ueber MyTreeView.Items.Item.Data^ ansprechen will ...

Kann ich den Konstruktor irgendwie mit dem Prozeduraufruf verbinden, damit ich mir den Umweg ueber die Variablen spare?

Code: Alles auswählen

AddObjectToTreeView( TSomeOtherDerivedObject.Create)
in etwa ...

Danke :-)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von u-boot »

Ohne dass ich mich mit treeview-sachen auskenne:

Könnte gehen, aber man muss sich überlegen, wie man auf ein solch erstelltes Objekt zugreifen will. Irgendwann wird man mit dem Objekt ja weiterarbeiten wollen.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von MAC »

ka
vlt so ?

Code: Alles auswählen

procedure TMainForm.FormCreate(Sender: TObject);
 
  procedure AddObjectToTreeView(SomeObject: TSomeObject);
  begin
    MyTreeView.Items.AddObject(MyTreeView.Items.Item[0], SomeObject.Caption,  @SomeObject); // Sollte funktionieren
    MyTreeView.Items.AddObject(MyTreeView.Items.Item[0], SomeObject.Caption,  Pointer(@SomeObject));  //im notfall so
  end;
 
var
  SomeObject1, SomeObject2: TSomeObject;
begin
 
  SomeObject1 := TSomeDerivedObject.Create
  AddObjectToTreeView(SomeObject1);
  SomeObject2 := TSomeOtherDerivedObject.Create
  AddObjectToTreeView(SomeObject2);
 
end;

Code: Alles auswählen

Signatur := nil;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von Eclipticon »

MAC, genauso hatte ich mir das auch vorgestellt ... aber bei

Code: Alles auswählen

TSomeObject(My.Items.Item[i].Data^).Destroy
bekomme ich auf diese Weise immer einen Runtime Error 210, waehrend mit dem Code im Originalposting lt. Debugger und heaptrc alles sauber aufgeraeumt wird ...

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von theo »

Macht ihr da nicht einen Schritt zuviel?

SomeObject1 IST ein Pointer, und kann so übergeben werden.

Dann müsste auch
TSomeObject(My.Items.Data).Free;
funzen

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von Eclipticon »

Theo, danke fuer den Hinweis!

So funkts (basierend auf dem Code von MAC:

Code: Alles auswählen

procedure TMainForm.FormCreate(Sender: TObject);
 
  procedure AddObjectToTreeView(SomeObject: TSomeObject);
  begin
    MyTreeView.Items.AddObject(MyTreeView.Items.Item[0], SomeObject.Caption,  Pointer(SomeObject));
  end;
 
var
  SomeObject1, SomeObject2: TSomeObject;
begin
 
  SomeObject1 := TSomeDerivedObject.Create
  AddObjectToTreeView(SomeObject1);
  SomeObject2 := TSomeOtherDerivedObject.Create
  AddObjectToTreeView(SomeObject2);
 
end;
Und zerstoeren wie Du beschrieben hast ...

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von theo »

Code: Alles auswählen

Pointer(SomeObject)
Das Casting auf Pointer ist überflüssig. Wie gesagt, du kannst direkt SomeObject übergeben.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von pluto »

Code: Alles auswählen

procedure TMainForm.FormCreate(Sender: TObject);
 
  procedure AddObjectToTreeView(SomeObject: TSomeObject);
  begin
    MyTreeView.Items.AddObject(MyTreeView.Items.Item[0], SomeObject.Caption,  Pointer(SomeObject));
  end;
 
var
  SomeObject1, SomeObject2: TSomeObject;
begin
 
//  SomeObject1 := TSomeDerivedObject.Create
  AddObjectToTreeView(TSomeDerivedObject.Create);
  //SomeObject2 := TSomeOtherDerivedObject.Create
  AddObjectToTreeView(TSomeOtherDerivedObject.Create;
 
end;
warum nicht so?
Zuletzt geändert von Lori am Do 5. Jan 2012, 18:46, insgesamt 1-mal geändert.
Grund: Highlighter
MFG
Michael Springwald

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Objekt erzeugen/an Prozedur uebergeben

Beitrag von Eclipticon »

Danke allerseits :-)

Antworten