![]() |
Panele dynamisch erzeugen
Hi Delphianer,
auf einer Form habe ich eine Paintbox als Container platziert. Auf dieser Paintbox möchte ich nun dynamisch insgesamt 81 Panele erzeugen und benutze folgenden Code:
Delphi-Quellcode:
Mein Problem: Left, top, height und with sind nicht die Position des erzeugten Panels, sondern die Position/Größe des Formulars. Die Panele sollen Child-Kompnenten der Paintbox werden. Was schreibe ich bei Parent ein? Paintbox1 geht nicht, das self funktioniert auch nicht.
...
j:=1;i:=1; // while j= 1 do begin // while i= 1 do begin n_pnl:='Feld'+IntToStr(i)+IntToStr(j)+'_pnl'; TPanel.Create(Self).Name := n_pnl; with TPanel(FindComponent(n_pnl)) do begin Left := left_M+(i-1)*sw+1; Top := top_m+(j-1)*sw+1; height:=sw-2; width:=sw-2; Parent := self; color:=clSilver; visible:=true; Caption:=n_pnl; end; // Inc(i); end; // Inc(j); end; end; end; Die Schleifen sind im obigen Beispiel als Test für 1 Panel eingestellt. Sowohl j als auch i müßten eigentlich von 1 bis 9 laufen, also (while j<=9). Egal, ob ich for, while oder repeat benutze, das Programm arbeitet die Schleifen unendlich mal ab. Ich bekomme dann die Fehlermeldung: Feld11_pnl existiert bereits. Im Debug-Modus springt der Ausführungs-Punkt beim Erreichen des Parent-Befehls, unabhängig ob ich self oder Form1 wähle, zum Haltepunkt (= erster Befehl des dargestellten Snippets) zurück und will ab da den Code wiederholen. Der Color-Befehl wird nicht erreicht. Wo liegt mein Denkfehler? Kurt Wallander |
AW: Panele dynamisch erzeugen
Zitat:
Füge in der Methode eine lokale Variable hinzu:
Delphi-Quellcode:
LPanel: TPanel;
... LPanel := TPanel.Create(Self); LPanel.Name := n_pnl; LPanel.Parent := paintbox1.Parent; LPanel.Left := .... etc. LPanel.BringToFront; Eine TPaintbox (VCL) ist kein TWinControl und kann daher nicht als Container für andere Controls dienen. Verwende auf keinen Fall ein With-Statement, das ist pures Gift in Code mit tief gestaffelten Scopes. With ist ein altes Erbe aus Turbo-Pascal Zeiten, wo es nur auf Records angewendet werden konnte und ein Hinweis für eine Optimierung für den Compiler lieferte. Heute schadet es weit mehr als das es nutzt, vergiss es einfach. |
AW: Panele dynamisch erzeugen
Ja eine TPaintBox ist nicht dafür gedacht. Wieso nimmst Du diese? Was willst Du denn ausser die Panele noch da drauf haben?
Statt der TPaintBox könntest Du ein TPanel nehmen und dort Deine TPaintBox und die anderen Panels plazieren. Natrag: weise Parent als letztes zu. |
AW: Panele dynamisch erzeugen
Einfachste Lösung: Als Parent das Formular nehmen und auf Top und Left des Panels jeweils Top und Left der Paintbox aufaddieren.
|
AW: Panele dynamisch erzeugen
Zitat:
|
AW: Panele dynamisch erzeugen
aktuell geht ja sogar auch sowas, als Ersatz für das grauenhafte WITH. :stupid:
Delphi-Quellcode:
var P := TPanel.Create(Self);
L.Name := n_pnl; L.Parent := paintbox1.Parent; L.Left := .... |
AW: Panele dynamisch erzeugen
huch, so viele Reaktionen!
Mehrheitlich lehnt man das with als Gift ab, habe also das Programm entgiftet. PaintBox brauche ich, um zwischen den Panelen Trennungslinien zu zeichnen. Mir ist nur Paintbox eingefallen, weil es ein Canvas hat. Das ganze soll ein Sodoku-Helper werden. Im Snippet sind i und j lokale intergers, n_pnl ein String. Left_m und top_m sind global definiert in einer Unit Globals und beschreiben die Position von der Paintbox (beide sind gleich 25) und sw ist die Schrittweite zwischen den Trennlinien (aktuell 95). In der Test-Version wird dieser Code genau 1-mal durchlaufe - so meine Idee. aber in der Realität weitere Male. Beim Debuggen kann ich sehen, daß der Rücksprung an den Anfang des Programmauschnittes beim Erreichen der Parent-Anweisung passiert. Parent ist irgendwie nicht koscher. Allen für ihren Tipp vielen Dank Kurt |
AW: Panele dynamisch erzeugen
Zitat:
|
AW: Panele dynamisch erzeugen
.. gab es das GridPanel schon in 10.4 ?
Wäre vielleicht eine Alternative. Grüße Klaus |
AW: Panele dynamisch erzeugen
früher
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz