Autor Beitrag
Jetro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Di 04.03.03 21:10 
Hallo, ich habe ein kleines Problem. Und zwar:

Ich erzeuge zur Laufzeit x Panels und möchte jedes Panel auf das OnClick Ereignis reagieren lassen. Also hier mal kurz der Code (gekürzt):

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  With Panel Do
              Begin
                Parent := Form_Level;
                Name := 'Stein'+IntToStr(j)+IntToStr(i);
                Height := 20;
                Width := 50;
                Left := coords.h[j];
                Top := coords.v[i];
                caption := name;
                OnClick := Test(Panel.Name); <-- hier hakts
              End;


So, ich versuche also dem OnClick Ereignis eine Prozedur zuzuweisen und dieser auch gleich den Namen des Panels zu übergeben. (eigentlich ist OnClick ja TNotifyEvent)

Der Sinn und Zweck des Ganzen soll sein, das sich das Panel auflöst wenn man daraufklickt. Da dachte ich mit...

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure test(PanelName : String);
var
  Panel : TPanel;
Begin
  If FindComponent(PanelName) <> Nil Then
    Panel := FindComponent(PanelName);
    Panel.Free;
End;


Also: erste Frage: Wie kann ich es erreichen dem OnClick Ereignis der zur Laufzeit erzeugten Panels eine Prozedur zuzuweisen oder wie erreiche ich etwas ähnliches.

Würde meine procedure Test so eigentliche funktionieren. Sie würde ja sozusagen veranlassen, das sich ein Panel "selbst" zerstört. Geht das?

Also ich würde mich über Hilfe sehr freuen.

Mfg

Jetro
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: Di 04.03.03 21:21 
Die OnClick Prozedure eines Panel heißt doch
ausblenden Quelltext
1:
procedure PanelOnClick(Sender: TObject);					

Wenn du diesem Event nun eine Prozedur zuweist, muss diese natürlich die gleichen Parameter erwarten, also:
ausblenden Quelltext
1:
2:
3:
4:
procedure test(Sender: TObject); 
Begin //Der nächste Teil muss dann wie folgt umgeschrieben werden:
     (Sender as TPanel).Free; 
End;

Dabei musst du keine Abfrage starten ob es das Panel gibt, denn wes es nicht vorhanden ist, kann man es auch nicht anklicken (logisch, oder :wink: ).

Beim Erstellen des Panels dann einfach:
ausblenden Quelltext
1:
Panel.OnClick := test;					


So, das war´s. Eigentlich einfach, stimmts?

mfg
GSE

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
FD-83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Di 04.03.03 21:24 
[edit]OKOK ich bin zu spät :)...naja pech[/edit]

Die Ereignisprozedur muss vom Typ TNotifyEvent sein! Da is nix zu rütteln, aber das ist garkein Problem! Im Gegenteil!

Eine TNotifyEvent Proc. sieht so aus:

ausblenden Quelltext
1:
2:
3:
procedure PanelKlick(Sender: TObject);
begin
end;


Als Sender bekommst du gleich das Panel auf das Geklickt wurde übergeben. Du Musst nurnoch Free aufrufen:

ausblenden Quelltext
1:
2:
3:
4:
procedure PanelKlick(Sender: TObject);
begin
  Sender.Free;
end;


Gruss Frederik
Jetro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Di 04.03.03 21:50 
Danke euch beiden. Werde ich mir mal genauer angucken. Ich hab's aber schon mit Hilfe von www.delphi-fundgrube.de/faq14.htm gelöst...hab's zwar umständlich gemacht, aber es funktioniert.

Wenn ich dann noch Lust hab' werde ich die Umständlichkeit auch wieder aufheben.

Also vielen Dank für die schnellen Antworten (das war wirklich schnell :))

Ciao