![]() |
Image soll durch darüber liegendes Label angeklickt werden.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich wollte das Onclick meines Images ansteuern über ein Label. Irgendwie klappt dies nicht, weil ich dies über mein Tag irgendwie nich schaffe. :wall: Gehts es irgendwie,dass der Tag des Images gesendet,gelesen wird. so sehen meine Quelltexte aus : :coder:
Delphi-Quellcode:
Labels[1].OnClick:=image1.OnClick;
Labels[1].OnMouseDown:=Image1.OnMouseDown; Labels[1].OnMouseUp:=Image1.OnMouseUp;
Delphi-Quellcode:
Hier kommt die Fehlermeldung"ungültige Typenumwandlung"
iTag := IntToStr((Sender as TImage).Tag);
Hier der komplette Quelltext
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Images1: TImage; Images2: TImage; Images3: TImage; procedure AllButtons(Sender: TObject); procedure AllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure AllMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } Labels : array[1..3] of TLabel; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.AllButtons(Sender: TObject); var itag:String; begin itag := IntToStr((Sender as TImage).Tag); Showmessage(itag) end; procedure TForm1.AllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var itag:String; begin iTag := IntToStr((Sender as TImage).Tag); (FindComponent('Image'+(iTag)) as TImage).Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\1u.bmp' ); end; procedure TForm1.AllMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var itag:String; begin iTag := IntToStr((Sender as TImage).Tag); (FindComponent('Image'+(iTag)) as TImage).Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\1.bmp' ); end; procedure TForm1.FormCreate(Sender: TObject); var i :integer; istring :string; begin for i := 1 to 3 do begin istring:=IntToStr(i); Labels[i] := TLabel.Create(self); Labels[i].Parent := self; Labels[i].AutoSize:= False; Labels[i].Transparent:= True; Labels[i].Width:=(FindComponent('Images'+(istring)) as TImage).Width; Labels[i].Height:=(FindComponent('Images'+(istring)) as TImage).Height; Labels[i].Top:=(FindComponent('Images'+(istring)) as TImage).Top; Labels[i].Left:=(FindComponent('Images'+(istring)) as TImage).Left; Labels[i].Layout:=tlCenter; Labels[i].Alignment:=taCenter; Labels[i].font.color:=CLWhite; Labels[i].font.charset:=Ansi_Charset; Labels[i].font.Size:=8; Labels[i].BringToFront; Labels[i].Caption:='1'; end; Labels[1].OnClick:=image1.OnClick; Labels[1].OnMouseDown:=Image1.OnMouseDown; Labels[1].OnMouseUp:=Image1.OnMouseUp; end; end. Danke für eure Hilfe. |
Re: Image soll durch darüber liegendes Label angeklickt werd
Wenn du das Label anklickst, is der Sender nie vom Typ TImage! Nimm lieber TControl, dann dürfte das mit as XX).Tag gehen.
|
Re: Image soll durch darüber liegendes Label angeklickt werd
Ich hatte es auch so versucht;
Delphi-Quellcode:
Fehlermelung;
procedure TForm1.Label1Click(Sender: TObject);
begin image1.OnClick; end; nicht wirklixh genügend Parameter So was inder art würde ich bevorzugen, doch leider klappt der halt nicht |
Re: Image soll durch darüber liegendes Label angeklickt werd
image1.OnClick erwartet ja auch einen Parameter. Entweder du reichst "Sender" weiter, oder einfach nil (für diesen Zweck).
|
Re: Image soll durch darüber liegendes Label angeklickt werd
Liste der Anhänge anzeigen (Anzahl: 2)
Nun wollte ich noch das die Labels über dem entsprechenden Image(die labels gehen über mehrer Images) Das entsprechende Onclick des Imgaes auslösen.
Irgendwie klappt der Code hier unten nicht
Delphi-Quellcode:
procedure TForm1.MeinClick(Sender: TObject);
var i: Integer; iString:String; begin for i := 1 to 3 do iString:=IntToStr(i); if (FindComponent('Image'+(iString)) is TImage) then begin with TControl(FindComponent('Image'+(iString))) do if PtInRect(Rect(0, 0, Width, Height), ScreenToClient(Mouse.CursorPos)) then Image1.OnClick(Image1) //(FindComponent('Image'+(iString)) as TImage).OnClick(FindComponent('Image'+(iString)) as TImage); end; end; Ich weis nicht so recht ob ich hierfür nenn neuen Thread aufmachen soll, aber ich poste es einfach mal hierdrin. |
Re: Image soll durch darüber liegendes Label angeklickt werd
Hmm, wäre das nicht ienfacher, das Label wegzulassen und die Sache über Canvas.TextOut() zu lösen?
|
Re: Image soll durch darüber liegendes Label angeklickt werd
@Ultimator
Yo könnte man machen, wie ist das vom resourcen verbrauch zu sehen, wenn die Zahl sich während der Laufzeit verändert? Abgesehen davon, hätte ich dann noch das 2 Image über den ersten, was ich ja noch ansteuern müsste(Den roten Kreis. |
Re: Image soll durch darüber liegendes Label angeklickt werd
Hallo Thomas,
ich denke mal, das ist ein völlig falscher Ansatz, nimm ein Image, zeichne dort die Rechtecke mit
Delphi-Quellcode:
und mit
Type
Tr=Record x1:Integer; y1:Integer x2:Integer; y2:Integer end; Var a:Array[0..4] of Tr; .... Procedure Form1.FormActivate(Sender: TObject); Begin ... a[1].x1:=100; a[1].y1:=100; a[1].x2:=200; a[1].x2:=200; // usw.. Image1.Canvas.Brush.Color:=clBlue; Image1.Canvas.Pen.Color:=clBlue; Polygon([Point(a[1].x1, a[1].y1), Point(a[1].x2, a[1].y1), Point(a[1].x2, a[1].y2), Point(a[1].x1, a[1].y2)]); ...
Delphi-Quellcode:
deine Kreise
Image1.Canvas.Brush.Color:=clRed;
Image1.Canvas.Pen.Color:=clRed; Ellipse([Point(a[2].x1, a[2].y1), Point(a[2].x2, a[2].y1), Point(a[2].x2, a[2].y2), Point(a[2].x1, a[2].y2)]); und dann definiere unter Implemantation zwei Variablen und diese werden dann im MouseMove gesetzt.
Delphi-Quellcode:
und im OnClick- Ereignis schaust Du nach welches Rechteck oder welchen Kreis du getroffen hast.
Var
My,Mx:Integer; procedure TForm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: INTEGER); begin Mx := x; My := y; // Panelfarbe.Color := Leinwand.Canvas.Pixels[x, y]; // mFarbe.Caption := InTtoStr(Leinwand.Canvas.Pixels[x, y]); end; [/delphi] procedure TForm.ImageDblClick(Sender: TObject); var i,akt: INTEGER; gefunden: Boolean; begin gefunden := false; // StatusBar.Panels[0].TEXT:='X = '+IntToStr(Mx); // StatusBar.Panels[1].TEXT:='Y = '+IntToStr(My); for i := 0 to 4 do begin // showmessage(IntToStr(aEingabe[i].x1)+' <= '+IntToStr(Mx)+' <= '+IntToStr(aEingabe[i].x2)+#13+ // IntToStr(aEingabe[i].y1)+' <= '+IntToStr(My)+' <= '+IntToStr(aEingabe[i].y2)); if ((a[i].x1 <= Mx) and (Mx <= a[i].x2)) and ((a[i].y1) <= My) and (My <= a[i].y2)) then begin akt := i; gefunden := True; break; end; end; if gefunden then showmessage(IntToStr(akt)); case akt of 0:..; 1:...; else end; end; [delphi] mfg BrunoT |
Re: Image soll durch darüber liegendes Label angeklickt werd
Liste der Anhänge anzeigen (Anzahl: 1)
@BrunoT Ich danke dir für den ausführlichen beitrag,aber is nicht ganz das was ich mir vorstelle. Trotzdem Danke!
So hab noch mal am Text gefeilt,und er funktioniert auch fasst. Hab noch ein Problem mit dem ich nicht zurecht komme, und zwar diese Zeile.
Delphi-Quellcode:
Er will irgendwie das Image nich annehmen
OnClick((FindComponent('Image'+(iString))));
(Fehlermeldung heist Zugriffsverletzung, bla,bla) Wenn ich die Zeile so schreibe nimmt er sie korrekt an.
Delphi-Quellcode:
OnClick(Image1);
Hier die Komplette Prozedur
Delphi-Quellcode:
procedure TForm1.MeinClick(Sender: TObject);
var i: Integer; iString:String; begin for i := 1 to 3 do begin iString:=IntToStr(i); if (FindComponent('Image'+(iString)) as TImage) is TImage then begin with (FindComponent('Image'+(iString)) as TImage) do if PtInRect(Rect(0, 0, Width, Height), ScreenToClient(Mouse.CursorPos)) then OnClick((FindComponent('Image'+(iString)))); end; end; Hab natürlich auch dies probiert
Delphi-Quellcode:
OnClick((FindComponent('Image'+(iString)) as TImage));
aber klappt auch nicht |
Re: Image soll durch darüber liegendes Label angeklickt werd
Hallo Thomas,
tut mir ja leid, dass mein Beitrag dich nicht inspiriert hat, das so zu lösen. :mrgreen: ich glaube. dass das nur so lauten muss:
Delphi-Quellcode:
denn mit der with-Klausel wird ja schon auf den sender gezeigt, also reicht self. :wink:
if (FindComponent('Image'+(iString)) as TImage) is TImage then
begin with (FindComponent('Image'+(iString)) as TImage) do if PtInRect(Rect(0, 0, Width, Height), ScreenToClient(Mouse.CursorPos)) then OnClick(self); end; mfg brunoT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 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