ورود

View Full Version : دریافت پارامتر؟



1485159
شنبه 30 خرداد 1388, 14:40 عصر
مثلا فرض کنیم که کار بر یه فایلی رو باموس درگ کنه و بیاره روی فرم ما .
کا چطوری میتونی آدرس فایر رو تشخیص بدیم؟
مثل notpad
ممنون.

tdkhakpur
شنبه 30 خرداد 1388, 15:04 عصر
مثلا فرض کنیم که کار بر یه فایلی رو باموس درگ کنه و بیاره روی فرم ما .
کا چطوری میتونی آدرس فایر رو تشخیص بدیم؟
مثل notpad
ممنون.
سلام
یعنی چی واضح شرح بدید.

Felony
شنبه 30 خرداد 1388, 15:19 عصر
این نمونه رو ببینید .

shervin farzin
شنبه 30 خرداد 1388, 15:57 عصر
سلام
هنگامي كه فايلي روي فرم برنامه Drop ميشه ، پيامي از طرف سيستم عامل براي برنامه شما
ارسال ميشه به نام WM_DROPFILES . شما با Handle كردن اين پيام ميتونيد آدرس فايل Drop
شده روي فرم رو بدست بياريد . براي اين منظور بايد به ترتيب زير عمل كنيد :
در اولين قدم Shellapi رو در بخش Uses فرم اضافه كنيد .
حالا توسط كد زير اعلام ميكنيد كه فرم شما آماده پذيرش فايل هاي Drop شده رو داره :

DragAcceptFiles(Handle,True);
اين كد رو زماني فراخواني ميكنيد كه مايل به دريافت فايل باشيد . طبيعي كه با تغيير True به
False جلوي پذيرش فايل ها رو خواهيد گرفت .
در مرحله بعد بايد پيام WM_DROPFILES رو Handle كنيم . در بخش Private از تعريف كلاس فرم
تابع مربوطه رو به اين شكل اعلان ميكنيم :

procedure OnDroppedFiles(var Msg:TMessage );message WM_DROPFILES;
در ادامه بدنه تابع به اين شكل خواهد بود :

procedure TForm1.OnDroppedFiles(var Msg: TMessage);
var
Dropped_File_Handle : THandle;
Filename_Buffer : array [0..255] of char;
Files_Number,i:integer;
begin
Dropped_File_Handle:=Msg.wParam;
Files_Number:=dragQueryFile(Dropped_File_Handle,ui nt(-1),Filename_Buffer,255);
ListBox1.Clear;
for i := Files_Number - 1 downto 0 do
begin
DragQueryFile(Dropped_File_Handle,i,Filename_Buffe r,255);
ListBox1.Items.Add(Filename_Buffer);
end;
dragFinish(Dropped_File_Handle);
end;

توجه كنيد كه در تابع OnDroppedFiles از حلقه استفاده شده تا اگر كاربر بيش از يك فايل رو به
صورت Drag & Drop وارد فرم كرد ، آدرس تمام اونها رو نمايش بديم .
مثال فوق رو در برنامه ضميمه براتون قرار دادم.
موفق باشيد .

as13851365
یک شنبه 31 خرداد 1388, 09:20 صبح
روی فرم سه تا ListBox قرار دادم حالا می خوام فایل ها فقط داخل این ها درک بشه مثلا با درک کردن یک سری فایل روی ListBox1 آنها در داخل ListBox1 قرار بگیرند و با درک کردن یک سری فایل دیگه روی ListBox2 آدرس فایل ها داخل ListBox2 قرار بگیره و ....

خلاصه : سه تا لیست باکس به ترتیب ListBox1 , ListBox2 , ListBox3 روی فرم قرار دادیم حالا می خواهیم فایل ها رو با درک کردن روی هر کدام از اینها آدرس فایل های درک شده داخل همان ListBox قرار بگیره

shervin farzin
یک شنبه 31 خرداد 1388, 12:00 عصر
سلام
براي اين كار علاوه بر طي مراحل قبلي بايد يك مرحله اضافه هم داشته باشيم تا در اون مرحله
تشخيص بديم كه كاربر فايل Drag شده رو روي كدوم control از فرم Drop كرده .
براي اين منظور بايد از دو تابع به نامهاي DragQueryPoint و ControlAtPos استفاده كنيم .
تابع اول مختصات X و Y موس رو در لحظه Drop كردن فايل ، در قالب يك متغيير از نوع TPoint
بر ميگردونه . تابع دوم متغييري از نوع TPoint ميگيره و اشاره گري به Component از فرم رو
برميگردونه كه در اون موقعيت X و Y قرار داره .
موفق باشيد.

