Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte löschen (https://www.delphipraxis.net/12566-objekte-loeschen.html)

devnull 29. Nov 2003 22:43


Objekte löschen
 
Hi,

ich hab während der Laufzeit eines Programms Buttons auf einem OKBottom-Dialog erstellt.

:?: Wie kann ich jetzt, wenn ich den Dialog zu einem späteren Zeitpunkt öffne, die vorh. Buttons löschen ??????????
(am besten gleich während FormCreate des Dialogs)


devnull

Basic-Master 29. Nov 2003 23:35

Re: Objekte löschen
 
du kannst das ganze per findcomponent oder mit den components des form machen:so kannste das mit
findcomponent machen:
Delphi-Quellcode:
Self.FindComponent('deinButton').Free;

devnull 30. Nov 2003 11:15

Re: Objekte löschen
 
Ich weis aber nicht wie diese Buttons heißen und ich wollte wissen, ob man nicht einfach eine komplette Form (hier halt den Dialog) mitsamt Buttons... löachen kann


devnull

devnull 30. Nov 2003 11:25

Re: Objekte löschen
 
Also, ich habs probiert mit

Delphi-Quellcode:
   Self.FindComponent('deinButton').Free;
:gruebel: "Self" geht nicht .... Muss man da irgenwas bestimmtes vorher machen ?

devnull

mirage228 30. Nov 2003 11:30

Re: Objekte löschen
 
Delphi-Quellcode:
  Form.FindComponent('<name>').Free;
  // "Form" ist das Form, wo sich der Button befindet.
mfG
mirage228

Basic-Master 30. Nov 2003 11:32

Re: Objekte löschen
 
ich bin jetzt davon ausgegangen, dass der code im form war.. probiers so:
Delphi-Quellcode:
Form.FindComponent('deinbutton').Free;
du kannst das ganze aber auch per deinform.components machen...

devnull 30. Nov 2003 11:32

Re: Objekte löschen
 
Wie Recht du doch hattest :oops:

Touchdown 30. Nov 2003 11:38

Re: Objekte löschen
 
Wenn du als Owner des Buttons das Formular angibst, wird der Button auch aus dem Speicher gehauen, wenn dass Formular gefreet wird!

devnull 30. Nov 2003 11:44

Re: Objekte löschen
 
Das Problem was jetzt immer noch da is, is dass die Buttons immer noch auf der Form sind ...

Basic-Master 30. Nov 2003 14:23

Re: Objekte löschen
 
wie erstellst du denn deine buttons?

devnull 30. Nov 2003 15:03

Re: Objekte löschen
 
Delphi-Quellcode:
procedure TOkBottomDlg.Neues_Button_erstellen (x, y, h, w : integer; const name : string);
var NewButton: {TSpeed}TButton;
    i : integer;
    str1b : string;
begin
  NewButton := TButton.Create(OkBottomDlg.Bevel1);
  // Eigenschaften des neuen Buttons festlegen:
  with NewButton do begin
    Parent := OkBottomDlg;
    Caption := name;
    Top := y;
    Left := x+25;
    Height := h;
    Width := w;
    @NewButton.OnClick := @MeinEigenesOnClick;
  end;
  inc (buttons_anzahl);
  if buttons_anzahl <= 20 then buttons_names [buttons_anzahl] := name;
end;
Die Proze wird aber aus einer anderen Unit ausgeführt (Form1) und in OKBottomDlg ausgeführt ...

Zum löschen:

Delphi-Quellcode:
procedure Buttons_loeschen;
var i : integer;
    NewButton: TButton;
begin
  for i := 1 to Buttons_Anzahl do begin
      try
        OKBottomDlg.FindComponent(Buttons_names[i]).Free;
      except
      end;
  end;
end;
Die Proze rufe ich auf, bevor OKBottomDlg geschlossen wird (OKBottomDlg.Close);
:angle2: Auch wenns nich so toll sein sollte ...

Ich weis nich, worans liegt

devnull

Basic-Master 30. Nov 2003 15:10

Re: Objekte löschen
 
versuch den code zum erstellen:
Delphi-Quellcode:
procedure TOkBottomDlg.Neues_Button_erstellen (x, y, h, w : integer; const name : string);
var NewButton: {TSpeed}TButton;
    i : integer;
    str1b : string;
begin
  NewButton := TButton.Create(OkBottomDlg.Bevel1);
  // Eigenschaften des neuen Buttons festlegen:
  with NewButton do begin
    Parent := OkBottomDlg;´
    inc(buttons_anzahl);
    Name := 'NeuesButton' + IntToStr(buttons_anzahl);
    Caption := name;
    Top := y;
    Left := x+25;
    Height := h;
    Width := w;
    @NewButton.OnClick := @MeinEigenesOnClick;
  end;
  if buttons_anzahl <= 20 then buttons_names [buttons_anzahl] := name;
end;
und den zum löschen:
Delphi-Quellcode:
var i:integer;
begin
for i := 0 to button_anzahl do //du hast doch button_anzahl global deklariert oder?
  OkBottomDlg.FindComponent('NeuesButton' + inttostr(i)).Free;
end;
habs jetzt nicht getestet, sollte aber funzen...

devnull 30. Nov 2003 17:48

Re: Objekte löschen
 
Also das geht trotzdem nicht. Ich muss nach dem Löschen ja die button_anzahl := 0; setzen (is übrigens global).
Wenn ich dann aber wieder neue Buttons erstellen möchte und wieder bei button_anzahl := 1; anfange, kommt ein Fehler: NeuesButton1 existiert bereits

devnull 3. Dez 2003 20:19

Re: Objekte löschen
 
Kann mir keiner sagen, wie ich eine Form komplett 'auflösen' kann, d.h. sie in den Zustand zurückversetzen, in welchem sie erstellt wurde ?


:gruebel: devnull

Stanlay Hanks 3. Dez 2003 20:39

Re: Objekte löschen
 
Hi.

Das ganze Form mit

Delphi-Quellcode:
Form.Free;
Die ganzen Komponenten eines Forms, ohne das Form selber mit

Delphi-Quellcode:
Form.DestroyComponents;
Man liest sich, Stanlay :hi:

devnull 3. Dez 2003 20:47

Re: Objekte löschen
 
Ich hab das mit
Delphi-Quellcode:
Form.DestroyComponents;
probiert, wenn ich jetzt aber nun auf die Form Buttons erstellen möchte, kommt ein Fehler ...

devnull

devnull 3. Dez 2003 21:10

Re: Objekte löschen
 
Ahh, :oops: Schande über mich. Natürlich gehts ! Ich hatte vergessen, ein Bevel neu zu erstellen, da ich in diesem Buttons erstelle !!!

:oops: devnull

maximov 4. Dez 2003 13:42

Re: Objekte löschen
 
Hi,

wenn du alles resetten willst und anschliessend dir das formular wieder mit den DFM daten initialisieren willst, dann kannst du folgendes tun:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin  
   RemoveComponent(TComponent(Sender)); // wichtig weil sonst der button gelöscht wird, den man drückt...was dann eine accessViolation auslöst

   DestroyComponents;

   if not InitComponentRes(self.ClassName, Self) then ShowMessage('failed'); // DFM init aus den resourcen

   TComponent(Sender).FreeOnRelease; // wird nicht mehr benötigt -> 'soft kill'
end;
mfg. maximob


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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