View Full Version : چگونگی تغییر دادن اندازه Panel با قرار گرفتن موس روی آن
  
اصغر (پآچ)
دوشنبه 13 تیر 1390, 23:35 عصر
سلام دوستان
 
من یه فرم دارم که از یه پنل در اون استفاده کردم، روی پنل یکسری شی هست که بعلت کمبود فضا مجبور شدم خیلی فشرده اون ها رو قرار بدم حالا می خوام اگه کاربر موس رو روی پنل برد پنل تغییر اندازه بده و عناصر موجود به صورت کاملا قابل رویت و با فضای کافی چیده بشن! و بعد از اینکه موس ار روی پنل کنار رفت دوباره پنل به اندازه اولیه خودش برگردد.
 
توی کامپوننت Label دوتا Event داریم به نام های OnMouseEnter و OnMouseLeave اما پنل این رویداد ها رو نداره چطور می تونم این کار رو انجام بدم؟
 
موفق و موید باشید
یوسف زالی
سه شنبه 14 تیر 1390, 00:10 صبح
سلام.
راه حل 1: برای پنل رویداد های مورد نظر رو تعربف کنید.
http://barnamenevis.org/showthread.php?288245-حساس-کردن-دکمه-ها-به-OnEnter-و-OnLeave-(سریالایز-با-رویداد-ها)
 
راه حل 2: به جای پنل از فریم استفاده کنید تا اسکرول داشته باشید.
اصغر (پآچ)
جمعه 17 تیر 1390, 00:02 صبح
سلام دوستان
 
این  روشی که دوست عزیزم به اون اشاره کردن برای ایمیج قابل استفاده نبود یا من روش استفاده از اون رو نفهمیدم، فریم هم قابلیت کد نویسی برای رویداد OnMouseEnter یا OnMouseLeave نداشت راه کار دیگه ای سراغ دارید برای این کار؟
 
موفق و موید باشید
یوسف زالی
جمعه 17 تیر 1390, 00:21 صبح
لازم نیست در فریم رویدادهارو اضافه کنید.
برای Image هم میشه اون کارو کرد.
اگر از فریم استفاده می کنید خودش اسکرول داره و لازم نیست که بزرگترش کنید.
اصغر (پآچ)
جمعه 17 تیر 1390, 00:57 صبح
دوست من سلام
 
من به اسکرول نیاز ندارم، من می خوام وقتی موس میره روی ایمیج یا روی پنل تصویر داخل ایمیج رو از حالت Stretch به حالت Auto size تبدیل کنم و به اصطلاح قابلیت زوم داشته باشه که باید اندازه پنل بزرگ بشه تا کاربر محدوده بزرگتری از تصویر رو بتونه ببینه و بتونه با کلیک روی تصویر روی اون پیمایش کنه یا به اصطلاح تصویر رو با کلیک و درگ جابه جا کنه که بعد از خروج موس از روی پنل باید اون به اندازه قبلش برگرده تا عناصر زیر اون قابلیت دید داشته باشند.
 
باز هم از راهنماییتون ممنونم و موفق باشید
یوسف زالی
جمعه 17 تیر 1390, 01:59 صبح
شما با کدی که گذاشتم و با کمی تغییر می تونی برای عکس رویداد رو فعال کنی.
اصغر (پآچ)
جمعه 17 تیر 1390, 01:59 صبح
سلام دوستان
 
پس از کلی جستجو بالاخره یک کد پیدا کردم که می تونه این رویداد ها رو برای پنل شبیه سازی کنه، کد رو برای استفاده سایر دوستان در اینجا قرار می دم شاید کسی مثل من به دردش بخوره:
 
unit Unit1; 
 
interface 
 
uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls; 
type 
  TForm1 = class(TForm) 
    Panel1: TPanel; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,  
      Y: Integer); 
  private 
    { Private declarations } 
    FOldWndProc: TWndMethod; 
    FMouseInPanel: Boolean; 
    procedure PanelWndProc(var Message: TMessage); 
  public 
    { Public declarations } 
  end;
var 
  Form1: TForm1; 
implementation 
 {$R *.dfm}  
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  FOldWndProc:= Panel1.WindowProc; 
  Panel1.WindowProc:= PanelWndProc; 
end;
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  Panel1.WindowProc:= FOldWndProc; 
end; 
 
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); 
var 
  mEvnt: TTrackMouseEvent; 
begin 
  if not FMouseInPanel then 
  begin 
    mEvnt.cbSize := SizeOf(mEvnt); 
    mEvnt.dwFlags := TME_LEAVE; 
    mEvnt.hwndTrack := Panel1.Handle; 
    TrackMouseEvent(mEvnt); 
    Panel1.Caption:= 'IN'; 
    FMouseInPanel:= True; 
  end; 
end;  
procedure TForm1.PanelWndProc(var Message: TMessage); 
begin 
  if Message.Msg = WM_MOUSELEAVE then 
  begin 
    Panel1.Caption:= 'OUT'; 
    FMouseInPanel:= False; 
  end; 
  FOldWndProc(Message); 
end; 
 
end.  
 
ان شاا... این کد به دردتون بخوره بتونه گره از مشکلاتتون مثل مشکل من باز کنه
 
موفق و موید باشید.
اصغر (پآچ)
جمعه 17 تیر 1390, 02:16 صبح
سلام دوستان
 
یه کد دیگه هم که خیلی کوتاهتر از بالایی هست پیدا کردم که به قراره زیره!
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (X >= 0) and (Y >= 0) and (X < Panel1.Width) and (Y < Panel1.Height) then
  begin
    if GetCapture <> Panel1.Handle then
      SetCapture(Panel1.Handle);
    Panel1.Caption := 'IN';
  end
  else
  begin
    ReleaseCapture;
    Panel1.Caption := 'OUT';
  end;
end;
 
امیدوارم اینم به دردتون بخوره!
 
موفق و موید باشید
یوسف زالی
جمعه 17 تیر 1390, 02:24 صبح
کدی که گذاشتید در این خصوص عالی بود.
اما این هم با اون سورس که گفتم:
http://www.persianupload.com/980538
در خصوص عکس درستش کردم.
خوبی این کد اینه که هر نوع رویدادی رو می تونی در کنترلت ایجاد کنی.
مثلا OnDblClick روی CheckBox
اصغر (پآچ)
شنبه 18 تیر 1390, 01:25 صبح
سلام دوست من
 
کد شما هم خیلی جالب بود نگاهش کردم میشه هر نوع آبجکت رو به این کد ارسال کرد؟
اینجوری باشه که خیلی باحاله...
 
موفق و موید باشید
یوسف زالی
شنبه 18 تیر 1390, 01:40 صبح
از نظر تئوری بله.
منتها باید مابه ازای اون رو در یونیت بنویسید.
مثلا اگر Image بود فلان چیزها اضافه بشه اگر Button بود چیزای دیگه.
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.