Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TObjectList Problem (https://www.delphipraxis.net/164893-tobjectlist-problem.html)

Dennis07 5. Dez 2011 08:47

TObjectList Problem
 
Hallo Leute,
ich hoffe dass ich hier richtig liege, ist ja mehr oder weniger wie ein 6er im Lotto zu wissen wo genau hier ein beitrag reingehört.
Also nun zu meinem Problem:
Ich muss ein Programm schreiben dass Panels zur Laufzeit erstellt und per Knopdruck wieder alle brav entfernt.
Das mit dem Erstellen ist ja kein Problem, habe ich mit NewPanel := TPanel.Create. Erst bei der 2. Frage fängt es an zu Hacken...
Ich habe mich entschlossen, für das Löschen der Panels eine TObjectList direkt zum Programmstart zu erstellen, in die ich alle erstellen Panels einordne. Wie ich die Panels lösche, zu dem Problem bin ich nicht einmal gekommen, denn es hackt bereits hier:
Aus irgenteinem Grund listet der die Neu erstellen Panels nicht in die Liste ein (k.a.wieso, wharcheinlich habe ich nur irgentetwas dummes übersehen. Hier mal schnell alles, was euch hierzu interessieren könnte:

Delphi-Quellcode:
var
  NewPanel: TPanel;
  PanelID: Integer = 1;
  PanelsList: TObjectList;
  { ... }

procedure TfmPool.FormCreate(Sender: TObject);
begin
  PanelsList := TObjectList.Create;
  { ... }
end;

procedure SpawnPanel(PanelX,PanelY: Integer);
begin
  NewPanel := TPanel.Create(Application);
  PanelsList.Add(NewPanel);
  with NewPanel do
  begin
    Name := 'Panel' + IntToStr(PanelID);
    PanelID := PanelID + 1;
    Left := PanelX;
    Top := PanelY;
    Caption := ObjectCaption;
    Parent := fmPool;
    Enabled := False;
    { ... }
    OnClick := fmPool.SelectObject;
  end;
end;

procedure TfmPool.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PanelsList.Free;
end;
Anzuumerken wäre vielleicht, dass keine Fehlermeldung erscheint.
Vielen Dank
--Dennis

DeddyH 5. Dez 2011 09:01

AW: TObjectList Problem
 
Soll heißen, die Liste bleibt leer? Wieso verwendest Du übrigens globale Variablen, die sind doch gar nicht nötig. Und wenn Du die Panels eh in die Objektliste einfügst, musst Du auch keinen Owner angeben.

Sir Rufo 5. Dez 2011 09:18

AW: TObjectList Problem
 
Er fügt die Panels doch in die Liste ein, oder was macht
Delphi-Quellcode:
PanelsList.Add(NewPanel);
:gruebel:

Wie kommst du darauf, dass die nicht in der Liste stehen?

BTW: Da du ja anscheinend eine eindeutige ID für die Panels benötigst, würde ich ja schon eher eine TCollection vorschlagen, da wird die ID gleich mitproduziert

DeddyH 5. Dez 2011 09:21

AW: TObjectList Problem
 
Gab es TCollection schon unter Delphi 5? Oder stimmt die angegebene Delphi-Version nicht? Achja, eins noch: wenn man die Objekliste im FormCreate anlegt, sollte man sie im FormDestroy freigeben und nicht im FormClose. Sonst kann es passieren, dass man darauf zugreift, obwohl sie bereits entsorgt wurde.

Codewalker 5. Dez 2011 09:39

AW: TObjectList Problem
 
Und nicht vergessen: TObjectList hat ein Property namens OwnsObjects (wird im Constructor gesetzt). Ist es true (standard), dann werden beim Löschen der Object-List auch alle noch enthaltenen Objekte automatisch freigegeben.

DeddyH 5. Dez 2011 09:47

AW: TObjectList Problem
 
Nicht nur beim Löschen der Liste selbst, sondern auch beim Löschen von Elementen aus der Liste.

Gollum 5. Dez 2011 10:10

AW: TObjectList Problem
 
Hallo,

die Variable NewPanel darf nicht global sein, sondern sie muss lokal in der Procedure SpawnPanel deklariert werden.

DeddyH 5. Dez 2011 10:18

AW: TObjectList Problem
 
Wieso denn das? Es ist zwar nicht schön so wie im Moment, aber darf und muss ist IMHO die falsche Wortwahl.

Dennis07 5. Dez 2011 12:40

AW: TObjectList Problem
 
Zitat:

Soll heißen, die Liste bleibt leer?
Genau.

Zitat:

Wieso verwendest Du übrigens globale Variablen, die sind doch gar nicht nötig.
Ich habe euch nur einen kleinen Teil des Codes gegeben. Ich brauche sie noch in anderen Procedures, ist aber hier nicht relevant (deswegen euch erspart).

Zitat:

Und wenn Du die Panels eh in die Objektliste einfügst, musst Du auch keinen Owner angeben.
Danke, das wusste ich nicht.

Zitat:

Gab es TCollection schon unter Delphi 5?
Keine Ahrnung. Worauf willdst du hinaus (kenne diese Klasse nicht, sry)?

Zitat:

Wieso denn das? Es ist zwar nicht schön so wie im Moment, aber darf und muss ist IMHO die falsche Wortwahl.
Ich denke auch, das dürfte doch keinen Unterschied machen, oder?

DeddyH 5. Dez 2011 12:42

AW: TObjectList Problem
 
Das mit TCollection bezog sich auf Sir Rufos Post. Wie stellst Du denn fest, dass die Liste leer bleibt? Fragst Du testhalber die Anzahl der Elemente ab?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz