ترفند ها در دلفی
محدود کردن اندازه فرم در دلفی
گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages تابع WM_GetMinMaxInfo میباشد.
unit MinMax;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Dialogs Forms,;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage);
Begin
inherited;
with PMinMaxInfo(MSG.lparam)^ do
begin
with ptMinTrackSize do
begin
X := 300;
Y := 150;
end;
with ptMaxTrackSize do
begin
X := 350;
Y := 250;
end;
end;
end;
end.
چگونه تمامی رویدادهای یک شیء را در زمان اجرا به Nil تنظیم کنیم؟
روشی را جهت اینکه تمامی رویدادهای یک شیء تعریف شده در دلفی را در زمان اجرا به Nil تنظیم کنید برای شما بازگو می کنیم. شما می توانید از RTTIها جهت رسیدن به اهداف خود استفاده کنید اما فقط برای زمان طراحی و اجرا و این امکان برای رویدادها وجود ندارد. استفاده از RTTI، تا حدودی پیچیده است بنابراین من رویه ای را برای نسبت دادن Nil به یک شیء موجود در زمان اجرای یک برنامه در دلفی آورده ام که نحوه انجام این کار را به شما نشان می دهد.
unit uNilEvent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private }Private declarations} public {Public declarations} end;
var Form1: TForm1; implementation {$R *.DFM} uses Typlnfo; procedure NilEvents(lnstance: TObject); var Typelnfo: PTypelnfo; I, Count: Integer; PropList: PPropList; Proplnfo: PProplnfo; Method: TMethod;
begin Typelnfo := Instance.Classlnfo; Method.Code := nil; Method.Data := nil; Count := GetPropList(Typelnfo, [tkMethod], nil); GetMem(PropList, Count * SizeOf(Pointer)); try GetPropList(Typelnfo, [tkMethod], PropList); for I := 0 to Count -1 do begin Proplnfo := PropList^[I]; SetMethodProp(lnstance, Proplnfo, Method); end;
end; procedure TForm1.Button1Click(Sender: TObject(; const sText = 'The 2nd time you click Button1 the event will not fire'; begin NilEvents(Button1(; ShowMessage(sText(; end; end.
چگونه رویداد مربوط به تمامی اجزاء درون برنامه خود را تغییر دهیم؟
گاهی لازم می شود تا ما فرامینی را برای یکی از رویدادهای برنامه خود به تمامی اشیاء استفاده شده در برنامه نسبت دهیم اینکار می تواند با استفاده از RTTI دلفی صورت گیرد شما مثالی را می بینید که این کار را شبیه سازی کرده است.
uses Typlnfo; procedure TFrmRTTIOnChange.Button1Click(Sender: TObject(; var proplnfo: PProplnfo; thisEvent: TNotifyEvent; begin proplnfo := GetProplnfo(Memo1.Classlnfo, 'OnChange‘(; if proplnfo <> nil then begin thisEvent := Memo1AltChange; SetOrdProp(Memo1, Proplnfo, integer(@thisEvent((; end; end;
)begin Caption := 'Normal On Change'; end; procedure TFrmRTTIOnChange.Memo1AltChange
(Sender: TObject); begin Caption := 'Alternate On Change'; end;
درست کردن ماکرو متنی
این امکان بسیار مفید است و می توانید بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای ctrl+shift+r را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای ctrl+shift+r را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید
انتخاب متن بصورت مربعی
اگر شما از کهنه کارهای کامپیوتر باشید حتما از زمان داس یادتون هست که برنامه ای بود به نام PE2 که یکی از امکانات بسیار جالبش این بود که یک مربع از متن رو میتوانستین انتخاب کنید و آنرا کپی یا حذف کنید. بله درست متوجه شدید در محیط دلفی هم شما اینکار را میتوانید انجام دهید اما نه به مشکلی PE2 بلکه اینکار را میتوانید فقط با گرفتن کلید Alt و کشیدن موس روی متن انجام دهید.
گذاشتن علامت روی متن
این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای ctrl+Shift را نگه دارید
و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.
گذاشتن علامت روی متن
شی گرایی
در نظر بگیرید برای رانندگی مجبور بودید از تمام نکات فنی و همه اتفاقاتی که در موتور و پیستونها اتفاق می افتد با خبر بودید واقعاً گیج کننده می شد، اینطور نیست! در واقع برنامه نویسی ابتدا بدین صورت بود و فقط افراد خاصی می توانستند این کار را انجام دهند ولی با ظهور شی گرایی همه چیز عوض شد. حالا ببینیم یک شی دقیقاً چکار میکند. اول اینکه یک شی طوری طراحی شده که برنامه نویسی همانند دنیای اطراف ما بنظر برسد. یک شی همه چیزهای مربوط را دور هم جمع میکند مثلا توابع ، زیرروالها، متغییرها و حتی پایگاه داده مربوط همه و همه در یک جا و به صورت یک موجودیت
کار دیگر شی این است که جزئیات را از دید شما پنهان می کند به طوری که شما بدون آن که از ماهیت درونی آنها آگاه باشید می توانید به راحتی از آنها استفاده کنید. همانطور که بدون آنکه از جزئیات درونی و مدارهای یک تلوزیون باخبر باشید با آن کار میکنید و این به یکی از آرزروهای دیرینه برنامه نویسان یعنی سادگی و عدم پیچیدگی پاسخ داد. حال بیایید ببینیم یک شی چگونه این کارها را انجام می دهد.
شی گرایی
شی های یک زبان مانند دلفی همانند اشیای دنیای واقعی مثل ماشین و متورسیکلت اهرمهایی برای کنترل نیاز دارند که این وظیفه را Method ها به عهده می گیرند. متدها نقش زیرروالها را در زبانهای قدیمی ایفا می کنند. شی ها برای حفظ حالت جاری از Properties استفاده میکنند مثلاً شما با دیدن کیلومتر ماشین به سرعت آن پی می برید و در اشیا با خواندن یک Properties همان کار را انجام می دهید.
شی گرایی
در واقع Properties یا خاصیتها نقش متغییرها و به طور کلی ساختمان دادهها را در زبانهای قدیمی ایفا می کنند البته تفاوتهایی بین یک متغییر و Properties وجود دارد که شما به تدریج به آن پی می برید. حالا به مفاهیم مشکل تر شی گرایی می رسیم.
شی گرایی
اشیا قابلیتی بنام ارث بری دارند در واقع هر شی می تواند خصوصیات خود را به فرزند خود منقل کند و یا به عکس می تواند از والد خود خصوصیاتی را به ارث ببرد. حالا سعی میکنم با مثالی این را تشریح کنم. فرض کنیم شما می خواهید شی ای ایجاد کنید مثل قناری شما ابتدا می توانید شی به نام پرنده بوجود آورده و همه خصوصیات پرنده را در آن ایجاد کنید. سپس شی بنام قناری ایجاد می کنید که خصوصیات مربوط به پرندگان را می تواند از شی پرنده به ارث ببرد و بقیه خصوصیات را برای آن مشخص کنید و اگر بعداً خواستید پرنده دیگری مثل گنجشک را معرفی کنید
شی گرایی
هنوز هم می توانید از شی پرنده استفاده کنید و این یعنی راحت تر شدن کد نویسی. قانون مهمی که باید بخاطر داشته باشید و به سادگی از آن رد نشوید این است که هر شی می تواند بجای والد خود بکار گرفته شود چون همه خصوصیات آن را دارد ولی یک والد نمی تواند بجای فرزند خود بکار رود این مثل این است که دوست شما ، شما را به یک میهمانی دعوت کند و بگوید میتوانید پرنده خود را بیاورید و شما می توانید قناری را با خود ببرید ولی در صورتی که می گفت فقط می توانید گنجشک با خود بیاورید شما نمی توانستید هر پرنده دیگری را با خود ببرید.
شی گرایی
این نکته مهم در آنجا کاربرد دارد که در صورتی که پارامتر یک زیرروال از نوع یک شی باشد همه فرزندان آن شی می توانند به آن زیروال ارسال شوند. برای فهم این موضوع عجله نکنید و فقط قانون را بیاد داشته باشید. مطلب دیگری که راجع به شی گرایی باید بدانید Class و instance می باشد . در واقع اشیا فقط یک قالب می باشند که نمی توانند به تنهایی مورد استفاده قرار گیرند. برای مثال وقتی شما می گویید قناری منظورتان قناری خاصی نیست. ولی وقتی یک قناری را با اسمی که برای آن گذاشته اید صدا می زنید
شی گرایی
یک قناری خاص را در نظر دارید. در واقع قناری به طور کلی وجود خارجی ندارد بلکه یک قناری خاص که مثلاً اسم آن تویتی است وجود خارجی دارد در واقع Class مانند قناری و Instance مانند تویتی است و این به معنی این است که ما همواره ابتدا کلاسها را تعریف کرده و سپس برای استفاده یک نمونه یا Instance از آن را بوجود می آوریم.
شی گرایی
رویداد گرایی
در زبانهای قدیمی دستورات خط به خط انجام می شد تا برنامه به پایان برسد و این یک روند قابل پیشبینی را ایجاد میکرد ولی با به وجود آمدن روشهای رویدادگرا برنامه منتظر یک اتفاق می ماند تا عکس العمل نشان دهد. در اشیای روزمره هم همین طور است مثلاً یک ماشین حساب تازمانی که شما دکمه ای را فشار ندهید عمل نمی کند. در اینجور زبانها باید برنامه را طوری طراحی کنید که کدهایتان برای عکس العمل نشان دادن به کار کاربر نوشته شده باشد. این خلاصه ای از شی گرایی و رویداد گرایی بود.
تنظیم نمودن IDE ، پروژه و گزینه های ترجمه
از گزینه options که درون منوی project قرار دارد برای تنظیم نمودن گزینه های مربوط به پروژه خود استفاده کنید .
تنظیم نمودن گزینه های پیشفرض پروژه
برای تغییر دادن گزینه های پیش فرض پروژه خود به نحوی که روی تمام پروژه های بعدی تاثیر داشته باشند می توانید از درون پنجره project option نسبت به تنظیم نمودن گزینه های دلخواه اقدام نموده و سپس کادر default را که در قسمت پایین پنجره قرار دارد علامتدار کنید . با این عمل تمام پروژه های جدید از گزینه های پیش فرض انتخاب شده تبعیت می کنند .
استفاده از tamplate ها در برنامه نویسی
Template ها معمولا ساختارهایی را شامل می شوند که شما می توانید آنها را به کد برنامه اضافه کنید و تکمیل نمایید . برای مثال اگر شما بخواهید از یک حلقه for در نوشتن کد برنامه استفاده کنید می توانید از tamplate زیر استفاده کنید :
For := to do Begin End;
برای درج نمودن یک tamplate در پنجره ویرایشگر کد ترکیب کلیدی ctrl+j را فشرده و tamplate مورد نظر را انتخاب کنید . شما هم چنین می توانید tamplate های خودتان را به این مجموعه بیفزایید . برای افزودن یک tamplate : 1- از منوی tools گزینه editor option را انتخاب کنید . 2- روی صفحه code insight کلیک نمایید . 3- در قسمت code templates دکمه add را بفشارید . 4- درون جعبه متن shortcut name نام tamplate را وارد کرده و دکمه ok را فشار دهید . 5- درون جعبه متن code ، کد موردنظرتان را تایپ کنید . 6- دکمه ok را کلیک کنید .