![]() |
Indiziert auf Panels zugreifen
Hallo zusammen,
bin blutige Anfängerin also bitte um Rücksicht :cat: ich habe 400 kleine Panels in meinem Programm. Alle sollen per Click ihre Farbe ändern. Nun habe ich keine Lust, 400 OnClick Ereignisse zu schreiben. Wie würde das am einfachsten gehen? Ich habe mir gedacht, dass ale 400 Panels per onClick Ereignis in eine gleiche procedure laufen und dann per TPanel(Components[i]).Color:= CLBlack; ihre Farbe ändern, da jedes Panel einen anderen TAG hat. Aber wie kann ich unterscheiden, welches Panel gedrückt wurde, also welches i vorliegt? :gruebel: |
Re: Indiziert auf Panels zugreifen
Du kannst auch mehreren Panels, die selbe OnClick-Prozedur zuweißen und dann die Änderungen mit dem Sender Parameter vornehmen. Wenn du jetzt keine Lust hast 400 mal, den Namen dieser Prozedur in deine (hoffentlich nicht alle manuell erstellten?) einzutragen, dann kannst du OnCklick ebenfalls zu Beginn zur Laufzeit zuweißen.
Delphi-Quellcode:
Panel.OnClick:= DeineMethode; //Deine Methode, muss hier wirklich eine Methode (des Forms) sein
|
Re: Indiziert auf Panels zugreifen
Verstehe leider nicht was Du meinst :roll:
Kannst Du mir ein Beispiel zeigen mit dem Sender Parameter ? Die 400 Panels wollte ich schon selber ziehen, da sie alle die gleiche Größe haben ... einfach per Copy/Paste Funktion ... Aber ich bin ganz offen ... wie geht das manuel? |
Re: Indiziert auf Panels zugreifen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal schnell ein kleines Beispiel zusammengetippt, solche Sachen wie das Verhalten, falls die Formgröße angepasst wird oder an welcher Seite die Panels sich dabei orientieren, könnte man dann ebenfalls noch hinzufügen (Anchors, etc.). Grundsätzlich lassen sich alle Eigenschaften der Standardcontrols auch zur Laufzeit setzen.
Ich denke das Beispiel ist ganz überschaubar, aber sollten Fragen bleiben, stell sie ruhig. |
Re: Indiziert auf Panels zugreifen
Zitat:
Das ist eine rechteckige Zeichenfläche das viele Rechtecke (z.B. 20 * 20) enthält, wobei jedes Unterrechteck einen beliebigen Inhalt anzeigen kann. Damit kann man z.B. solche Dinge wie Schachbrett (mit Figuren), Memoryspiel, ... umsetzen. |
Re: Indiziert auf Panels zugreifen
Das (oder manuell auf eine PaintBox zeichnen) ist natürlich besser, wenn es darum geht, viele kleine Symbole in einer Tabelle darzustellen und nicht zwingend für alles ein eigenes Control (mit Handle und Ereignissen) benötigt wird.
Dann müsste man allerdings selbst berechnen, wo ein Klick hingeht und kann nicht direkt Ereignisse zur Lösung benutzen, sondern man muss erst noch über die Clickkoordinaten berechnen, was den nun getroffen wurde (was auch nicht viel schwerer ist). Kommt auf den Anwendungszweck an. |
Re: Indiziert auf Panels zugreifen
Vielen Dank für die vielen Ratschläge,
das TDrawGrid sieht nicht schlecht aus, kannte ich bisher nicht werde ich mir aber noch einmal anschauen ... ich denke damit wird es gehen :thumb: @Cyf Verstehe wie Dein Programm gemeint ist. Leider prangert er bei mir das const über nPanels = 9; an und sagt er würde ein end erwarten :wall: |
Re: Indiziert auf Panels zugreifen
Ich habe den Code mal umgeschrieben weil der irgendwie die Deklaration mit den Globalen Vairablen nicht mochte ... keine Ahnung ob das jetzt so erlaubt ist wie ich es mache, bin eben kein Programmierer ... aber es klappt :oops:
Delphi-Quellcode:
unit main;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure OnPanelClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; const nPanels = 9; var Form1: TForm1; FPanels: array[0..nPanels-1] of TPanel; implementation {$R *.DFM} //****************************************************************************** procedure TForm1.FormCreate(Sender: TObject); const PanelsPerRow = 3; PanelsPerCol = 3; var i, j: Cardinal; Top, Left, Height, Width: Cardinal; begin Top:= 0; Left:= 0; Height:= Self.ClientHeight div PanelsPerCol; Width:= Self.ClientWidth div PanelsPerRow; for i := 0 to PanelsPerCol-1 do begin for j := 0 to PanelsPerRow - 1 do begin FPanels[i]:= TPanel.Create(Self); //Formular ist Owner //hier das Control, das den Panel enthält (hier auch das Formular) FPanels[i].Parent:= Self; FPanels[i].OnClick:= OnPanelClick; FPanels[i].Top:= Top; FPanels[i].Left:= Left; FPanels[i].Height:= Height; FPanels[i].Width:= Width; FPanels[i].Color:= clBlue; Left:= Left + Width; end; Top:= Top + Height; Left:= 0; end; end; procedure TForm1.OnPanelClick(Sender: TObject); begin //Farbe invertieren TPanel(Sender).Color:= TPanel(Sender).Color xor clWhite; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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-2025 by Thomas Breitkreuz