Toon posts:

[Delphi] Aangepaste TTreeNode in TTreeNodes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb TTreeNode aangepast, met een aantal extra properties. Is er nu een manier om die te gebruiken in een TTreeNodes object, of moet ik die dan half herschrijven? :?

Ik bedoel hierbij de TTreeNodes van een TTreeView.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09-09 21:25

Creepy

Tactical Espionage Splatterer

Misschien is het een makkelijkere optie om die extra properties aan de ttreenode.data te koppelen? Kan je zonder extra moeite de ttreeview en ttreenodes blijven gebruiken

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Hartstikke bedankt :)

Kun je weer zien dat ik een behoorlijke newbie ben, ik wist helemaal niet dat die property bestond. |:(
Toch vond ik het wel raar, omdat ik geen makkelijke manier kon vinden om data aan een node te koppelen, hoewel je soms nauwelijks zonder kan.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09-09 21:25

Creepy

Tactical Espionage Splatterer

ttreenode.data, lijkt me toch vrij makkelijk :)

Alleen, wat dan he. ttreenode.data is een pointer, en dat schijnt nogal een moeilijk onderwerp te zijn.

Simpel voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
type Textrazooi = record
             extra1: integer;
             exttra2: integer;
     end;
     Pextrazooi = ^TExtrazooi; // een pointer naar ons record

var newnode: TTreeNode;

procedure maaknieuwenodeaan;
var extrazooipointer = Pextrazooi;
begin
     new(extrazooipointer); // reserveer geheugen voor de pointer
    // Ken wat waarden toe.
    extrazooipointer^.extra1:=13;
    extrazooipointer^.extra2:=1;

    newnode:=Treenode1.items.addobject(nil,'Nieuwe node enzo',extrazooipinter);
end;

procedure ruimnodeop;
var extrazooipointer: PExtrazooi;
begin
     // een ttreenode ruimt z'n eigen data pointer NIET op.
     extrazooipointer:=newnode.data;
     // schoon de data op
     dispose(extrazooipointer);

     // een ttreeview ruimt z'n eigen items op, dus
     // dit is niet echt nodig.     
     //hmz.. weet niet eens of onderstaande regel goed is.
     treenode1.items.delete(newnode.index);
end;

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 09-09 12:09

Delphi32

Heading for the gates of Eden

Op dinsdag 16 april 2002 20:00 schreef Creepy het volgende:
ttreenode.data, lijkt me toch vrij makkelijk :)

Alleen, wat dan he. ttreenode.data is een pointer, en dat schijnt nogal een moeilijk onderwerp te zijn.

Simpel voorbeeld:
code:
1
...
Mmm Creepy dat vond ik geen eenvoudig voorbeeld :)

Persoonlijk gebruik ik altijd de .data property om TObjects in op te slaan. Dan hoef ik me niet druk te maken over het aanmaken van pointers enzo, en allerlei record structures te maken. Hou ik het fijn bij de classes die je overal ziet.

Een probleempje: de ownership van dingen die je in de data property hangt. Wie ruimt de boel op, zal ik maar zeggen.

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Ik heb ook een Data gebruikt maar ik moet zelf zeggen als je het overzichtelijk wilt houden zou ik toch TMyTreeNode aanmaken ofzo. Het is echt een flink gekloot met records, en of je dat wilt is maar de vraag. Vergeet ook niet dat als je de data property gebruik er iets verkeert kan gaan wanneer je het verkeerd linkt/de data "niet meer is".

Data kan is goed te doen overigens, maar als ik nog iets zou moeten maken met TTreeNode en overige opties verbouw ik zeker TTreeNode, no doubt.

Steun Elkaar, Kopieer Nederlands Waar!


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09-09 21:25

Creepy

Tactical Espionage Splatterer

Op woensdag 17 april 2002 00:26 schreef Delphi32 het volgende:

[..]

Mmm Creepy dat vond ik geen eenvoudig voorbeeld :)

Persoonlijk gebruik ik altijd de .data property om TObjects in op te slaan. Dan hoef ik me niet druk te maken over het aanmaken van pointers enzo, en allerlei record structures te maken. Hou ik het fijn bij de classes die je overal ziet.

Een probleempje: de ownership van dingen die je in de data property hangt. Wie ruimt de boel op, zal ik maar zeggen.
Sinds wanneer zijn records en pointers niet eenvoudig meer :P

TOBjects in hangen kan ook natuurlijk, en is inderdaad een stuk makkelijker. Ownership? Je zal voordat je de TTreeNode opruimt zelf die TOBject moeten opruimen (net als met het pointer voorbeeld dus)
code:
1
2
3
4
5
6
7
8
newnode: TTreeNode;

procedure maakaan;
var blaat: TMyObject;
begin
     blaat:=TMyObject.create;
     newnode:=ttreenode.items.addobject(nil,'nieuwe node',blaat);
end;

En dan voordat je de treeview opruimt / je app. afsluit / ttreenodes weggooit eerst de data pointers opruimen
code:
1
2
TMyObject(node.data).free;
// haal nu de node weg

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Als je zeker wilt zijn dat de zaken opgeruimd worden dan gebruik je:
code:
1
2
3
4
5
6
7
8
9
10
11
Delphi 5 of hoger:
var
  P: Pointer;
begin
  P:=TreeNode.Data;
  FreeAndNil(P);
end;
Delphi 4 of lager:
  if Assigned(TreeNode.Data) then
    TObject(TreeNode.Data).Free;
  TreeNode.Data:=nil;

En voor pointers naar bijv. records:
code:
1
2
3
  if Assigned(TreeNode.Data) then
    dispose(TreeNode.Data);
  TreeNode.Data:=nil;

Als je TComponents gebruikt moet een AOwner in de constructor doorgeven. Deze Owner zal proberen (mits deze Assigned is) het Component op te ruimen zodra deze Owner zelf opgeruimd wordt. TObject/TPersistent zul je zelf op moeten ruimen aangezien deze geen Owner kennen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09-09 21:25

Creepy

Tactical Espionage Splatterer

Hmm.. dispose(node.data) kan gewoon? Ik dacht dat je eerste de .data moest casten naar het echt type, en dan pas dispose kon doen.

Scheelt weer een typecast zo :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1