Delphi-PRAXiS

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.

DeddyH 16. Apr 2015 18:50

AW: TPanel zur Laufzeit anlegen und löschen
 
Es geht ja nicht nur um die Länge, statische Arrays können ja durchaus mit einem Index <> 0 beginnen.

BadenPower 16. Apr 2015 18:50

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

Zitat von Helmi (Beitrag 1298040)
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

Wobei Dein Code-Beispiel mit statischen Arrays sowieso nicht funktionieren würde.

Dann kannst Du auch gleich bei
Delphi-Quellcode:
Length(Array) - 1
bleiben, da ein dynamisches Array immer bei 0 beginnt und der letzte Index immer Length-1 ist.

DeddyH 16. Apr 2015 18:53

AW: TPanel zur Laufzeit anlegen und löschen
 
Hier wiederhole ich mich gern (http://www.delphipraxis.net/1297845-post13.html):
Zitat:

Ich persönlich habe mir angewöhnt, stets die Varianten zu nehmen, die immer funktionieren. Neben den Ressourcenschutzblöcken sind das Dinge wie z.B. Arrays immer von Low() bis High() zu durchlaufen. Das hat den Vorteil, dass ich mir um solche Dinge wie "Kann das überhaupt im Konstruktor knallen bei dieser Klasse?" überhaupt keinen Kopf machen muss, sondern immer einen einheitlichen Stil verfolgen kann.

Helmi 16. Apr 2015 18:55

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

Zitat von BadenPower (Beitrag 1298050)
Wobei Dein Code-Beispiel mit statischen Arrays sowieso nicht funktionieren würde.

Dann kannst Du auch gleich bei
Delphi-Quellcode:
Length(Array) - 1
bleiben, da ein dynamisches Array immer bei 0 beginnt und der letzte Index immer Length-1 ist.

warum sollte das bei statischen Arrays nicht funktionieren?

DeddyH 16. Apr 2015 18:58

AW: TPanel zur Laufzeit anlegen und löschen
 
Sagen wir lieber: nicht immer. Ein statisches Array mit Startindex 0 sollte keine Probleme bereiten.

Helmi 16. Apr 2015 19:01

AW: TPanel zur Laufzeit anlegen und löschen
 
aber auch ein statisches Array mit Startindex <> 0 dürfte problemlos damit funktionieren
jedenfalls fällt mir auf die Schnelle kein Fall ein, wo das nicht so sein sollte

DeddyH 16. Apr 2015 19:02

AW: TPanel zur Laufzeit anlegen und löschen
 
*Äh* das bezog sich ja nicht auf Deinen Code, sondern auf das 0 bis Length - 1, sofern ich das richtig verstanden habe.

[edit] Achnee, BadenPower hat ja Dich zitiert. Dann würde mich aber auch mal ein Fall interessieren, wo das nicht funktionieren soll. [/edit]

BadenPower 16. Apr 2015 19:02

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

Zitat von Helmi (Beitrag 1298053)
warum sollte das bei statischen Arrays nicht funktionieren?

Hast Du einmal probiert ein statisches zur Laufzeit Array in der Größe zu verändern?

Delphi-Quellcode:
SetLength(StatischesArray,100);
funktioniert nicht.

Helmi 16. Apr 2015 19:05

AW: TPanel zur Laufzeit anlegen und löschen
 
schon klar - aber das ist noch keine Erklärung warum low und high bei einem statischen Array nicht funktionieren sollte

DeddyH 16. Apr 2015 19:05

AW: TPanel zur Laufzeit anlegen und löschen
 
Darum ging es aber doch auch gar nicht, sondern um die Indizes der Laufvariablen.

BadenPower 16. Apr 2015 19:08

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

Zitat von Helmi (Beitrag 1298058)
schon klar - aber das ist noch keine Erklärung warum low und high bei einem statischen Array nicht funktionieren sollte

Das habe ich auch nicht behauptet und nicht geschrieben.


Ich hatte geschrieben, dass Dein Code-Beispiel mit statischen Arrays nicht funktionieren würde und deshalb getrost auf die Verwendung von Low und High verzichtet werden kann.

Helmi 16. Apr 2015 19:10

AW: TPanel zur Laufzeit anlegen und löschen
 
ah so ok - sorry - missverstanden

DeddyH 16. Apr 2015 19:11

AW: TPanel zur Laufzeit anlegen und löschen
 
Wozu soll man sich Gedanken machen (müssen), ob es sich um ein statisches, dynamisches oder offenes Array handelt und wie deren Indizes aussehen?

BadenPower 16. Apr 2015 19:12

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

Zitat von Helmi (Beitrag 1298063)
ah so ok - sorry - missverstanden

Kein Problem.

Nur wenn man miteinander redet, dann kann man Mißverständisse erkennen und beseitigen.


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