Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.203 Beiträge
 
Delphi 12 Athens
 
#10

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 13:32
Im Grunde muß immer nur der DatenTyp angepasst werden. (abgesehn von den CompilerMagicSachen)
Delphi-Quellcode:
var Data: PString;
var Data: PInteger;
...

Wobei der String nicht dem Pointer übergeben wird (Strings und dynamische Arrays sind halt 'ne CompilerMagicSache), sondern der Pointer zum String gemacht wird und diesem dann erst der String gegeben wird (also andersrum).
Ein AnsiRING) hat ja eine Interne referenzzähling und wenn nur der Pöinter übergeben wird, dann wird der Referenzzähler nicht erhöht und somit kann der String eventuell vorzeigt freigegeben werden.

Wenn dem String z.B. erst in der Prozedur der Inhalt erzeugt/zugewiesen wurde und dann der String auch noch eine Lokale Variable ist, dann wird er ja am Prozedurende freigegeben.

Zitat:
String zuweisen >> Referenzzähler = 1
Pointer übergeben >> Referenzzähler immernoch 1
Prozedurende >> Referenzzähler = Referenzzähler - 1
wenn Referenzzähler = 0 >> string wird freigegeben
Code:
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  [b]AString: String[/b]): PVirtualNode;
begin
  Result:=AVST.AddChild(ANode);
  AVST.ValidateNode(Result,False);
  Data:=AVST.GetNodeData(Result);
  [b]PString(Data^.FObject)^ := AString;[/b]
end;
Und der Integer ... für den brauchste nichtma Speicher reservieren, da dieser ja genausogroß wie der Pointer ist:
Code:
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  [b]AInteger: Integer[/b]): PVirtualNode;
begin
  Result:=AVST.AddChild(ANode);
  AVST.ValidateNode(Result,False);
  Data:=AVST.GetNodeData(Result);
  [b]Data^.FObject := Pointer(AInteger);[/b]
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat