Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
26. Feb 2007
Ich glaub jetzt hab ichs:
Das was ich oben über die 2 Gruppen geschrieben habe ist falsch. Dispose kapselt nämlich Finalize und FreeMem. procedure _Dispose(p: Pointer; typeInfo: Pointer);
begin
_Finalize(p, typeinfo);
FreeMem(p);
end;
Der Praxistest hat gezeigt: Man muss an Dispose einen typisierten Pointer übergeben.
@Chatfix: Du bekommst deine Antwort noch. Einen kleinen Moment...
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
26. Feb 2007
Hey Thomas,
du machst mich ja ganz kirre. Weiter oben schreibst du:
Und hier unten fragst du genau danach. :-D
Aber damit wir das Problem endlich lösen können, werd ich mal sehen, obs irgendwo etwas schriftliches dazu gibt.
Edit:
In der BDS4-Referenz hab ich folgendes gefunden:
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
25. Feb 2007
Und um alles noch mal zusammen zu fassen:
Dispose() braucht einen typisierten Pointer, damit es weiß, wie viel Speicher es freigeben muss. (Auf Delphisch: Dispose(PString(Datta); )
Enthält der Pointer lange Strings, Variant-Werte oder Interfaces, muss vorher ein Finalize gemacht werden. Vorsorglichg kann man das immer voranstellen, denn ...
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
25. Feb 2007
Eigentlich sollte das nicht schief gehen, denn der Vorteil von New() und Dispose() ist ja gerade der, das diese Routinen (im Gegensatz zu GetMem() und FreeMem()) mit langen Strings umgehen können.
Edit:
Edit2:
Ok, du hast doch recht. .... nur woher hab ich das mit dem Dispose und den langen Strings ... und außerdem: In der Praxis funktionierts :gruebel:
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
24. Feb 2007
Ja, vor dem Clear müsstest du alle Items durchlaufen ... es sei denn, es gibt ein Ereigniss beim Freigeben eines Items (á la VirtualTree).
Und wenn du es nicht tust, sollte eigentlich Memoryleaks übrigbleiben. Am besten kann man das ab BDS4 mit dem Befehl
ReportMemoryLeaksOnShutdown:=true; testen.
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
23. Feb 2007
Bevor du eine ListView.Clear machst (oder ein Item löschst), musst du natürlich alle Strings freigeben ... und das eben mit dem von dir angeführten Dispose.
Dispose(PString(ListItem.Data));
Forum: Object-Pascal / Delphi-Language
Delphi
by chaosben,
22. Mai 2006
Hi ranftl!
Bei deinem Code existiert der String deiner Wünsche nur so lange, wie du in der Prozedur bleibst, in der dieser Code ausgeführt wird. Probier es lieber mal so (aus dem Kopf):
procedure TuWas;
var
LText : PString;
begin
New(LText);
LText^:=FieldByName('Test1').AsString + FieldByName('Test2').AsString;