PDA

View Full Version : ایجاد onMouseLeave



siroosss
پنج شنبه 18 مهر 1392, 22:45 عصر
با سلام
من یه مشکل با بعضی از کامپوننت های دلفی دارم چون فاقد رویدادهای مهم
onMouseEnter و onMouseLeave هستند.
بهترین کامپوننتی که می تونم مثال بزنم TshockWaveFlash هستش.
کد زیر رو به دست آوردم و خوب کار می کنه ولی هر کاری می کنم نمی تونم TshockWaveFlash رو در قسمت تعریف کلاس به درستی تعریف کنم.
این کد رو کامپوننت هایی که به شکل :
TForm1 = class(TForm تعریف می شن خوب جواب میده
ولی برای اون دسته از کامپوننت هایی که به شکل :
ShockwaveFlash1 : TshockWaveFlash هستند ، عمل نمی کنه



unit Unit1;

interface

uses
Windows, Messages{This unit Most Be Used}, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
Procedure WMMOUSELEAVE(Var MSG:TMessage);message{Windows Send This Message To The WinControl} WM_MOUSELEAVE;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WMMOUSELEAVE(var MSG: TMessage);
begin
{Your Code Most Be Here}
ShowMessage('Hello');
end;

end.


ممنون میشم اگه کمک کنید

یوسف زالی
جمعه 19 مهر 1392, 08:58 صبح
سلام.
سوالتون از بنیاد اشتباهه.
شما دو تا راه اساسی دارید: (هک کامپوننت اینجا جواب نمی ده، مگر این که یک کلاس اشتقاقی موجود باشه که خب چه کاریه)

روش 1- انداختن کامپوننت مورد نظرتون روی یک Container که دارای خصوصیت مورد نظر شما باشه، می تونید از پنل یا گروپ یا چیزهای مشابه استفاده کنید و Align کامپوننتتون رو Client ست کنید.
روش 2- اشتقاق یک کامپوننت از کامپوننت مورد نظرتون و اضافه کردن رویداد مورد نظر به کامپوننت.

پیشنهاد من روش دو هست.


TSpecialBitBtn = class(TBitBtn)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
.
.
.
.
procedure TSpecialBitBtn.CMMouseEnter(var Message: TMessage);
begin
Font.Size := Font.Size +2;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);

inherited;
end;

procedure TSpecialBitBtn.CMMouseLeave(var Message: TMessage);
begin
Font.Size := Font.Size -2;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);

inherited;
end;


اگر متوجه نشدید، پیشنهاد می کنم مطالب مربوط به کامپوننت ها رو (در امضای من هست) مطالعه کنید.
موفق باشید.

siroosss
شنبه 20 مهر 1392, 11:11 صبح
کاربر You-See سلام
ببخشید من کارم خیلی اورژانسی و وقت خیلی زیادی واسه این مورد ندارم
همونطور که متوجه شدید من از Activix فلش می خوام استفاده کنم
اولا از روش هایی که پیشنهاد کردید متشکرم
پیشنهاد اول رو نمی تونم انجام بدم (البته نه اینکه بلد نباشم ، نمی خوام بنا به دلایلی از panel و... استفاده کنم)
اما روش دوم فکر می کنم حلال مشکل من باشه
البته اگه کامل کمکم کنید و همینجا جوابتون رو کات نکنید
من از ورژن XE دلفی استفاده می کنم و اگر تست کرده باشید خیلی از کدهایی که تو دلفی 7 نوشته میشه تو XE جواب نمیده
میشه یه خواهشی کنم و این مثالی که گذاشتید رو برای همون ShockwaveFlash تغییر بدید و یه لطفی کنید و توضیح بدید چی کار باید بکنم
مبحثی هم که در رابطه با کامپوننت ها بود نگاه کردم خیلی خوب شد که این سوال رو پرسیدم چون خیلی دوست داشتم در رابطه با کامپوننت های دلفی یه مقاله خوب گیر بیارم
که شما زحمتش رو کشیدید
ولی در حال حاضر با توجه به وقت تنگی که دارم لطفا این یه مورد رو جوری برام انجام بدید که نیازی به اینکه خودم بخوام چیزی رو یاد بگیرم نباشه
ممنون میشم

یوسف زالی
شنبه 20 مهر 1392, 13:50 عصر
نمی دونم که در خصوص اکتیواکس ها هم می شه اشتقاق ایجاد کرد یا نه.
اکتیواکستون رو بگذارید سر فرصت بررسی می کنم.

siroosss
شنبه 20 مهر 1392, 21:44 عصر
بی صبرانه منتظریم
تشکر

یوسف زالی
شنبه 20 مهر 1392, 22:58 عصر
خب اکتیواکس رو نگذاشتید که منتظرید!

siroosss
یک شنبه 21 مهر 1392, 21:22 عصر
ببخشید از صحبت شما جور دیگه برداشت کردم
در مورد اکتیویکس من باید چی کار کنم؟
همونطور که حتما می دونید ، اکتیویکس با نصب فلش پلیر ، رو سیتمی که دلفی توش نصب هست ، فعال میشه
و از قسمت تعریف کامپوننت ها ی اکتیویکس به دلفی اضافه میشه
حالا من باید چی کار کنم و چی رو براتون بفرستم؟

یوسف زالی
یک شنبه 21 مهر 1392, 22:00 عصر
این رو بگذارید به حساب کار نکردن من با فلش. در حقیقت اصلا نمی دونستم این اکتیواکس وجود داره..
یک یونیت با این اوصاف تولید کنید:


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, ShockwaveFlashObjects_TLB;

type
TMyShockWaveFlash = class(TShockwaveFlash)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

implementation

{ TMyShockWaveFlash }

procedure TMyShockWaveFlash.CMMouseEnter(var Message: TMessage);
begin
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);

inherited;
end;

procedure TMyShockWaveFlash.CMMouseLeave(var Message: TMessage);
begin
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);

inherited;
end;

end.


می تونید این یونیت رو به عنوان یک کامپوننت هم ایجاد کنید. با خودتون.
در حالت ران تایم مثالی رو می زنم:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
MyFlashDoc: TMyShockWaveFlash;
procedure FlashEnter(Sender: TObject);
procedure FlashExit(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FlashEnter(Sender: TObject);
begin
Caption := 'FlashEnter'
end;

procedure TForm1.FlashExit(Sender: TObject);
begin
Caption := 'FlashExit'
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyFlashDoc := TMyShockWaveFlash.Create(Self);
with MyFlashDoc do
begin
Parent := Self;
OnMouseEnter := FlashEnter;
OnMouseLeave := FlashExit;
MyFlashDoc.LoadMovie(0, 'http://www.joepublicmarketing.com/Joe_Public_Site_2010.swf');
end;
end;

end.


موفق باشید.

siroosss
دوشنبه 22 مهر 1392, 23:03 عصر
تشکر می کنم
خیلی عالی بود