Autor Beitrag
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 14.01.04 16:50 
Was ich gerne wissen würde ist wie man die Objekte verwaltet. Hier ein Beispiel. Man braucht dafür ein leeres Formular, eine ListBox und ein Button.

ausblenden volle Höhe Delphi-Quelltext
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:
33:
34:
35:
36:
37:
type
  TTest = class
    sText: String;
  end;

{...}

procedure TForm1.Button1Click(Sender: TObject);
var
  Test: TTest;
begin
  Test := TTest.Create;
  try
    Test.sText := DateTimeToStr(Now);
    ListBox1.Items.AddObject('TestText', TObject(Test));
  finally
    //Test.Free;
  end;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
  Test: TTest;
begin
  with ListBox1 do 
  begin
    if (Items.Count = 0or (ItemIndex < 0then Exit;

    Test := TTest.Create;
    try
      Test := TTest(Items.Objects[ItemIndex]);
      ShowMessage(Test.sText);
    finally
      Test.Free;
    end;
  end;
end;


Alles hier funktioniert ohne Fehler und doch ist der Code nicht richtig. AddObject speichert nicht das Objekt selbst, sondern nur den Zeiger drauf. Würde ich Button1Click den TTest in finally wieder freigeben, so würde ich auch das Objekt wieder freigeben. Also wird er nicht freigegeben und ich kann in der ListBox1DblClick Prozedur auf das Objekt zugreifen.

Meine Frage ist wie ich die Objekte später wieder freigeben kann. Hin und wieder passiert es schon mal, dass man einen der Listboxeinträge nicht brauch oder einfach die Listbox.Items komplett löscht. In diesem Fall bleiben die Objekte im Speicher. Nur bitte keine Empfehlungen es mit Arrays zu machen. Wenn ich es so kompliziert machen muss, dann kann ich es mir auch mit den AddObject ganz sparen. Was ich also nicht brauchen kann ist eine Verwaltung der Objekte, aber ich will zu jedem ListBox Eintrag ein Objekt hinzufügen. Nur muss es doch möglich sein mit dem Löschen eines Items auch den dazugehörigen Objekt zu löschen, ohne gleiche eine Objektverwaltung zu machen. Dafür mache ich es mit AddObject, damit ich keine zwei Sachen parallel machen muss.

Ich hoffe auf paar Ideeen.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 14.01.04 17:24 
Hallo,
so wie du das machst geht das nicht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    Test := TTest.Create;   //objekt erzeugen
    try 
      Test := TTest(Items.Objects[ItemIndex]);  //zeiger auf das entsprechende Listbox-objekt "umbiegen", 1)
      ShowMessage(Test.sText); 
    finally 
      Test.Free; //objekt wieder freigeben 2)
    end;


1) Test:= ein anderes objekt
hier kopierst du nicht, du biegst einfach den Zeiger um (kopieren wäre test.assign(ein anderes objekt) hier brauchst du dann auch ein create und free). das hat zwei Folgen:
1. dein erzeugtest Test-objekt kannst du nicht mehr freigeben und schaffst dir hier ein Speicherleck
2. wenn du jetzt test.free machst, gibts du nicht dein in der dblclick proc erzeugtes test frei, sondern das bei den items verknüpfte. ein weiterer dblKlick auf das gleiche Item wird dir dann eine Zugriffsverletzung bringen.

hier langt, wenn du schreibst (ohne das erzeugen etc.), aber evtl wäre ein typprüfung sinnvoll (if Items.Objects[ItemIndex] is TTest then ...)
ausblenden Delphi-Quelltext
1:
2:
      Test := TTest(Items.Objects[ItemIndex]);  
      ShowMessage(Test.sText);


Zitat:

Meine Frage ist wie ich die Objekte später wieder freigeben kann

Eine Tobjectlist macht das automatisch, wenn du beim erstellen true übergibst. Bei Listboxen etc ist dies nicht so. Ich habe jetzt hier nur D5, ich weiß nicht, wie sich höhere Versionen verhalten. aber du kannst bei dem einzelnem löschen erst dein objekt und dann das eigentliche item löschen. und für die gesamte Listbox kannst du dann im ondestroy der form deine Objekte wieder freigeben.
Du kannst auch mal im Forum hier oder auf der DP suchen, irgendwo hat Luckie da auch mal ein größeres Codebeispiel dazu gemacht.

Mfg Frank

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 14.01.04 17:48 
Hier findest du ein Demo dazu: www.luckie-online.de/files/demos/
bms Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Do 15.01.04 20:00 
Danke für den Hinweis. Ich arbeite zu selten mit Delphi und hab die Kleinigkeit übersehen. Allerdings ist somit auch das Problem mit dem Löschen des Objekts beseitigt. Wenn ich durch das Zuweisen eines Objekts zum Anderen den Zeiger kopiere, so kriege ich das Objekt aus Button1Click wieder gelöscht. Hab schon ausprobiert.