Delphi : zur Laufzeit Komponenten entfer

habe mit folgendem source : . . .

procedure TFieldsForm.FormActivate(Sender: TObject);
var i :integer;
begin
for i:=1 to Form1.SpinEdit1.Value do
begin
with TSpinEdit.Create(Self) do
begin
name := ‚nEdit‘+IntToStr(i);
left := 5;
top := 50 * i;
width := 40;
maxValue := 15;
minValue := 2;
value := 2;
parent := self;
end;//with}
with TStringGrid.Create(Self) do
begin
name := ‚StrGrid‘+IntToStr(i);
left := 50;
top := 50 * i;
width := 100;
height := 40;
visible := true;
colcount := 1;
rowcount := 2;
DefaultColWidth := 40;
DefaultRowHeight := 15;
enabled := true;
parent := self;
end;//with}
end;//for
end;//procedure

. . . eine zur entwurfszeit unbekannte anzahl von komponenten erzeugt.
wie kann ich diese zur laufzeit wieder entfernen ?
Das Problem : erzeuge ich z.B. 3 dieser komponenten zur laufzeit, und rufe die(das) form noch einmal auf, bekomme ich eine fehlermeldung : „komponente schon vorhanden“.

Vielleicht geht das auch, mit einer abfrage, welche komponenten schon vorhanden sind, und ich erzeuge nur die , die noch nicht da sind, aber wenn ich beim zweiten mal weniger haben moechte ist das schon bloed?

bitte helft mir!

Vielen Dank

cu kf

habe mit folgendem source : . . .
. . . eine zur entwurfszeit unbekannte
anzahl von komponenten erzeugt.

Ich glaube es wäre bedeutend einfacher, diese Komponenten in einem offenen Array zu verwalten, wenn du Delphi 4+ hast.
Sehen wieviele, dass da sind, könntest du dann mit den normalen Array-Funktionen.

wie kann ich diese zur laufzeit wieder
entfernen ?

Den Deconstructor „Free“ aufrufen.
xxxx.Free;

Das Problem : erzeuge ich z.B. 3 dieser
komponenten zur laufzeit, und rufe
die(das) form noch einmal auf, bekomme
ich eine fehlermeldung : „komponente
schon vorhanden“.

Vielleicht geht das auch, mit einer
abfrage, welche komponenten schon
vorhanden sind, und ich erzeuge nur die ,
die noch nicht da sind, aber wenn ich
beim zweiten mal weniger haben moechte
ist das schon bloed?

Dann löschst zu überflüssige. Prüfen ob sie da sind geht mit Assigned (gibt Boolean-Wertr zurück)

bitte helft mir!

Vielen Dank

cu kf

Den Deconstructor „Free“ aufrufen.
xxxx.Free;

-> danke.
-> aber das mit dem free funktioniert ja nur, wenn mir der name der komponente bekannt ist.
-> aber selbst wenn er mir zur entwurfszeit bekannt ist, kennt der compiler den namen nicht.

bitte hilf mir weiter, das prg muss in zwei wochen stehn.

danke

Den Deconstructor „Free“ aufrufen.
xxxx.Free;

-> danke.
-> aber das mit dem free funktioniert
ja nur, wenn mir der name der komponente
bekannt ist.

Mach’s entweder mit nem Array oder mit dem
Name-Property oder mit FindComponent

Hallo Kay!

Die einfachste Lösung, die auch sehr gut funktioniert, ist
meiner Meinung nach, ein TList-Objekt für die Speicherung
der Objekte zu verwenden (dazu isses nämlich unter anderem
gedacht!). Dann stellt sich auch das von Dir angesprochene
Namens-Problem (Compiler kann den Namen eines erst zur
Laufzeit erzeugten Objektes nicht kennen) nicht.

Ein TList-Objekt tritt als Array in Erscheinung - das
„Handling“ ist also super-einfach. Eine weitere angenehme
Eigenschaft ist, daß es sich um ein Variable-Size-Array
handelt, dessen Kapazität automatisch der Datenmenge, die
Du drin speichern willst, anpaßt wird.

In dem Test-Programm, das ich Dir per E-Mail geschickt hab,
ist diese Lösung realisiert. Sieh Dir doch mal den Quellcode
an; dann verstehst Du sofort, wie das mit der Liste geht.

Ungeachtet dessen aber noch ein Gedanke: Solange es nicht
S E H R viele Objekte sind, glaube ich, ist es durchaus
erlaubt (ohne Speicherknappheitsprobleme oder dergleichen
befürchten zu müssen), die Objekte einfach alle zur Ent-
wurfszeit anzulegen und die, die gerade nicht gebraucht
werden, abzuschalten (mit „Visible := FALSE“). Bei 172
Objekten auf einem Formular ist die dynamische Erzeugung
aber dann natürlich doch besser. :wink:

Ich hoffe, ich konnte Dir helfen.

Gruß
Martin