1485159
سه شنبه 02 تیر 1388, 14:03 عصر
کلا نفهمیدم که این تابع چیکار میکنه؟
ورودی چیه؟
خروجی ؟
چه زمانی فراخوانی میشه و چگونه؟

procedure OnDroppedFiles(var Msg:TMessage );message WM_DROPFILES;
ممنون.

shervin farzin
سه شنبه 02 تیر 1388, 14:41 عصر
سلام

کلا نفهمیدم که این تابع چیکار میکنه؟
ورودی چیه؟
خروجی ؟
چه زمانی فراخوانی میشه و چگونه؟

اين تابع بخشي كه شما نوشتيد در واقع اعلان تابع هست ، به هر ترتيب همون طور كه در كدهاي
برنامه ملاحظه كرديد هيچ كدي براي فراخواني اين تابع وجود نداره چون اين تابع فقط از طرف
سيستم عامل به وسيله پيامي به نام WM_DROPFILES كه در انتهاي اعلان تابع مشخص شده
صدا زده ميشه . ورودي اين تابع متغييري به نام MSG هست كه اون هم توسط خود سيستم عامل
در هنگام رويداد پيام WM_DROPFILES ، مقدار دهي ميشه . اگر منظرتون از خروجي ، نتيجه اي
هست كه با فراخواني اين تابع بدست مياد بايد به بدنه تابع نگاه كنيد .
موفق باشيد.

1485159
سه شنبه 02 تیر 1388, 14:48 عصر
یعنی اگه به جای
WM_DROPFILES
یه پیام دیگه مینوشتیم هنگامی که اون پیام به برنامه برسه اون پروسیجر اجرا میشه؟؟
ممنون.

shervin farzin
چهارشنبه 03 تیر 1388, 20:42 عصر
سلام

یعنی اگه به جای
WM_DROPFILES
یه پیام دیگه مینوشتیم هنگامی که اون پیام به برنامه برسه اون پروسیجر اجرا میشه؟؟
ممنون.
البته با تغيير نوع پيام همچنان تابع Call ميشه اما ممكنه نوع متغيير Msg مناسب با اون پيام
نباشه ، به همين دليل براي Handle كردن مناسب پيام بايد نوع Msg رو هم مدد نظر داشته باشيد .
*. منظور از Msg ، پارامتر ورودي تابع هست.
موفق باشيد.

hamidele
یک شنبه 07 تیر 1388, 19:03 عصر
سلام
عنوان این تاپیک دریافت پارامتر هست ، البته من هم سوالی در مورد دریافت پارامتر دارم که خوشحال میشم جوابشو بدونم.
همین ارسال پارامتر به نحوه های دیگه ای هم انجام میشه! مثلا برای notepad که فرمودین میشه توی command prompt یا توی Run پارامتر ها رو بفرستیم مثل :

notepad c:\test.txt

خوب اینجا هم ما فایل رو به notepad فرستادیم!
سوالم اینه که اینجا چه message ای رو باید handle کنیم؟

vcldeveloper
یک شنبه 07 تیر 1388, 20:41 عصر
خوب اینجا هم ما فایل رو به notepad فرستادیم!
سوالم اینه که اینجا چه message ای رو باید handle کنیم؟
برای این کار نیازی به handle کردن message نیست. پارامترهای command line از طریق تابع ParamStr قابل دسترس هستند. تعداد این پارامترها هم از طریق تابع ParamCount در دسترس هست.
ParamStr(0) همیشه به فایل EXE برنامه شما اشاره میکنه. در مثال بالا، اگر Notepad اسم فایل EXE شما باشه، ParamStr(1) = c:\test.txt هست.

hamidele
یک شنبه 07 تیر 1388, 21:35 عصر
با تشکر از استاد عزیزم آقای کشاورز.
من همه حدس می زدم که احتمالا نیاز به کار با msg ها نباید باشه
اما این رو که دیدم گفتنم این شوال رو هم پرسیده باشم!
باز هم تشکر می کنم