Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TPanel zur Laufzeit anlegen und löschen (https://www.delphipraxis.net/184717-tpanel-zur-laufzeit-anlegen-und-loeschen.html)

khh 16. Apr 2015 14:38

Delphi-Version: 5

TPanel zur Laufzeit anlegen und löschen
 
Hallo zusammen,
ich erzeuge im oncreate oder im on show des Form in einer Schleife mehrere Panels mit diversen Beschriftungen.
Das klappt auch so.
Jetz möchte ich aber auf "Knopfdruck" heisst auf Buttonklick diese Panels löschen und dafür andere Panels(mit Beschriftung) erzeugen.

Ein myCustomPanel.free; löscht mir nur den zuletzt erzeugten Panel.

Wie funktioniert das richtig?

Danke gruss KH

DeddyH 16. Apr 2015 14:39

AW: TPanel zur Laufzeit anlegen und löschen
 
Pack sie in ein Array oder eine TObjectList/TComponentList.

Nersgatt 16. Apr 2015 14:39

AW: TPanel zur Laufzeit anlegen und löschen
 
Merk Dir die Instanzen der Panels beim Erstellen z.B. in einer TObjectList. Dann kannst Du die zum freigeben einfach durchgehen.

Sir Rufo 16. Apr 2015 14:43

AW: TPanel zur Laufzeit anlegen und löschen
 
Oder man nimmt eine Delphi-Referenz durchsuchenTComponent-Instanz als Owner, die man dann einfach freigibt.

Delphi-Quellcode:
TMyForm = class( TForm )
private
  FPanelAncestor : TComponent;
  procedure BuildPanels;
end;

procedure TMyForm.BuildPanels;
var
  LPanel : TPanel;
begin
  FreeAndNil( FPanelAncestor );
  FPanelAncestor := TComponent.Create( Self );
 
  LPanel := TPanel.Create( FPanelAncestor );
  LPanel.Parent := Self;
  ...
end;

milos 16. Apr 2015 14:47

AW: TPanel zur Laufzeit anlegen und löschen
 
Hab das bisher immer so gelöst, dass ich die Komponente in eine Liste gepackt habe. Da du Delphi 5 verwendest wirst du wohl Arrays benutzen müssen:

Delphi-Quellcode:
// Deklarationen
Panels : array of TPanel;

// Funktionen
procedure TForm1.btn1Click(Sender: TObject);
var
  LPanel : TPanel;
  c : integer;
begin
  SetLength(Panels,10);
  for c := 0 to 9 do
  begin
    LPanel := TPanel.Create(self);
    LPanel.Parent := self;
    LPanel.Height := 15;
    LPanel.Width := 100;
    LPanel.Top := c * 20;
    LPanel.Caption := 'Panel #' + IntToStr(c);
    Panels[c] := LPanel;
  end;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  LPanel : TPanel;
  c : integer;
begin
  for c := 0 to Length(Panels)-1 do
  begin
    Panels[c].free;
  end;
  SetLength(Panels,0);
end;

Dalai 16. Apr 2015 15:10

AW: TPanel zur Laufzeit anlegen und löschen
 
Zitat:

Zitat von milos (Beitrag 1298020)
Hab das bisher immer so gelöst, dass ich die Komponente in eine Liste gepackt habe. Da du Delphi 5 verwendest wirst du wohl Arrays benutzen müssen:

TList und TObjectList gibt's auch schon im Delphi 5. Und generische Listen sind hierfür ja nicht unbedingt notwendig.

MfG Dalai

milos 16. Apr 2015 15:14

AW: TPanel zur Laufzeit anlegen und löschen
 
Zitat:

Zitat von Dalai (Beitrag 1298022)
TList und TObjectList gibt's auch schon im Delphi 5. Und generische Listen sind hierfür ja nicht unbedingt notwendig.

MfG Dalai

Ach was und ich hatte nie das Glück das raus zu finden? :D
Hab mich immer schön mit Arrays rumgeschlagen :freak:

khh 16. Apr 2015 15:16

AW: TPanel zur Laufzeit anlegen und löschen
 
ich danke euch

Helmi 16. Apr 2015 17:55

AW: TPanel zur Laufzeit anlegen und löschen
 
mit "low" und "high" ist man auf der sichereren Seite, wenn sich das Array von der Anzahl der Elemente ändert:

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
   LPanel : TPanel;
   c : integer;
begin
   SetLength(Panels,10);
   for low(Panels) to high(Panels) do //<--
   begin
{ ...}
Wobei natürlich
Delphi-Quellcode:
low(Panels)
bei dynamischen Arrays auch durch eine 0 ersetzt werden kann

milos 16. Apr 2015 18:47

AW: TPanel zur Laufzeit anlegen und löschen
 
Zitat:

Zitat von Helmi (Beitrag 1298040)
mit "low" und "high" ist man auf der sichereren Seite, wenn sich das Array von der Anzahl der Elemente ändert:

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
   LPanel : TPanel;
   c : integer;
begin
   SetLength(Panels,10);
   for low(Panels) to high(Panels) do //<--
   begin
{ ...}
Wobei natürlich
Delphi-Quellcode:
low(Panels)
bei dynamischen Arrays auch durch eine 0 ersetzt werden kann

Stimmt, habe ich bisher noch nicht beachtet, habe jedoch auch immer geachtet, dass keine Fehler auftauchen sollten.
Werde ich in Zukunft jedoch so machen, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Seite 1 von 3  1 23      

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