我正在嘗試構建一個基于FMX.Objects.TImage. 我想通過永久分配影像MultiResBitmap.Items來改變,而無需使用OnMouseEnter和OnMouseLeave應用程式。當然,我會使用建構式和解構式。
我是初學者,也許我不明白一些事情。我已經嘗試了一個星期,但我無法檢測到滑鼠懸停在組件上并為其正確分配事件。我暫時用于ShowMessage()測驗。
理論上,這段代碼應該可以作業而不是作業。告訴我我做錯了什么。
unit ImageCustoms;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, FMX.Types, vcl.Controls, FMX.Objects, FMX.ImgList, vcl.Dialogs, vcl.Graphics, FMX.ExtCtrls;
type
TImageCostoms = class(TImage)
private
{ Private declarations }
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
protected
{ Protected declarations }
procedure DoMouseEnter; virtual;
procedure DoMouseLeave; virtual;
public
{ Public declarations }
//constructor Create(AOwner: TComponent); override;
//destructor Destroy; override;
published
{ Published declarations }
property onm ouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property onm ouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TImageCostoms]);
end;
procedure TImageCostoms.CMMouseEnter(var msg: TMessage);
begin
ShowMessage('Enter');
DoMouseEnter;
end;
procedure TImageCostoms.CMMouseLeave(var msg: TMessage);
begin
ShowMessage('Leave');
DoMouseLeave;
end;
procedure TImageCostoms.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then
ShowMessage('Enter');
FOnMouseEnter(Self);
end;
procedure TImageCostoms.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then
ShowMessage('Leave');
FOnMouseLeave(Self);
end;
{constructor TImageCostoms.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
MultiResBitmap.Items[0].Bitmap.LoadFromFile('focus0.png'); // .\img\i.png
end;
destructor TImageCostoms.Destroy;
begin
inherited Destroy;
end; }
end.
uj5u.com熱心網友回復:
首先,不要將 VCL 和 FMX 單元混合在您自己的單元中。VCL 和 FMX 不能一起使用。由于 FMX 是跨平臺的,Winapi除非您正在撰寫特定于Windows 的代碼(在這種情況下您不是),否則不要在代碼中使用單位。
您不需要CM_MOUSE(ENTER|LEAVE)直接處理訊息,框架已經在內部為您處理了。而且您不需要重新宣告OnMouse(Enter|Leave)事件,它們已經存在并且published在TImage.
您真正需要做的就是override(而不是重新宣告)DoMouse(Enter|Leave)來自的現有虛擬方法Timage,例如:
unit ImageCustoms;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Objects, FMX.ImgList, FMX.ExtCtrls;
type
TImageCostoms = class(TImage)
private
{ Private declarations }
protected
{ Protected declarations }
procedure DoMouseEnter; override;
procedure DoMouseLeave; override;
public
{ Public declarations }
//constructor Create(AOwner: TComponent); override;
//destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TImageCostoms]);
end;
procedure TImageCostoms.DoMouseEnter;
begin
...
inherited;
end;
procedure TImageCostoms.DoMouseLeave;
begin
...
inherited;
end;
{constructor TImageCostoms.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
MultiResBitmap.Items[0].Bitmap.LoadFromFile('focus0.png'); // .\img\i.png
end;
destructor TImageCostoms.Destroy;
begin
inherited Destroy;
end; }
end.
不要ShowMessage()用于除錯組件代碼,尤其是在對鍵盤/滑鼠焦點更改做出反應的事件中。如果要查看除錯訊息,請改用OutputDebugString()或 等效項,然后在 IDE 的輸出視窗中查找訊息。或者,只需在您的 UI 中進行顯示更改,例如顏色更改等。
uj5u.com熱心網友回復:
謝謝,它幫助了我,我正在努力上坡。事實上,在 FMX 中它很簡單,一切正常。非常感謝。我為程式撰寫了虛擬鍵盤支持,整個只是一個稍微改變焦點的透明按鈕。再次感謝。對于后代,現在看起來像這樣,我將嘗試添加來自全域 ImageList 的支持。
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Objects, FMX.ImgList, vcl.Dialogs, System.UITypes;
type
TImageCostoms = class(TImage)
private
{ Private declarations }
procedure DoMouseEnter; override;
procedure DoMouseLeave; override;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TImageCostoms]);
end;
procedure TImageCostoms.DoMouseEnter;
begin
inherited ;
MultiResBitmap.Items[1].Bitmap.LoadFromFile('focus1.png');
end;
procedure TImageCostoms.DoMouseLeave;
begin
inherited;
MultiResBitmap.Items[0].Bitmap.LoadFromFile('focus0.png');
end;
constructor TImageCostoms.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
width:=45;
height:=45;
MultiResBitmap.Items[0].Bitmap.LoadFromFile('focus0.png');
end;
end.```
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357953.html
