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 TImage um Eigenschaften und Ereignissen erweitern (https://www.delphipraxis.net/60521-timage-um-eigenschaften-und-ereignissen-erweitern.html)

bluescreen25 8. Jan 2006 13:21


TImage um Eigenschaften und Ereignissen erweitern
 
Hallo,
ich möchte gerne TImages als z.B. Buttons einsetzen. Es fehlen aber bei TImage die Ereignisse OnMouseOver oder auch die Möglichkeit über die Tabtaste ein TImage "einzufangen".

Ich habe einige Beiträge dazu gelesen, aber bin noch nicht soweit, Ableitungen und Erweiterungen zu erstellen. Kann da jemand helfen ?

SirThornberry 8. Jan 2006 13:29

Re: TImage um Eigenschaften und Ereignissen erweitern
 
über die Tabtaste wirst du TImage nie erreischen da es ein TControl ist und kein handle hat wie ein TWinControl.
Für OnMouseOver musst du die entsprechenden messages abfangen (CM_MOUSEENTER und CM_MOUSELEAVE)

bluescreen25 8. Jan 2006 13:48

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von SirThornberry
über die Tabtaste wirst du TImage nie erreischen da es ein TControl ist und kein handle hat wie ein TWinControl.
Für OnMouseOver musst du die entsprechenden messages abfangen (CM_MOUSEENTER und CM_MOUSELEAVE)

:shock: ich schrieb, das ich noch nicht ganz so weit bin.(eher noch Anfänger).
Also geht es gar nicht darum, das TImage neu zu definieren, um global die neuen Ereignisse zu haben?


Bitte gib doch mal ein Beispiel für das Abfangen der Messages, wie man diese dann global verwenden kann.

SirThornberry 8. Jan 2006 13:53

Re: TImage um Eigenschaften und Ereignissen erweitern
 
ein Beispiel für die Messages hatte ich erstmal weg gelassen da ich dachte das es sich vielleicht schon erledigt hat das problem weil das TImage nie den Focus bekommen kann (per Tab etc.)

Beispiel:
Delphi-Quellcode:
type
  TImage = class(ExtCtrls.TImage)
  private
    procedure FCMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure FCMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  end;
[...]
procedure TImage.FCMMouseEnter(var Msg: TMessage);
begin
  //Was soll passieren wenn die maus drüber kommt
  //Beispiel: Laden eines andere Bildes
  Picture.LoadFromFile('BildMausDrüber');
end;

procedure TImage.FCMMouseLeave(var Msg: TMessage);
begin
  //Was soll passieren wenn die maus weg geht
  //Beispiel: Laden eines andere Bildes
  Picture.LoadFromFile('BildMausAußerhalb');
end;

bluescreen25 8. Jan 2006 14:15

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von SirThornberry
ein Beispiel für die Messages hatte ich erstmal weg gelassen da ich dachte das es sich vielleicht schon erledigt hat das problem weil das TImage nie den Focus bekommen kann (per Tab etc.)


Danke schön, das mit dem Focus ist nicht ganz so wichtig wäre aber schön gewesen; werde Einiges über Shortcuts festlegen, sozusagen als Alternative.

Es ist eh eine Software,welche ich im Auto als CARPC einsetzen möchte (Navi,MP3 etc).
Da muss ich eh noch schaun, wie man ausser Maus,Shortcuts noch eine Alternative zur Bedienung finde.

Mir schwebt da so ein PowerMate vor, dazu muss ich eh noch so eine Art Focus erzeugen, da man ja nur einen Drehknopf und eine Druckmöglichkeit hat.

bluescreen25 9. Jan 2006 17:43

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von SirThornberry
ein Beispiel für die Messages hatte ich erstmal weg gelassen da ich dachte das es sich vielleicht schon erledigt hat das problem weil das TImage nie den Focus bekommen kann (per Tab etc.)

Beispiel:
Delphi-Quellcode:
type
  TImage = class(ExtCtrls.TImage)
  private
    procedure FCMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure FCMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  end;
[...]
procedure TImage.FCMMouseEnter(var Msg: TMessage);
begin
  //Was soll passieren wenn die maus drüber kommt
  //Beispiel: Laden eines andere Bildes
  Picture.LoadFromFile('BildMausDrüber');
end;

procedure TImage.FCMMouseLeave(var Msg: TMessage);
begin
  //Was soll passieren wenn die maus weg geht
  //Beispiel: Laden eines andere Bildes
  Picture.LoadFromFile('BildMausAußerhalb');
end;

Nun habe ich alle Timages mit dem gleichen Inhalt. Wie bekomme ich dies bei nur bestimmten hin ?

Khabarakh 9. Jan 2006 17:52

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Du musst eigene Events deklarieren und sie dann in der Botschaftsmethode auslösen. Beispiele dazu findest du im Forum und in den VCL-Sourcen.

bluescreen25 9. Jan 2006 17:58

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von Khabarakh
Du musst eigene Events deklarieren und sie dann in der Botschaftsmethode auslösen. Beispiele dazu findest du im Forum und in den VCL-Sourcen.

:shock: :wiejetzt:

marabu 9. Jan 2006 18:01

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Hallo bluescreen,

verstehst du das?

Delphi-Quellcode:
type
  TBetterImage = class(TImage)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

implementation

procedure TBetterImage.CMMouseEnter(var Msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(Self);
end;

procedure TBetterImage.CMMouseLeave(var Msg: TMessage);
begin
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(Self);
end;
Grüße vom marabu

bluescreen25 9. Jan 2006 18:10

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von marabu
Hallo bluescreen,

verstehst du das?

Delphi-Quellcode:
type
  TBetterImage = class(TImage)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

implementation

procedure TBetterImage.CMMouseEnter(var Msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(Self);
end;

procedure TBetterImage.CMMouseLeave(var Msg: TMessage);
begin
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(Self);
end;
Grüße vom marabu

:( Ohje, nicht so ganz, nur das eine Klasse von TImage abgeleitet wurde,richtig? und die Nachrichten vom ONMouseEnter,OnMouseLeave abgefangen werden , was aber die procedure genau macht nicht.

Mein Problem war, das ich eine Form mit diversen Images hatte und eine einfache Unit mit der Ableitung von Timage. Diese bekam ich aber nicht mit den Images der Form verbunden, oder wenn, dann wurde alles von TImage gleich verarbeitet, nur sollte ein selbst erstellter Button das machen und mein Hintergrund natürlich nicht....

Leider noch nicht so ganz verständlich...sorry

marabu 9. Jan 2006 18:16

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Du kannst einem oder mehreren Images jetzt das gewünschte Verhalten beibringen. Da wo du keine Routine an OnMouseEnter() zuweist, da verhält sich das Image dann so wie gehabt. Jetzt klarer?

Delphi-Quellcode:
procedure TMainForm.ImageMouseEnter(Sender: TObject);
begin
  // hier dein Code
end;

procedure TMainForm.ButtonClick(Sender: TObject);
var
  bi: TBetterImage;
begin
  bi := TBetterImage.Create(self);
  bi.OnMouseEnter := ImageMouseEnter;
end;
marabu

bluescreen25 9. Jan 2006 18:50

Re: TImage um Eigenschaften und Ereignissen erweitern
 
funktioniert bei mir leider net so ganz....

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var BImage :TBetterImage;
 begin
   BImage := TBetterImage.Create(self);
   BImage.OnMouseEnter := ImageMouseEnter;
   BImage.OnMouseLeave := ImageMouseLeave;
   Hintergrund.Picture.LoadFromFile(extractfilepath(paramstr(0))+'back.jpg');
   close_btn_img.SetBounds(0, 225, 210, 60);
   close_btn_img.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
 end;


procedure TForm1.ImageMouseEnter(Sender: TObject);
 begin
  close_btn_img.Picture.LoadFromFile(extractfilepath(paramstr(0))+'buttonB.jpg');
 end;


procedure TForm1.ImageMouseLeave(Sender: TObject);
 begin
   close_btn_img.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
 end;


procedure TForm1.close_btnClick(Sender: TObject);
 begin
   form1.Close;
 end;

nochmal eben editiert, weil Images nicht erkennbar !

ichbins 9. Jan 2006 18:52

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Als erstes vergisst du das Image und leitest deine Komponente am besten von TWinControl ab. Das hat die ganzen Events nämlich schon.

bluescreen25 9. Jan 2006 18:57

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von ichbins
Als erstes vergisst du das Image und leitest deine Komponente am besten von TWinControl ab. Das hat die ganzen Events nämlich schon.

Hintergrund: TImage;
close_btn_img: TImage;

marabu 9. Jan 2006 19:48

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo bluescreen,

schau dir einmal diese Demo an.

Freundliche Grüße vom marabu

bluescreen25 9. Jan 2006 20:55

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Hmm das funktioniert, doch ich suchte eigendliche eine globalere Lösung, deshalb hatte ich versucht es auf ein in der VCL erstelltes Image zu beziehen. Deshalb funktionierte meines nicht.
Das wird ja eine Menge Code für jeden Button werden.... Leider kann ich jetzt nicht mehr die Vorzüge der VCL nutzen um die anderen Eigenschaften und Ereignisse zu setzen.

Vielen Dank !

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
 begin
   Hintergrund.Picture.LoadFromFile(extractfilepath(paramstr(0))+'back.jpg');
   img := TBetterImage.Create(self);
    with img do
    begin
      Parent := self; //<--- was steckt dahinter? ohne dem kein Image sichtbar !
      SetBounds(0, 225, 210, 60);
      OnMouseEnter := ImageMouseEnter;
      OnMouseLeave := ImageMouseLeave;
      Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
    end;
 end;

procedure TForm1.ImageMouseEnter(Sender: TObject);
 begin
   img.Picture.LoadFromFile(extractfilepath(paramstr(0))+'buttonB.jpg');
 end;


procedure TForm1.ImageMouseLeave(Sender: TObject);
 begin
   img.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
 end;

SirThornberry 9. Jan 2006 21:13

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Im anhang ist mal ein Beispiel wie man das ganze macht damit es für die auf das Formular gepackten TImages funktioniert (gibt da noch eine andere Variante bei der man die abgeleitete Komponente in eine extra Unit packt).

[Edit]Bei der Variante mit Auslagerung in eine seperate Unit muss man darauf achten das diese seperate Unit hinter der eigentlichen Unit (ExtCtrls) in den Uses aufgeführt wird.[/Edit]

bluescreen25 9. Jan 2006 21:35

Re: TImage um Eigenschaften und Ereignissen erweitern
 
Zitat:

Zitat von SirThornberry
Im anhang ist mal ein Beispiel wie man das ganze macht damit es für die auf das Formular gepackten TImages funktioniert (gibt da noch eine andere Variante bei der man die abgeleitete Komponente in eine extra Unit packt).

[Edit]Bei der Variante mit Auslagerung in eine seperate Unit muss man darauf achten das diese seperate Unit hinter der eigentlichen Unit (ExtCtrls) in den Uses aufgeführt wird.[/Edit]

Das ist ja genau die Erweiterung von marabus Beispiel in Kombination mit der VCL.
Da kann ich nur sagen :

:thumb: Großen Dank an euch beiden für die Mühe!
Das hätte ich nie hinbekommen, aber hier kann ich die Zusammenhänge mir mal einprägen.


Gruß aus Geldern


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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