AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Panele dynamisch erzeugen

Ein Thema von Kurt Wallander · begonnen am 13. Jan 2022 · letzter Beitrag vom 14. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2   
Kurt Wallander

Registriert seit: 11. Mai 2020
16 Beiträge
 
Delphi 10.4 Sydney
 
#1

Panele dynamisch erzeugen

  Alt 13. Jan 2022, 12:10
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:
      ...
      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;
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.
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

Geändert von Kurt Wallander (13. Jan 2022 um 12:14 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
398 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 12:37
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:
      ...
      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
Das ist ziemlich schrecklich .
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.
Peter Below
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.053 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 13:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
972 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 15:17
Einfachste Lösung: Als Parent das Formular nehmen und auf Top und Left des Panels jeweils Top und Left der Paintbox aufaddieren.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.198 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 15:28
Ja eine TPaintBox ist nicht dafür gedacht.
Vielleicht hat er TScrollbox gemeint und hat sich einfach nur vertippt. Aufklärung wäre hier sicherlich hilfreich.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.927 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 17:01
aktuell geht ja sogar auch sowas, als Ersatz für das grauenhafte WITH.

Delphi-Quellcode:
var P := TPanel.Create(Self);
L.Name := n_pnl;
L.Parent := paintbox1.Parent;
L.Left := ....
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Kurt Wallander

Registriert seit: 11. Mai 2020
16 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 19:30
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
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
398 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 20:15
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
Steht der Kode eventuell in einem Eventhandler? Wenn ja, für welchen Event?
Peter Below
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.638 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 20:18
.. gab es das GridPanel schon in 10.4 ?

Wäre vielleicht eine Alternative.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.927 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Panele dynamisch erzeugen

  Alt 13. Jan 2022, 21:14
früher
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf