PDA

View Full Version : سوال: Image Size



skmkh6056
دوشنبه 10 تیر 1387, 17:14 عصر
من روی فرمم چندتا Image دارم که میخوام با رفتن موس روی اون اندازش بزرگ بشه و وقتی موس از روی Image بزرگ شده کنار کشیده شد(یعنی موس Image را ترک کرد) Image به اندازه اولیه اش برگرده. لطفا راهنماییم کنین.

Hsimple11
دوشنبه 10 تیر 1387, 19:05 عصر
باید برای شیئ خود رویداد Onmouseenter یا Onmousemove و onmouseleave داشته باشید و در رویداد onmousemove آن بنویسید :


With MyImage Do Begin
Height := طول جدید;
Width := عرض جدید;
Stretch := True; {در صورت نیاز}

و در رویداد OnMouseLeave اینها را به حالت اول در آورید.

اگر کنترل شما رویدادی بصورت آماده ندارد آن با پیغام WM برایش بسازید. ویندوز با این پیغامی برای کنترل مورد نظر میفرستد. برای مثال WM_MOUSELEAVE. میتوانید این پروسیجر را در بخش Private تعریف کنید تا توسط سایر module ها قابل دسترسی نباشد :

type
TForm1 = class(TForm)
private
Procedure WMMOUSELEAVE(Var MSG:TMessage);message WM_MOUSELEAVE;
{ Private declarations }
.
.
.



حال کافیست کد مربوط به تغییر اندازه Image خود را که قرار بود در رویداد OnMouseLeave بنویسید را با این پروسیجر فرابخوانید :

procedure TForm1.WMMOUSELEAVE(var MSG: TMessage);
begin
ٌWith MyImage do..
.
.
.
end;
در ضمن توجه داشته باشید که یونیت Messages را به لیست یونیتهای خود (Uses) اضافه کنید.
موفق باشید...

skmkh6056
سه شنبه 11 تیر 1387, 08:10 صبح
دوست عزیز جناب Hsimple11 کدهای پیشنهادیتونو استفاده کردم ولی در ImageLive هیچ اتفاقی نمی افته.

Hsimple11
سه شنبه 11 تیر 1387, 11:46 صبح
این کد را در یک یونیت جدید وارد کنید و به عنوان یک کامپوننت Image جدید save کنید. حالا یک کامپوننت دارید که رویدادهای MouseEnter و MouseLeave را دارد و میتوانید کدهای گفته شده را در آن وارد کنید.


unit ImageEx;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TImageEx = 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; dynamic;
procedure DoMouseLeave; dynamic;
public
{ Public declarations }
published
{ Published declarations }
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Additional', [TImageEx]);
end;

{ TImageEx }

procedure TImageEx.CMMouseEnter(var msg: TMessage);
begin
DoMouseEnter;
end;

procedure TImageEx.CMMouseLeave(var msg: TMessage);
begin
DoMouseLeave;
end;

procedure TImageEx.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TImageEx.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.

موفق باشید...

skmkh6056
سه شنبه 11 تیر 1387, 13:48 عصر
جناب Hsimple11 از توجهتون ممنون ولی راستش من نتونستم ازش جواب بگیرم. شاید بخاطر اینکه یوادم قد نمیده و شاید هم اشکال از کدتونه. لطفا خودتون امتحان کنین و نتیجه را برا ما هم اعلام کنین. با سپاس از لطف شما.

Hsimple11
چهارشنبه 12 تیر 1387, 01:32 صبح
کد مشکلی ندارد. از منوی فایل گزینه New و بعد Unit را انتخاب کنید. کد گفته شده را در آن وارد کنید و با نام دلخواه ذخیره کنید. حالا یک فایل Pas دارید که آنرا به عنوان یک کامپوننت جدید باید نصب کنید. از منوی Component گزینه Install Component را انتخاب کرده و در قسمت Unit File Name فایلی را که ذخیره کردید انتخاب کنید. تغییرات اعمال شده در پروژه dclucr را ذخیره کنید. حالا یک کامپوننت جدید مشابه Image از کلاس TImage در تب Additional دارید که دارای رویدادهای OnMouseEnter و OnMouseLeave می باشد. فکر کنم دیگر مشکلی نداشته باشید.

موفق باشید...