Delphi : zur Laufzeit Komponenten entfer

Von: , Frage gestellt am Di, 28. Sep 1999

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

4 Antworten zu dieser Frage

  1. Antwort von nach 3 Stunden hilfreich
    Re: Delphi : zur Laufzeit Komponenten entfer

    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

    • Antwort von nach 3 Stunden hilfreich
      Re^2: Delphi : zur Laufzeit Komponenten entfer

      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

      • Antwort von nach 7 Stunden hilfreich
        Re^3: Delphi : zur Laufzeit Komponenten entfer

        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

      • Antwort von nach 10 Stunden hilfreich
        Re^3: Delphi : zur Laufzeit Komponenten entfer

        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. ;-)

        Ich hoffe, ich konnte Dir helfen.

        Gruß
        Martin

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!