AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte zur Laufzeit erstellen und löschen

Ein Thema von bwolf · begonnen am 12. Jul 2006 · letzter Beitrag vom 13. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#1

Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 12:55
Hi all,

hab ein kleines Problemchen, wo ihr mir hoffentlich weiterghelfen könnt.

Ich hab eine Form, ein Panel, und 2 Buttons.
Button1 erstellt 10 Objekte auf dem Panel.
Button2 soll diese 10 Objekte wieder entfernen.

Hier der Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var cb : TCheckBox;
     intI : integer;
begin
  intI := 0;
  while intI < 9 do
  begin
      cb := TCheckBox.Create(self);
      intI := intI + 1;
      cb.Name := 'test'+intTOSTr(inti);
      cb.Visible := true;
      cb.Parent := Panel1;
      cb.Top := intI*20;
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  i : integer;
begin
  i := 0;
  while i < Panel1.ControlCount do
  begin
      showmessage(Panel1.Controls[i].name);
      Panel1.Controls[i].free;
      Application.ProcessMessages;
      i := i+1;
  end;
end

Das seltsame ist, das nicht alle Checkboxen entfernt werden, sonder nur jede 2.
Wenn ich mir allerdings nur die Namen anzeigen lasse, und die Checkboxen nicht lösche, werden alle ausgegeben


Danke für eure Hilfe,
grüße Ben
  Mit Zitat antworten Zitat
mbamler

Registriert seit: 19. Mai 2005
Ort: Hamburg
118 Beiträge
 
Delphi 7 Architect
 
#2

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 12:59
versuch es mal mit soetwas wie:
Delphi-Quellcode:
for i := Panel1.ControlCount downto 0 do
begin
    showmessage(Panel1.Controls[i].name);
    Panel1.Controls[i].free;
    Application.ProcessMessages;
end;
Gruß
Matthias

[edit=SirThornberry]Delphi-Tags ergänzt. Nächstes mal bitte selbst setzen. Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 13:03
Zitat von bwolf:
Delphi-Quellcode:
begin
  intI := 0;
  while intI < 9 do
  begin
      cb := TCheckBox.Create(self);
      intI := intI + 1;
Schon mal was von "for intI := 0 to 8 do" gehört?

Zitat:
Delphi-Quellcode:
begin
  i := 0;
  while i < Panel1.ControlCount do
  begin
      showmessage(Panel1.Controls[i].name);
      Panel1.Controls[i].free;
      Application.ProcessMessages;
      i := i+1;
  end;
end
Zitat:
Das seltsame ist, das nicht alle Checkboxen entfernt werden, sonder nur jede 2.
Aber genau das sagst du dem Compiler, dass er das so machen soll.

Du musst deinen Code nur einmal für zwei Checkboxen durchspielen:
Mit dem ersten Panel1.Controls[i].Free löscht du das 0. Control. Das 1. Control rückt nun auf den Platz des 0. Controls, das 2. auf den des 1., ....
Nun erhöhst du i um eins und löscht danach das 1. Control. Es gibt aber bereits ein neues 0. Controls, das du nun auslässt.

Entweder lässt du das erhöhen von i weg, oder durchäufst die Controls von Count-1 bis 0.
Delphi-Quellcode:
while Panel1.ControlCount > 0 do
  Panel1.Controls[0].Free;

Das Application.ProcessMessages sollte man vorsichtig einsetzen, denn es kann leicht zu einem ungewollten Programmablauf führen, wenn der Benutzer dazwischenfunkt.
  Mit Zitat antworten Zitat
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 13:10
Hi,

grmpf hab ich d*pp nicht dran gedacht
Vielen Dank für die aufschlusreiche Antwort!

greets,
ben
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#5

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 13:55
Hallo,

noch einen Tipp:

dies :

intI := intI + 1;

könntest du durch

Inc(intI);

ersetzen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 14:13
Zitat von Christian18:
Inc(intI);
Och, is garnicht so wichtig ... die Compileroptimierung macht sowas auch automatisch ... man kann also das nehmen, was einem am besten gefällt


Wenn man will geht ja och
intI := Succ(intI);
$2B or not $2B
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#7

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 14:23
Ja ok hast recht!

es ich eh geschmackssache. ich finde es immer besser wenn der Quellcode übersichtlich ist. Und die Übersichtlichkeit erreicht man meiner Meinung mach mit Funktionen wie diese.

Naja, wie schon gesagt ist geschmakssche. Aber das ich auf jeden Fall machen würde ist folgendes.

Delphi-Quellcode:
for i:=0 to 999 do
  begin

  end;
Dann braucht man auf gar keinen Fall Inc(zahl) oder zahl:=zahl + 1;



MFG Christian18
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#8

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 19:17
Wichtig ist auf jeden Fall, beim 'wegwuschen' der Inhalte irgendeiner Auflistung immer 'von hinten' vorzugehen, also mit for i:=pred(Count) downto 0 do (wie ja hier auch schon jemand schrob) - sonst passiert auch mit einer for-Schleife das gleiche, was jbg schon schilderte und noch zusätzlich garniert mit lustigen Zugriffsverletzungen bzw Exceptions ('überschreitet das Maximum der Liste') wenn man 'über die Hälfte' ist, da im Unterschied zur while-Schleife die Bedingung 'oben' nicht bei jedem Durchgang neu geprüft wird sondern stur bis zum dem pred(Count) durcheiert, der bei Eintritt in die Schleife mal aktuell war - was sie eben andererseits auch 'effektiver' macht als while-Schleifen mit eigenem inc().
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 20:08
Auch eine while-Schleife würde nichts ändern. Es wird zwar keine Exception ausgelöst, aber lediglich jedes zweite Item gelöscht.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#10

Re: Objekte zur Laufzeit erstellen und löschen

  Alt 12. Jul 2006, 21:25
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 - der Punkt war, 'von hinten' vorzugehen. Wenn man das macht, funktioniert's auch und sogar mit 'ner while-Schleife:

Delphi-Quellcode:
i := pred(Count);
while i >= 0 do
begin
  wuschweg(i);
  dec(i);
end;
Sie bleibt allerdings gegenüber der for-Schleife zweite Wahl weil wie gesagt ineffektiver - und auch noch mehr Schreibkram...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr.
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