PDA

View Full Version : کاربرد پیام در دلفی



nassim_20
پنج شنبه 16 مهر 1383, 20:44 عصر
سلام به همه کسانی که در این سایت فعالیت می کنند
من همین امروز با این سایت آشنا شدم
من می خواستم اطلاعاتی در مورد پیامها در دلفی بدست بیاورم
مثلا اینکه فهرست کلیه پیامها رو چه جوری و از کجا می شه تهیه کرد
چه جوری باید توی دلفی از اونها استفاده کنیم
و یه سوال دیگه هم داشتم: می شه از طریق دلفی عنوان پنجره ی بازی رو تغییر داد و چگونه
ممنون از همه شما خوبان :) :)

مهدی کرامتی
پنج شنبه 16 مهر 1383, 22:31 عصر
1- برای مشاهده لیست کامل Message ها در یونیت Windows.pas کلماتی که با <span dir=ltr>WM_</span> شروع میشوند را ببینید. اطلاعات بیشتر را در MS SDK Help Files میتوانید پیدا کنید. این فایلها بهمراه خود دلفی نصب میشوند.

2- منظورتون پنجره ای است که در خود برنامه است یا در یک برنامه دیگر؟

nassim_20
جمعه 17 مهر 1383, 10:12 صبح
- برای مشاهده لیست کامل Message ها در یونیت Windows.pas کلماتی که با WM_ شروع میشوند را ببینید. اطلاعات بیشتر را در MS SDK Help Files میتوانید پیدا کنید. این فایلها بهمراه خود دلفی نصب میشوند.

2- منظورتون پنجره ای است که در خود برنامه است یا در یک برنامه دیگر؟
ممنونم
منظورم پنجره های دیگه است مثلا پنجره my computer و یا هر پنجره دیگه ای

phantasm
جمعه 17 مهر 1383, 14:02 عصر
سلام ٬

من همین امروز با این سایت آشنا شدم

خوش اومدی :)


می شه از طریق دلفی عنوان پنجره ی بازی رو تغییر داد و چگونه

بله٬ شما ابتدا با استفاده از تابع FindWindow هندل اون پنجره رو بدست بیارید سپس با استفاده از تابع SendMessage میتونی اینکاررو انجام بدی ٬ توی تابع SendMessage نوع پیام رو WM_SETTEXT قرار بدید.(برای آشنا شدن با پارامترهای این توابع به HELP دلفی رجوع کنید ٬اینطوری اصل موضوع رو میفهمید و وابسته به یه روال مشخص نمیشید)

البته تابع FindWindow برای برگردوندن هندل پنجره نیاز به عنوان caption یا نام class پنجره داره ٬میشه از توابع دیگه ای که با استفاده از روشهای دیگه مثل موقعیت پنجره در صفحه و...هندل اون پنجره رو برمیگردونن استفاده کنید.

اینجا هم چند تا مثال هست :

http://www.barnamenevis.org/forum/viewtopic.php?t=11177&start=0&postdays=0&postorder=asc&highlight=wmsettext

phantasm
جمعه 17 مهر 1383, 16:25 عصر
البته یه تابع به اسم SetWindowText هم وجود داره که از همون روش بالا برای تغیر عنوان یک پنجره استفاده میکنه :


function SetWindowText&#40;hwnd&#58;HWND;lpstring&#58;PChar&#41;&#58;BOLL;stdca ll;

nassim_20
جمعه 17 مهر 1383, 19:01 عصر
سلام


اطلاعات بیشتر را در MS SDK Help Files میتوانید پیدا کنید. این فایلها بهمراه خود دلفی نصب میشوند
آقای مدیر سایت ممنونم :flower: :flower:
یه سوال داشتم :فایلی که گفتید کجاست من پیدا نکردم (MS SDK Help Files)

آقای phantasm از شما هم متشکردم:flower: :flower:
یه سوال داشتم در مورد senmessage عنوان جدید رو تو کجا باید بنویسیم من از help استفاده کردم ولی متوجه نشدم کد رو به این صورت نوشتم
SendMessage(h,WM_SETTEXT,0,0);
منتها عنوان رو پاک کرد.
البته کد بعدی رو که نوشتم جواب داد :موافق: :تشویق: :تشویق:
function SetWindowText(hwnd:HWND;lpstring:PChar):BOLL;stdca ll;
(این تابع جزو توابع API هستش؟)
در ضمن اگه می شه یه کمی هم در مورد پیامها توضیح بدید ممنون می شم.
یه سوال دیگه هم داشتم فرق پیام با توابع API چیه؟

phantasm
جمعه 17 مهر 1383, 23:20 عصر
یه سوال داشتم در مورد sendessage عنوان جدید رو تو کجا باید بنویسیم


SendMessage&#40;windowhandle, WM_SETTEXT, 0, Integer&#40;PChar&#40;'Hello'&#41;&#41;&#41;;


این تابع جزو توابع API هستش؟
بله.


در ضمن اگه می شه یه کمی هم در مورد پیامها توضیح بدید ممنون می شم.

وقتی توی محیط ویندوز یه رخداد Event اتفاق میوفته ویندوز پیام Message متناسبی رو تولید میکنه و به مقصد مربوطه ارسال میکنه.هر پیام شامل اطلاعاتی از قبیل هندل شی مقصد ٬ نوع پیام ٬ ...
در حقیقت یک Message به خودی خود کاری انجام نمیده بلکه روال مربوطه بهش پاسخ میده و پیام فقط پارامتر های مورد نیاز رو در اختیار اون قرار میده ٬مثلا پیام WM_QUIT باعث نمیشه برنامه مربوطه بسته بشه بلکه روالی در ویندوز این پیام رو دریافت میکنه و بعد از تفسیر اون از طریق پارامترهایی که منتقل کرده برنامه رو میبنده.
قسمتی از ویندوز پیام هارو مدیریت میکنه و هر پیام رو به روال پاسخگوی اون پیام میفرسته.VCLقسمتی از جزئیات سیستم پیام رسانی ویندوز رو اداره میکنه .
برنامه نویس هم میتونه پیام های خاصی رو برای مقاصد مشخصی تعریف کنه .

