Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Image soll durch darüber liegendes Label angeklickt werden. (https://www.delphipraxis.net/52655-image-soll-durch-darueber-liegendes-label-angeklickt-werden.html)

Hallo_Thomas 1. Sep 2005 00:04


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:
iTag := IntToStr((Sender as TImage).Tag);
Hier kommt die Fehlermeldung"ungültige Typenumwandlung"



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.

Dax 1. Sep 2005 00:24

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.

Hallo_Thomas 1. Sep 2005 01:35

Re: Image soll durch darüber liegendes Label angeklickt werd
 
Ich hatte es auch so versucht;


Delphi-Quellcode:
procedure TForm1.Label1Click(Sender: TObject);
begin
 image1.OnClick;
end;
Fehlermelung;
nicht wirklixh genügend Parameter

So was inder art würde ich bevorzugen, doch leider klappt der halt nicht

dizzy 1. Sep 2005 02:20

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).

Hallo_Thomas 1. Sep 2005 20:42

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.

Ultimator 1. Sep 2005 21:03

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?

Hallo_Thomas 2. Sep 2005 02:30

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.

BrunoT 2. Sep 2005 07:06

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:
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)]);
...
und mit

Delphi-Quellcode:
    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)]);
deine Kreise

und dann definiere unter Implemantation zwei Variablen und diese werden dann im MouseMove gesetzt.
Delphi-Quellcode:
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;
und im OnClick- Ereignis schaust Du nach welches Rechteck oder welchen Kreis du getroffen hast.

[/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

Hallo_Thomas 2. Sep 2005 12:33

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:
OnClick((FindComponent('Image'+(iString))));
Er will irgendwie das Image nich annehmen
(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

BrunoT 5. Sep 2005 07:34

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:
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;
denn mit der with-Klausel wird ja schon auf den sender gezeigt, also reicht self. :wink:

mfg

brunoT


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz