PDA

View Full Version : جابه جایی کامپوننت در زمان اجرا



nassim_20
جمعه 01 تیر 1386, 21:31 عصر
دوستان سلام:
مشکلی که من دارم برای جابه جایی کامپوننتی است (مثلا Image ) که می خواهم در زمان اجرا آنرا جابه جا کنم در ضمن این تصویر ممکن است روی هر کامپوننت یا تصویر دیگری نیز حرکت کند
البته یه راه حل رو اجرا کردم که خصوصیت OnDrag رو بصورت اتوماتیک تعریف کنم و LeftوTop مربوط به کامپوننت مورد نظر را در رویداد OndragOverمربوط به کامپوننت والدش را برابر با x,yقرار دهم ولی این راه زمانیکه روی کامپوننتهای دیگر می خواهم حرکت بدهم انجام نمی شود.

Arman_1367
جمعه 01 تیر 1386, 22:20 عصر
اگه منظورت یک Designer مثل مال دلفی هست من قبلاً نوشتم اگر خواتسی برام پیغام بزار تا نحوه فروش را برات بزارم البته قابلیت های زیر را داره:
جا به جایی
کپی
برش
چسباندن از IDE دلفی و کلیپ بورد جدا
ذخیره به صورت کد پاسکال , DFM
پشتیبانی پکیج
جایگزینی با Designer دلفی در هنگان طراحی فرم برنامه
و ...

سیدمقداد
جمعه 01 تیر 1386, 22:59 عصر
سلام
پکیج کاملی جهت عمل مورد نظر شما وجود دارد علاوه بر آن امکانات فراوان دیگری مثل ساعت آنالوگ و ... در آن قرار داده شده که براحتی می توان پس از نصب استفاده کرد.
می توانید برای این منظور از لینک زیر آن را دانلود کنید:
http://www.devexpress.com/Downloads/VCL/ExForumLibrary

برای سلامتی امام زمان یک صلوات هدیه کنید.
موفق باشید.

nassim_20
شنبه 02 تیر 1386, 14:17 عصر
آقای سید مقداد ممنون از لینکی که گفتید کامپوننتهای بسیار جالبی داشت که مطمئنم در برنامه های بعدی می توانم ازشون استفاده کنم
ولی منظور من جابه جایی تنها یک کامپوننت است من نمی خواهم در زمان اجرا طراحی مجدد کنم فقط می خواهم تنها یک تصویر را در راستای عمودی جابه جا کنم


در ضمن لینک کار می کنه و من دریافت کردم

Mahmood_M
شنبه 02 تیر 1386, 15:05 عصر
سلام
اگه میخواید فقط اون رو جابه جا کنید ( بدون استفاده از موس ) باید خاصیتهای Top و Left اون را تغییر بدید ، ولی اگه میخواید به وسیله موس اون رو جابجا کنید باید در رویداد OnDragDrop مربوط به فرمی که Image شما توش قرار داره ، به صورت زیر بنویسید :
این رویداد یک پارامتر به نام Source داره که شی ای که عمل Drag بر روی اون انجام شده رو در خودش نگه میداره ، شما باید در این رویداد چک کنید که اگر Source از نوع TImage بود ، اونوقت ، Left و Top مربوط به Image رو برابر با X و Y موس قرار بدید :

procedure TMainFrm.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then
begin
TImage(Source).Left := X;
TImage(Source).Top := Y;
end;
end;

همچنین در رویداد OnDragOver مربوط به فرم هم باید شرط پیشروی عمل Drag و Drop رو برابر با این قرار بدید که Source برابر یک TImage باشه :

procedure TMainFrm.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TImage);
end;
توجه کنید که برای کار کردن به روش گفته شده باید خاصیت DragMode مربوط به TImage رو به dmAutomatically تغییر بدید ...

ببخشید من پس اولتون رو خوب نخونده بودم !! که مطالب بالا رو نوشتم

ولی برای حل مشکلتون بهتره به لینک زیر مراجعه کنید :
http://delphi.about.com/library/weekly/aa102505a.htm
اگه توی همین صفحه نبود ، در زیر صفحه تعداد زیادی لینک در همین مورد هست ...

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

