Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit onClick
Mike_C - Mi 30.10.02 21:20
Titel: Problem mit onClick
OK, das wird wohl ein etwas länger Thread :wink:
Ich habe eine Klasse von TPanel abgeleitet und möchte dieser Klasse ein Image geben. das ist kein Problem, ich kann ja einfach eins erstellen. Mein Problem ist diesem Image dann ein ONCLICK-Event zur Laufzeit zuzuweisen.
Die Klasse sieht so aus (kompletter code)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| type TBubbleStone = class (TPanel) protected fForm, fColor: string; fImage: TImage; fIndex, fPoints: Integer; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Initialize(BallID: integer); published property BallForm: string read fForm write fForm; property BallColor: string read fColor write fColor; property BallPoints: integer read fPoints write fPoints; property Index: integer read fIndex write fIndex; property Image: TImage read fImage write fImage; end;
implementation
constructor TBubbleStone.Create; begin inherited Create(AOwner);
Height := 20; Width := 20;
fImage := TImage.Create(AOwner); fImage.Parent := Self; fImage.Align := alClient; end;
destructor TBubbleStone.Destroy; begin inherited; end;
procedure TBubbleStone.Initialize(BallID: integer); const Colors: array[0..4] of string = ('Blue','Red','Green','White','Orange'); Points: array[0..4] of integer = ( 80, 200, 150, 300, 500);
begin fImage.Picture.LoadFromFile('BITMAPS\Ball'+IntToStr(BallID)+'.bmp'); fColor := Colors[BallID]; fForm := 'Circle'; fPoints := Points[BallID]; end; |
und so will ich das OnClickEvent zuweisen
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TFormMain.BubbleStoneClick(Sender: TObject); begin if (Sender is TBubbleStone) then begin ShowMessage('You clicked on Stone '+IntToStr((Sender as TBubbleStone).Index)); end; end;
procedure TFormMain.CreateTable(Sender: TObject); var i,l,t: integer; begin Randomize; RandSeed := Random(100);
t := 0; l:= 0; for i:= 1 to BUBBLEMAX do begin Stone[i] := TBubbleStone.Create(FormMain); Stone[i].Parent := FormMain; Stone[i].Name := 'BubbleStone'+IntToStr(i); Stone[i].Top := 60 + t*20; Stone[i].Left := 220 + l*20; Stone[i].Initialize(Random(5)); Stone[i].Index := i; Stone[i].Image.OnClick := BubbleStoneClick; Stone[i].OnClick := BubbleStoneClick; inc(l); if i mod 10 = 0 then begin l := 0; inc(t); end; Application.ProcessMessages; end; end; |
Allerdings bekomme ich keine Reaktion, wenn ich das Programm laufen lasse.
Warum nicht? :cry:
CenBells - Mi 30.10.02 22:33
hallo du benutzt den aufruf
fImage.align := alClient;
du wartest aber in deiner komponente auf clicks, die auf dein panel erfolgen.
also musst du die property
onclick
deiner kompo mit ner eigenen read und write prozedur versehen, wo du das onclick des panels dann dem des images zuweist.
Dann klappt es auch mit dem nachbarn
Gruß
Ken
Sorry, habe nicht gesehen, daß du das ja eh schon machst....
aogwaba - Mi 30.10.02 23:04
Hi!
Das Image verdeckt das Panel, deshalb kommt das ClickEvent nicht an.
Stone[i].image.OnClick := BubbleStoneClick;
cu
waba
Mike_C - Do 31.10.02 12:37
aogwaba hat folgendes geschrieben: |
Das Image verdeckt das Panel, deshalb kommt das ClickEvent nicht an.
Stone[i].image.OnClick := BubbleStoneClick;
|
Darauf bin ich auch schon gekommen, aber das sollte
Stone[i].image.OnClick := BubbleStoneClick;
ja lösen.
Warum funzt das dann trotzdem nicht?
iKilledKenny - Do 31.10.02 14:25
also ohne dass ich es probiert hätte, würde ich folgendes sagen:
wenn du im onclick abfragen würdest
Quelltext
1: 2: 3: 4: 5:
| if (Sender is TImage) then begin s := IntToStr (TBubbleStone (TImage(Sender).Parent).Index); ShowMessage('You clicked on Stone '+s); end; |
müsste das gehen ...
Mike_C - Do 31.10.02 14:41
iKilledKenny hat folgendes geschrieben: |
also ohne dass ich es probiert hätte, würde ich folgendes sagen:
wenn du im onclick abfragen würdest
Quelltext 1: 2: 3: 4: 5:
| if (Sender is TImage) then begin s := IntToStr (TBubbleStone (TImage(Sender).Parent).Index); ShowMessage('You clicked on Stone '+s); end; |
müsste das gehen ... |
-------------------------------------------------------------------------------------
Thx alot iKilledKenny!
Logisch, dass es darüber funktionieren muss! Tut's auch!
Macht ja irgendwie keinen Sinn ein TPanelClick abzufangen, wenn ich ein TImageClick abfangen muss!
Thx!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!