Entwickler-Ecke

Sonstiges (Delphi) - 120 Panels in Groupbox brauchen das selbe onclick ereignis.


muetzenjoe - Sa 01.05.10 02:41
Titel: 120 Panels in Groupbox brauchen das selbe onclick ereignis.
Hi@all...

Ich habe in einer Groupbox eine anhäufung von genau 120 Panels. (12x10 Panels à 30x30pix)
Jetzt soll man jedes Panel anklicken können und die caption des Panels soll endweder leer oder X sein.(also '' oder 'X').

Jetzt stehe ich gerade auf dem Schlauch und möchte nicht 120 einzelne onclick ereignisse ala

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...
procedure TForm6.Panel1Click(Sender: TObject);
begin
  if panel1.caption='' then panel1.caption:='X' else panel1.caption:='';
end;

procedure TForm6.Panel2Click(Sender: TObject);
begin
  if panel2.caption='' then panel2.caption:='X' else panel2.caption:='';
end;
...

in den Code schreiben müssen. Könnte mir jemand kurz erklären wie ich das eventuell mit

Quelltext
1:
2:
3:
4:
5:
6:
7:
...
findcomponent('Panel'+sender) as TPanel 
...
oder
...
TPanel(Sender)
...

oder vielleicht noch etwas besserem machen könnte? Ich wäre wirklich dankbar!

MfG
muetzenjoe


elundril - Sa 01.05.10 02:52

Klick mal im Objektinspektor in das Feld neben dem OnClick steht und dann auf den Pfeil. Wenn du einmal nen OnClick-Eventhandler geschrieben hast, kannst du den dann da auswählen. Das heißt du schreibst für Panel1 etwas ins OnClick und die restlichen 119 bekommen mit der methode den gleichen Code.

lg elundril


muetzenjoe - Sa 01.05.10 02:57

Jo die Idee war schon recht gut aber(!) dann wird immer nur das erste Panel geändert und nicht das jeweils gedrückte!


elundril - Sa 01.05.10 03:17

Dann darfst du natürlich nicht Panel1.Caption := 'X'; schreiben sondern musst folgendes reinschreiben:


Delphi-Quelltext
1:
2:
if (Sender is TPanel) then
  (Sender as TPanel).Caption := 'X';


so sollte es dann funktionieren. ;) Eigentlich hatte ich ja gehofft keine CopyPasta servieren zu müssen.

lg elundril


muetzenjoe - Sa 01.05.10 03:33

Das funktioniert wirklich schon fast aber es kommt wieder ein aber(!) *g

Ich hatte es ja so, dass erst geprüft wird ob das caption leer oder X ist:

Quelltext
1:
if panel1.caption='' then panel1.caption:='X' else panel1.caption:='';                    

Nun habe ich, unwissend wie ich ja nun einmal bin, versucht folgendes aus deinem Vorschlag zu machen:

Quelltext
1:
2:
if (Sender is TPanel).caption='' then (Sender as TPanel).Caption := 'X' else
if (Sender is TPanel).caption='X' then (Sender as TPanel).Caption := '';


Kann auch an mir liegen aber ich schiebe es einfach mal auf die Uhrzeit *schäm


elundril - Sa 01.05.10 03:41

Uiuiui, das (Sender is TPanel) bedeutet ja nix anderes als das du überprüfst ob der Sender eine Instanz vom der Klasse TPanel ist. Wenn du dann auf die Eigenschaften und Methoden des Panels zugreifen willst musst du den Sender auf ein TPanel casten, was du mit dem (Sender as TPanel) machst. ;)

ich würd das ganze ja so aufbauen: da du nur 2 zustände hast brauchst du die zweite if-abfrage ja eigentlich nicht. Deswegen kommt dann gekürzt folgendes raus:


Delphi-Quelltext
1:
2:
3:
4:
5:
  if (Sender is TPanel) then begin
    if (Sender as TPanel).Caption = '' then
      (Sender as TPanel).Caption := 'X'
    else (Sender as TPanel).Caption := '';
  end;


Einwandfreie Ausführung des Codes wurden durch Tierversuche bestätigt. Bei diesen Versuchen kamen keine Tiere zu schaden. ;)

lg elundril


muetzenjoe - Sa 01.05.10 03:57

Super!

Vielen Dank für deine Mühe und Gedult zu solch später Stunde!

Jetzt klappt es einwandfrei!

Thx


Boldar - Sa 01.05.10 15:04

120 fest erstellte Panells sind aber ein dicker Konzeptfehler.
Erstelle die Panels doch einfach dynamisch, dann hast du auch viel weniger Arbeit.