nassim_20
شنبه 02 تیر 1386, 16:35 عصر
دوست عزیز آقا محمود از اینکه با حوصله به سوال جواب می دهید خیلی ممنونم
اما مسئله من حرکت یه تصویر روی تصویر دیگر است فرض کنید دو تا Image دارم می خواهم Image1 که روی Image2 قرار دارد به وسیله موس درگ کنم و جا به جا شود
با توجه به راه حل بالا یا راه حلی که در لینک ذکر شده گفته شده تنها زمانی می توان کامپوننتی رو جابه جا کرد که حداقل روی کامپوننت دیگر (در اینجا تصویر) قرار نگرفته باشد.
(البته می بخشید که در ابتدا بطور واضح سوالم را بپرسیده بودم)

Mahmood_M
شنبه 02 تیر 1386, 21:53 عصر
با سلامی دوباره ...

(البته می بخشید که در ابتدا بطور واضح سوالم را بپرسیده بودم)
نه ، من حواسم نبود ، ببخشید ...
ولی راه حل :
برای این کار میتونید از یه راه بهتر از راه اصلی Drag و Drop استفاده کنید ، درواقع میشه ، DragDrop رو شبیه سازی کرد ...
مراحل انجام کار ، یک Timer بر روی فرم بزارید و در رویداد OnTimer اون ، کد زیر رو بنویسید :

if Draging = True then
begin
Image1.Left := (Mouse.CursorPos.X - MainFrm.Left)-(Image1.Width div 2);
Image1.Top := (Mouse.CursorPos.Y - MainFrm.Top)-(Image1.Height div 2);
Image1.BringToFront;
end;
در کد بالا یک متغیر به نام Draging وجود داره که باید اون رو در قسمت Public فرم یا ... تعریف کنید ( از نوع Boolean )
توی کد بالا چک میشه که اگه متغیر Draging مساوی با True بود ، اون وقت محل قرارگیری Image رو برابر با محل قرارگیری Mouse میده و با حرکت دادن موس ، Image هم حرکت میکنه ...
چیزی که مهمه اینه که زمان True یا False کردن متغیر Draging چه موقع هست ، شما باید در رویداد OnMouseDown ( نه OnClick ) ، متغیر رو True کرده و در رویداد OnMouseUp اون رو False کنید ... ، با این کار وقتی روی Image کلیک کنید و با نگاه داشتن موس بر روی اون ، موس رو هم حرکت بدید ، Image هم همراه با موس حرکت میکنه و هرموقع که Mouse رو بردارید ، Image همونجایی که موس رو برداشتید می مونه ...
در خط آخر کد بالا ، Image ای که به اصطلاح Drog شده ، بر روی سایر کنترلها ( کنترلی که روش هست ) قرار میگیره ...
و نکته دیگه این که Interval مربوط به Timer باید تا حد امکان کم باشه ( مثلا 1 )
در این روش دیگه مشکلی در رابطه با قرار نگرفتن بر روی سایر کنترلها نیست ... !

شاید یه خورده قضیه نا مفهوم باشه ، به همین دلیل یه برنامه نمونه کوچیک هم براتون گذاشتم ...
لینک دانلود : http://www.parsaspace.com/nabegheh/DragDrop.rar

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

nassim_20
یک شنبه 03 تیر 1386, 05:43 صبح
آقا محمود خیلی ممنون این دقیقا همان چیزی بود که می خواستم و کمک بزرگی به من کردید

Valadi
یک شنبه 03 تیر 1386, 07:51 صبح
جناب Mahmood_N
این برنامه یک مشکل کوچکی داره که وقتی Image حرکت می کنه یک لحظه پرش داره
این کد هم برای جلوگیری از پرش :

procedure TMainFrm.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;

Keramatifar
یک شنبه 03 تیر 1386, 16:11 عصر
یه سر به بخش نکات برنامه ویسی در دلفی بزن مشکلت رو حل کردن قبلا