![]() |
__سرزمين دلفي__ |
|
نویسندگان سعید ابریشمی آرشیو من
|
چهارشنبه ۱۳ اسفند ،۱۳۸٢ ويندوز هندلی هندل؟! بورلند دلفي - كه آخرين نگارش موجود آن در بازار دلفي 7 است - علاوه بر دستوراتي كه براي كنترل محيط برنامه دارد، براي كنترل اكثر اشياي ويندوز ( Windows) نيز امكانات زيادي را در اختيار برنامه نويس قرار مي دهد. از اين ميان امكان دستكاري (Handling) اجزاي برنامه هاي مختلف را مورد مطالعه قرار مي دهيم.بطوريكه مي دانيد، هريك از اجزايي كه در پنجره هاي مختلف ويندوز مشاهده ميشود و يا حتي آنهايي كه قابل مشاهد نيست، با اعداد صحيح بزرگتر از صفر ( Cardinal) و متمايز از هم شماره گذاري مي شوند. به اين اعداد اصطلاحاً هندل (Handle) گفته مي شود. اشيايي مانند Textbox,lable,button,... هركدام هندلي منحصربفرد دارند. اجزا (components) بكار رفته پروژة دلفي شما نيز اگر از فرزندان TWinControl باشد، داراي هندل هستند. در برنامه هاي مختلف مي توان با استفاده از هندل يك شئ (object) به داده هاي مربوط به شئ دسترسي يافته و حتي در اغلب موارد مي توان مشخصات مربوط به اشياء را تغيير داد. در مثالي كه خواهد آمد، با استفاده از هندل Desktop ، يك تايمر، گرافيك يا متن دلخواه خود را بر روي آن خواهيم نوشت.اولين سؤالي كه پيش مي آيد اين است كه هندل محتويات Desktop را چگونه بايد يافت؟! جواب اين سؤال تابع Get Device Context زير است:Handle:=GetDC(Hwnd_Desktop); سپس با اختصاص اين هندل به يك Canvas مي توانيم مانند ساير ترسيمهايي كه در دلفي مي توان انجام داد، بر روي Desktop نيز بنويسيم.CustomCanvas.Handle:=Handle; پس از اينكه با نحوة يافتن هندل آشنا شديم، به بررسي خواص ( properties) و روالهايي (Methods) مي پردازيم كه در كلاس TCanvas براي اينكار مهيا است.Canvas وسيله ايست كه توسط آن مي توان در ظاهر اجزاي ويژوال تغييراتي ايجاد نمود. در زير برخي خواص و روالهاي مربوط به Canvas آورده شده است:Properties: Brush مشخصات مربوط به مساحتها Pen مشخصات قلم ترسيمHandle هندلPixels رنگ يك پيكسل خاص از تصويرFont خصوصيات قلم متنMethods: Arc ترسيم كمان CopyRect كپي قسمتي از تصويربه تصويري ديگرCreat ايجادDraw رسم يك گرافيكEllipse رسم بيضي و دايرهFillRect رنگ كردن يك مستطيلFloodFill رنگ كردن داخل يك شكل بستهLineTo رسم خط از نقطة جاريMoveTo تغيير نقطة جاريPie رسم قسمتي از بيضيPolygon رسم چندضلعيRectangle رسم مستطيلRoundRect رسم مستطيل با گوشه هاي دايرويTextOut نوشتن متنحال كه بخشهاي مهم برنامه را شناختيم، به سراغ خود برنامه مي رويم. برنامه اي براي نوشتن متن روي Desktopيك برنامه جديد را در دلفي ايجاد كنيد. با دوبل كليك كردن فرم، رويداد ( event) مربوط به زمان بار شدن فرم را ظاهر كنيد:Procedure TForm1.FormCreate(Sender:TObject); Begin End; كدها را به طرف بالا اسكرول كرده و در قسمت Var و قبل از implementation متغير را معرفي كنيد:var Form1: TForm1; DesktopCanvas:TCanvas; implementation سطرهاي زير را براي ايجاد Canvas و اختصاص هندل بين سطرهاي شروع و پايان پروسيجر FormCreate وارد كنيد:DesktopCanvas:=TCanvas.Create; اين سطر متغير را از نوع TCanvas ايجاد مي كند.DesktopCanvas.Handle:=GetDC(Hwnd_Desktop); در اين سطر نيز هندل مختص Desktop را به ترسيم خود نسبت مي دهيم.حال يك Button به فرم خود اضافه كنيد. آنرا دوبل كليك كرده و كدهاي زير را وارد كنيد:DesktopCanvas.Brush.Style:=bsClear; زمينة ( Background) سطح متني كه در سطر بعد مي نويسيم را رنگي نمي كند. اين سطر را اگر حذف كنيد، زمينة متن پاك خواهد شد.DesktopCanvas.TextOut(10,10,'This is your text on the Desktop!'); اين سطر موجب مي شود تا به هنگام فشار دادن كليد در برنامه، عبارت This is your text on the Desktop! در گوشة بالا سمت چپ بر روي Desktop شما نوشته شود، البته با قلم و رنگ پيش فرض.تمام شد! برنامه را مي توانيد Compile و يا اجرا (Run) كنيد. مي توانيد كارهاي ديگري را نيز انجام دهيد، كارهايي مانند آنچه در نرم افزارهاي Desktop Toys يا نرم افزار نگار انجام شده است.مثلا براي نمايش ساعت جاري مي توانيد يك Timer از صفحة System به برنامة خود اضافه كنيد. تايمر را دوبل كليك كرده و كدهاي زير را براي رويداد ontimer آن اضافه كنيد:DesktopCanvas.TextOut(10,40,TimeToStr(Time)); برنامه را بار ديگر اجرا كنيد. حالا شما يك ساعت در گوشه سمت چپ داريد. مي توانيد بيشتر وقت شناس باشيد! اگر نگران خط خطي شدن Desktop خود شده ايد، اگر برنامه اي در آن گوشه اجرا شود همة متنها پاك خواهد شد.در پايان يكبار ديگر تمام متن فايل ذكر مي شود تا اگر در درج كدها اشتباهي شده باشد، براحتي اصلاح شود. در پايان لازم به ذكر است كه اين دستورات تقريبا در تمامي نگارشهاي دلفي موجود است و در نگارشهاي 3 و 6 و7 ( client/server-proffesional-personal) توسط نگارنده آزمايش شده است.unit dsktop_handling; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; DesktopCanvas:Tcanvas; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=GetDC(HWND_DESKTOP); end; procedure TForm1.Button1Click(Sender: TObject); begin DesktopCanvas.Brush.Style:=bsClear; DesktopCanvas.TextOut(10,10,'This is a text'); end; procedure TForm1.Timer1Timer(Sender: TObject); begin DesktopCanvas.TextOut(10,40,TimeToStr(Time)); end; end.
Ref: www.delphi3000.com Delphi online help - Win32 API دوشنبه ۱٦ تیر ،۱۳۸٢ راست به چپ - موجوديت فايل سلام!
جوابهاي يكمي واضح تر: 1- در مورد BiDi يا همون Bi-Directional بايد بگم كه همون راست به چپ نوشتن رو راه مي اندازد. همون مورد كه پرسيده بودن كه: آيا مي توان كاري كرد كه وقتي كاربر روي برنامة ما مياد, كي بردش فارسي بشه؟! ج: دستور زير را بايد بكار برد. (البته واسه ويندوزهاي فارسي يا عربي) Application.BiDiKeyboard:='00000401'; 2- در مورد جسجتوي فايلها و تابع FileExists : ج: در مورد جستجوي فايل, دستور FindFirstFile هست. اما بازم مجبورم موكول كنم به بعداً.اما در مورد FileExists: شكل تابع: FileExists('MyFile.ext'); (البته مي تونين مسير فايل رو هم بنويسين, وگره توي درايو و دايرتوري جاري مي گرده) اگه فايل وجود داشته باشه مقدار True برميگردونه. اگه فايل نباشه False را بر مي گردونه. فعلاً تا update ه بعدي bye bye! راستي! مي دونين ميشه تو دلفي كاري كرد كه Error ها رو هم فارسي نشون بده! مثلاً Division by zero! كه يه Error به زبان انگليسيه مثلاً بشه: "اشكال تقسيم بر صفر!" تو دلفي 6 اينكار رو كردم. تو هفت امتحان نكردم. شنبه ۱٤ تیر ،۱۳۸٢ جوابها! اما ناقص سلام!
بعد از مدتها بالاخره مطلبي اينجا مي نويسم! سعي مي كنم تا اونجا كه از دستم برمياد جوابهاي سوالاتي كه تو اين مدت مطرح شدن بنويسم: 1- فارسي شدن صفحه كليد يعني سويچ كردن بين حالات Eng و Fa - با BiDi ميشه. سعي مي كنم تو متن بعدي بنويسم. 2- من تازه دارم دلفي كار ميكنم . لطفا به من چيزهاي ابتدايي را ياد بدهيد . من قبلا ويژال بيسيك كار مي كردم و بيشتر چيزها را بلدم و پاسكال هم نيز تا حدودي بلدم . - اينكه قبلاً VB كار كرده بودين و Pascal هم بلد هستين, خيلي خوبه. يعني خيلي به ياد گرفتن دلفي كمك مي كنه. اما اگه بخواين كامل ياد بگيرين, بايد برين سراغ كتابها. كه تازگيها خيلي زيادن. راستش رو بخواين تو وبلاگ امكان اين كار وجود نداره. اونايي كه كتابش رو نوشتن, سابقة تدريس داشتن و خيلي بهتر از برنامه نويس ها مي تونن از ابتدا ياد بدن. 3- چه جوري مي تونم يك form رو با تموم اجزاء و component هاش درون يك blobfield ذخيره كنم بعد هم نتونيم load كنيم - من تا حالا ايجور كاري نكردم. فقط يه بار تو شركت شبيه اينكار رو انجام داده بودن كه توي يه فايل مثل فايل dfm هاي دلفي توشون ذخيره مي كردن و ... 4-ميخواهم با دلفي پشتيباني تهيه كنم بر روي فلاپي ديسك و از بانك اطلاعاتي هر روز پشتيباني تهيه كنم مرا راهنمايي كنيد به چه طريق اين كار را انجام دهم در ضمن اگر باز هم سوال داشته باشم مرا كمك ميكنيد؟ - اگر فرصت كافي داشته باشم, خيلي هم خوشحال مي شم كه به سوالات پاسخ بدم (البته اگه چيزي در موردشون بدونم) البته نبايد عجله كنين! (صبر ايوب مي خواهد و گنج قارون!!!) - اگر بخواهيد پشتيبان كلي تهيه كنيد, مي تونين فايلهاي مرتبط با بانك اطلاعاتي را به فلاپي كپي كنيد و ... . اما چيزي كه معمول است و فكر مي كنم شما آنرا مي پرسيد شايد اين باشد كه Record هايي كه جديداً Edit يا Insert شده اند را پشتيبان گيري كنيد. در مورد اون يكم بحث مفصل تر ميخواد. شايد تو چند روز آينده جوابش رو بتونم بدم. 5- كم و زياد كردن صدا در دلفي ؟ -با دستورهاي GetVolume و Setvolume ميشه كنترل كرد. اگه از help ه دلفي نتونستين استفاده كنين, سعي مي كنم بنويسم. .... بقيه ش بازم موند! مي نويسم.... حتماً....... شنبه ۱٤ تیر ،۱۳۸٢ با عرض سلام مجدد! سلام!
يه دوستی (آقای صالحی) چند تا سوال نوشته بودند, انشاالله اگه سوادم رسيد, مي خوام جواباشون رو تو همين روزا اينجا بنويسم.
چهارشنبه ۱٤ اسفند ،۱۳۸۱ راهزني در ويندوز! << FindWindow >>
تا حالا سعي كردم هر چي كه مي گم از Win32 API باشه تا مختص دلفي نباشه. اينبار هم اينكار رو ادامه مي دم. دستور FindWindow از جمله دستوراتي است كه بوسيله ي آن مي توان يك پنجره ي ويندوز را توسط عنوان (Caption) آن شناسايي كرد. FindWindow : HWND بعنوان مثال دستور زير, هندل صفحه ي اكولايزر WinAmp را بر مي گرداند. (اگر برنامه ي فوق در حال اجرا باشد): FindWindow('Winamp EQ','Winamp Equalizer'); هندل(Handle): يك عدد طبيعي (Cardinal) است كه ويندوز به هر برنامه, اجزاهاي برنامه و ... اختصاص مي دهد. در واقع مي توان گفت شماره سريال هر شيئي است كه در ويندوز در حال اجرا است. جمعه ٩ اسفند ،۱۳۸۱ چگونه از روشن بودن Capslock مطلع شويم؟ چگونه از روشن بودن Capslock مطلع شويم؟
در برنامه هاي مختلف پردازش كلمه, هرگاه يكي از كليدهاي Capslock يا Insert زده مي شود, معمولاً وضعيت اين كليدها نشان داده ميشود. يعني (Capslock(on/off و Insert/Overwrite مشخص ميشوند. براي اين منظور تابع GetKeyState وجود دارد. (مربوط به خود دلفي نيست. مال WinAPI است. يعني منحصر به دلفي نيست. در C و VB هم مي توان استفاده كرد.) اين تابع با گرفتن كدِ اسكي (ASCII) كليد مربوطه در صفحه كليد, روشن خاموشي آن را نشان خواهد داد. براي كليدهاي معمولي نيز بالا يا پائين بودن را برمي گرداند. براي Capslock: مقدار برگشتي اين تابع روشن يا خاموش بودن چراغ CapsLock روي صفحه كليد است: روشن و خاموشي با بيت كم ارزشترين تعيين مي شود. فشردن كليد و رها كردن با پر ارزش ترين بيت : 00000001 در مبناي دو: حروف بزرگ روشن است و كليد رها شده است.(مبناي ده: 1) 10000001 در مبناي دو: حروف بزرگ روشن است و كليد هنوز رها نشده است.(مبناي ده: 127) 00000000 در مبناي دو: حروف بزرگ روشن نيست و كليد رها شده است.(مبناي ده: 0) 10000000 در مبناي دو: حروف بزرگ روشن نيست و كليد هنوز رها شده است.(مبناي ده: 128) اگر بخواهيم فقط روشن و خاموشي را چك كنيم, بايد با «1» عمل منطقي AND را انجام دهيم. بعنوان مثال كارهاي زير را انجام دهيد:(بعد از ايجاد برنامه) چهار Label روي فرم قرار دهيد. مقدار Name براي هر Label را به چهار نام زير تغيير دهيد: CapsLockLabel و NumLockLabel و ScrollLockLabel و InsLabel حال بر روي قسمت خالي فرم كليك كرده و مقدار Keypreview را True كنيد. (با اين كار اجازه مي دهيم كه اگر بر روي هر كدام از اجزاي فرم, كليدي فشار داده شده باشد, رويدادِ OnKeyPress را اجرا كند.) حال بر روي Object Inspector صفحه ي Events را انتخاب كنيد. بر روي اين صفحه جلوي OnKeyPress دابل كليك كنيد. در صفحه اي باز شده عبارات زير را تايپ كنيد:(يا از همين جا كپي كنيد!) CapsLockLabel.Enabled:=GetKeyState(VK_CAPITAL) and 1 = 1; حالا غذاي شما آماده ست! مي تونين اونو توي فر بذارين (compile كنين) بعد از اين پختين ش, حالا مي تونين اونو بخورين! (اجرا كنين) اميدوارم كه از غذاي امروز كمال استفاده رو ببرين و پدر كاربر بيپاره رو در نيارين. يك بار ديگه مواد لازم رو خدمتتون مي گم, يادداشت كنين: - Windows API يك قواره! Linux نمي شه, اصرار نكنين! شايد Lindows بشه. - Delphi 7 يك وجب! (هفت رو واسه كلاس گذاشتن نوشتم. حتي دلفي 3 هم مي شه) - Ram,hard,... به مقدار لازم. خوب! كدبانوهاي عزيز! تا برنامه ي بعد, شما رو به خدا مي سپرم. سهشنبه ٦ اسفند ،۱۳۸۱ پنجرهايي به شكل دلخواه اگه از دست پنجره (window) هاي مستطيلي خسته شدين(مثل من!) مي تونين روال زير رو پيش بگيرين:
پس از ايجاد برنامه, يك جزء تصوير (TImage) روي فرم قرار دهيد. فرم را جفت كليك كنيد تا روتين مربوط به FormCreat باز بشه. پروسيجر زير را «قبل» از FormCreat بنويسيد: procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest); روتين مربوط به FormCreat را بصورت زير تغيير دهيد: procedure TForm1.FormCreate(Sender: TObject); والسلام! كار تمومه. حالا يه تصوير (من باشم سياه و سفيد مي ذارم) در Image1 بار كنيد. توجه داشته باشيد كه پيكسل بالا سمت چپ هر رنگي داشته باشد, بعنوان رنگ زمينه انتخاب شده و شفاف خواهد شد (Transprant) يعني اگه همه ي تصويرتون مثلاً آبي باشه اما پيكسل اون گوشه زرد باشد, رنگ زرد ها بعنوان زمينه محسوب خواهند شد. تصوير باز شده بايد bitmap باشد تا قابل پردازش باشد. مثلا مي تونين از paint مال ويندوز استفاده كنين. يعني برين يه بيضي (توپر- توخالي- غير منظم-منظم و...) اونجا بكشين و save كنين. بياين تو Image1 باز كنين. حالا اگه برنامه رو اجرا كنين يه پنجره ي بيضي شكل دارين! تبريك مي گم! از دست اين پنجره هاي مزخرف خلاص شدين. اونم فقط بدست دستور زير: SetWindowRgn(TForm(Sender).Handle, Region, True); اگر پيشنهادي دارين, خوشحال مي شم اگه مطلع بشم. دوشنبه ٥ اسفند ،۱۳۸۱ سلام! سلام!
منظر باشید. ![]() درسته حرفه اي نيستم اما هرچي از دستم بر بياد كوتاهي نمي كنم. اميدوارم شما هم كمك كنيد. سعي مي كنم در مورد دلفي و نرم افزارهاي مرتبط با اون اطلاعاتي ارائه بدم. ![]() اميدوارم به دردتون بخوره. با تشكر |
|
![]() |
||
[ خانه| آرشيو | پست الكترونيك ] |