Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekte zur Laufzeit erstellen und löschen (https://www.delphipraxis.net/73099-objekte-zur-laufzeit-erstellen-und-loeschen.html)

Khabarakh 12. Jul 2006 20:37

Re: Objekte zur Laufzeit erstellen und löschen
 
Zitat:

Zitat von Peinhard
Zitat:

Zitat von Khabarakh
Auch eine while-Schleife würde nichts ändern. Es wird zwar keine Exception ausgelöst, aber lediglich jedes zweite Item gelöscht.

Das hab' ich so pauschal auch nicht behauptet

Aber auch nicht verneint, also habe ich verneint ;) .

Es gäbe auch noch eine Alternative, bei der die Schleifenrichtung irrelevant ist, allerdings auch wieder etwas ineffektiver:
Delphi-Quellcode:
for i := 0 to List.Count - 1 do
  ThrowIntoGarbage(List[0]);
[edit]Entspricht der Lösung von jbg weiter oben. [/edit]

PS: Das halte ich für einen groben Designfehler in der VCL. Mit einer einfachen Control-Collection-Klasse würde ein "Controls.Clear" genügen und alle wären zufrieden.

Sir Rufo 12. Jul 2006 20:42

Re: Objekte zur Laufzeit erstellen und löschen
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  while Panel1.ControlCount > 0 do
  begin
      showmessage(Panel1.Controls[0].name);
      Panel1.Controls[0].free;
      Application.ProcessMessages;
  end;
end
Was haltet ihr denn von dieser Lösung ... :mrgreen:

Da braucht kein Compiler irgendwas optimieren und die Diskussionen werden gespart :mrgreen:

cu

Oliver

Peinhard 12. Jul 2006 21:07

Re: Objekte zur Laufzeit erstellen und löschen
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Peinhard
Das hab' ich so pauschal auch nicht behauptet

Aber auch nicht verneint, also habe ich verneint ;) .

Aber die pauschale Verneinung ist ja auch wieder nicht richtig! :bouncing4:

Und dein sowie das Beispiel von Rufo Sir zeigt zu allem Überfluss auch noch, daß es doch 'von vorne' geht, und zwar sowohl mit while als auch mit for. Halten wir doch für die interessierte Nachwelt fest, daß man von vorne nie das 'i-te', sondern immer nur das '0-te' Element wegwuschen darf - am effektivsten aber ist und bleibt for 'von hinten', da sich die Liste dabei nicht ständig neu justieren muß und keine while-Bedingung bei jedem Durchlauf neu geprüft werden muß. :warn:

Feierabend! :stupid:

Muetze1 12. Jul 2006 23:57

Re: Objekte zur Laufzeit erstellen und löschen
 
Zitat:

Zitat von Sir Rufo
Da braucht kein Compiler irgendwas optimieren und die Diskussionen werden gespart :mrgreen:

Das ist aber von der Ausführungsgeschwindigkeit die langsamste Variante, da er so mit jedem gelöschten Element erstmal alle nachfolgenden Elemente eins nach vor schieben muss. Dieser Weg ist am uneffektivsten. Wenn, dann so und es läuft auch schnell ab:

Delphi-Quellcode:
  while Panel1.ControlCount > 0 do
  begin
    showmessage(Panel1.Controls[Pred(Panel1.ControlCount)].name);
    Panel1.Controls[Pred(Panel1.ControlCount)].free;
    Application.ProcessMessages;
  end;
/EDIT: Hat Peinhard ja doch schon erwähnt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 Uhr.
Seite 2 von 2     12   

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