امیدوارم این اطلاعات اندک بدردتون بخوره :)

orion188
شنبه 18 مهر 1383, 17:47 عصر
سلام

در مورد SM_SETFONT هم ممکنه توضیح بدین؟
1- FONT مربوطه رو چطور میشه مشخص کرد؟
2- آیا این روش به طور دائم (مادامیکه برنامه باز هست) این تغییر font رو حفظ میکنه؟ یا با RePaint شدن از بین میره؟

phantasm
شنبه 18 مهر 1383, 18:50 عصر
در مورد SM_SETFONT هم ممکنه توضیح بدین؟

اگه منظورتون WM_SETFONT (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_setfont.asp) است




FONT مربوطه رو چطور میشه مشخص کرد؟


const
LVM_GETHEADER = LVM_FIRST + 31;
var
LF&#58; TLogFont;
hHeader, hCurrFont, hOldFont, hHeaderFont&#58; THandle;
begin
&#123;to get the windows handle for header&#125;
hHeader &#58;= SendMessage&#40;ListView1.Handle, LVM_GETHEADER, 0, 0&#41;;

&#123;to get the handle for header font&#125;
hCurrFont &#58;= SendMessage&#40;hHeader, WM_GETFONT, 0, 0&#41;;

&#123;to get the LOGFONT with font details&#125;
if GetObject&#40;hCurrFont, SizeOf&#40;LF&#41;, Addr&#40;LF&#41;&#41; > 0 then
begin
&#123;set our custom attributes. I set a bold and underlined font style&#125;
LF.lfWeight &#58;= FW_BOLD;
LF.lfUnderline &#58;= 1;

&#123;create a new font for the header control to use.
This font must NOT be deleted until it is no
longer required by the control, typically when
the application will be closed or when a new font
will be applied to header&#125;
hHeaderFont &#58;= CreateFontIndirect&#40;LF&#41;;

&#123;to select the new font&#125;
hOldFont &#58;= SelectObject&#40;hHeader, hHeaderFont&#41;;

&#123;to notify the listview header about changes&#125;
SendMessage&#40;hHeader, WM_SETFONT, hHeaderFont, 1&#41;;
end;
end;


آیا این روش به طور دائم (مادامیکه برنامه باز هست) این تغییر font رو حفظ میکنه؟ یا با RePaint شدن از بین میره؟

فکر کنم اینطور باشه و repain فونت رو تغیر نده ٬ امتحان کن !! من دلفی روی سیستمم نصب نیست تا امتحان کنم :)

orion188
شنبه 18 مهر 1383, 18:56 عصر
سلام

خیلی ممنون از راهنماییتون.

این روش Font رو تغییر میده و درست هم کار کرد. حالا من اگر بخوام از Fontهای ویندوز (با استفاده از نام اونها) انتخاب کنم چه باید بکنم؟

ممنون

phantasm
شنبه 18 مهر 1383, 21:12 عصر
http://bdn.borland.com/article/0,1410,15293,00.html

orion188
یک شنبه 19 مهر 1383, 14:15 عصر
سلام
ممنون.

من با این روش میتونم Font رو عوض کنم. اما یه نکته ای وجود داره:

وقتی که Handle یک دکمه داخل Application خودم رو میدم بهش، فونت رو به درستی عوض میکنه.
اما وقتی پنجره هدف ، متعلق به app دیگری باشه ، فونت اون رو تبدیل به یک فونت خاص میکنه (ظاهرا" Arial و به صورت Bold).

علت این چیه؟

توضیح : من برای ایجاد فونت از این دستورات استفاده میکنم:


LOGFONT LF;
strcpy&#40;LF.lfFaceName,"Times New Roman"&#41;;
LF.lfHeight = 10;
LF.lfWidth = 8;
LF.lfItalic = true;
HFONT FH = CreateFontIndirect&#40;&LF&#41;;

nassim_20
یک شنبه 19 مهر 1383, 21:55 عصر
امیدوارم این اطلاعات اندک بدردتون بخوره
ممنونم تقریبا فهمیدم ولی چون تا به حال با پیامها کار نکردم طریقه استفاده اونا توی دلفی برام مبهمه مفهوم پیام رو خوب فهمیدم ولی نمی دونم چه جوری و در کجا می تونیم ازشون استفاده کنیم.

orion188
دوشنبه 20 مهر 1383, 17:41 عصر
نمی دونم چه جوری و در کجا می تونیم ازشون استفاده کنیم.


سلام

خوب، توی این بحثها هم یه جورایی اشاره شد: از پیامها در عمل میشه برای صحبت کردن برنامه های مختلف با هم استفاده کرد. برای مثال شما میتونین فشرده شدن یک کلید رو ، در یک برنامه دیگه شبیه سازی کنید.

موفق باشید

phantasm
دوشنبه 20 مهر 1383, 21:44 عصر
شاید این مقایسه خیلی صحیح نباشه ولی میشه پیام هارو تا حدودی متناظر با وقفه ها ولی در سطح ولایه های بالاتر سیستم عامل در نظر گرفت.

hghodsi
سه شنبه 21 مهر 1383, 18:11 عصر
با سلام

بد نیست سری به این سایت نیز بزنید

<span dir=ltr> http://www.hitekdev.com/delphi/index.html</span>

مطالب جالبی در خصوص کار با پیامها دارد. :wink: