تبلیغات
پایگاه کد ها وسورس های مختلف زبان های برنامه نویسی - اشاره گر ها و توابع
اشاره گر ها و توابع | برنامه نویسی کاربردی ,

با سلام !

امروز یه آموزش مفید دلفی براتون آوردم. این آموزش در باره اشاره گر ها در دلفی می باشد. اشاره گر ها دارای مفهومی پیچیده و سخت هستند که نمی خواهم به این مفاهیم بپردازم تا هم خودمو گیج کنم و هم شما رو  برای همین کاربرد اون ها رو در برنامه های دلفی و طرز استفاده از اون ها را براتون بیان می کنم.

---------------------------------------- **** -----------------------------

برای کار با بعضی از توابع مفید API در دلفی همیشه به توابع مختلف و بسیار عجیب و غریبی بر می خوریم. مثلا بعضی از توابع دارای پارامتر هایی نا مشخص می باشند که اصلا از آن ها سر در نمیاریم . یکی از همین نوع پارامترهای عجیب و غریب Pointer ها یا اشاره گر ها هستند (اشاره گر ماوس رو نمی گما!!!). اشاره گر ها کار های بسیار جالبی  انجام میدهند که جدا یکی از پر فایده ترین ها هستند. برای این که به طور ساده و قابل درک بگم می تونم از اشاره گر ها این تعریف رو داشته باشم که :

اشاره گر ها در اصل یک مقدار عجیب و غریب دارند این مقدار یک تابع است !!!!!! بهتر بگم آن ها مقادیری به تابعی که به اون ها پاس میدیم  قرار می دهند و اون تابع رو اجرا می کنند (فرار نکنید بابا الان بیشتر می گم) . ببینید به طور مثال یک ایونت (رخداد) {مثلا فشرده شدن یک دکمه!} را در نظر بگیرید. ایونت ها یک تابع از کاربر می گیرند و وقتی که عمل مورد نظر انجام شد  تابع را اجرا می کنند!!! خب اشاره گر ها هم به نوعی عملی شبیه به این کار ار انجام مید هند. به این شکل که تا وقتی تابع معرفی شده کارش ادامه پیدا می کنه که مقدار به صفر برسه {کفگیر به ته دیگ بخوره }. البته این مقدار رو در اون تابع اصلی میشمارند و شما فقط نیاز دارید تا یک تابع که یه کار انجام میده بنویسید ئ به تابع اصلی پاس بدید. برای پاس دادن توابع به اشاره گرها باید به این نکته توجه داشته باشید که توابع باید پارامتر استانداردی که در اشاره گر بیان میشه رو داشته باشند . یعنی اشاره گر مشخص می کنه مقدار بازگشتی و پارامتره ای تابع چیه وشما وظیفه دارید تا با پارامتر ها بازی کنید و مقدار اصلی خودتون رو بدست آورید !!

خوب برای درک بهتر دو تا تابع ای پی ای رو براتون مثال می زنم EnumWindows & EnumChildWindow که کارشون شمردن تمامی پنجره ها ـ(هندلشون)ـ می باشد. ومقدار بازگشتی شون هم مقدار هندل نیست !! {حتما می پرسید از کجا هندل هار رو گیر بیاریم وست کنیم }  خب جواب این سوال سادس شما با اشاره گر ها و توابع اشاره گر که می نویسد این کار ار به سادگی انجام می دهید

ببینید این توابع یه مقدار اشاره گر دارند که همانطور که یاد گرفتیم باید در آنها یه تابع رجیستر کنیم . این توابع دو پارمتر داند یکی هنول ویک یک مقدار کاردینال (دومیه شاید زیاد به کارتون نیاد!) همچنین مقدار باز گشتی این تابع باید یک مقدار مننطقی (بولی) باشد.

{نکته دیگر در این توابع اینه که باید حتما در تعریف آن ها از کلمه کلیدی Stdcall استفاده بشه} خب پس با تعاریفی که کردیم تابع باید دارای همچنین اینتر فیسی باشد :

 Function GetWinP(A:HWND;LP:Cardinal):bool;Stdcall

خب حالا شما میتوانید مثل یک تابع معمولی به انجام بقیه کار ها بپردازید مثلا کپشن یا نام کلاس هارا از مقدار هندل مر بوط به پارامتره ا در آورید :

 Function GetWinP(A:HWND;LP:Cardinal):bool;Stdcall
var
 ss:string;
 ret:integer;
begin
ret:=GetWindowTextLength(a);
setlength(ss,ret);
GetWindowText(a,PChar(ss),ret+1);
 Form1.ListBox1.Items.Add(ss);
Result:=true;
end;

حتما الان می گویید دیوانه شده ام .  نه اتفاقا بسیار کار درستی انجام دادم. شما در مثال بالا می بینید که من از پارمتر ورودی کپشن پنجره را بدست آوردم . حالا برای این که از تابع انوم ویندوز استفاده کنم به سادگی تابعی که نوشتم رو به پارمتر اول اون که یک اشاره گر هست پاس می دم و اون هم پارمتر های تابعی که نوشته ام تاز زمانی ست می کنه که پمردن پنجره ها به پا یان برسد. برای اینکار (و کلا پاس دادن تابع به اشاره گر ) به شکل زیر عمل می کنم :

  EnumWindows(@GetWinP,0);

خب حالا یه لیست باکس روی فرم قرار بدید و یه دکمه و در رویداد فشرده شدن دکمه کد زیر را وارد کنید. حال برنامه را اجر کنید !!! چیزی که می بینید واقعا خوشایند می باشد شما لیستی از تمام کپشن های ÷نجره های باز در ویندوز را گیر آوردید !!! در ضمن شما با داشتن هندل این پنجره ها به طبع می تونید کار های دیگر از قبیل گرفتن نام کلاس پنجره های سیستم را نیز داشته باشید :

 Function GetWinP(A:HWND;LP:Cardinal):bool;Stdcall
var
 ss:string;
 ret:integer;
begin
ret:=GetWindowTextLength(a);
setlength(ss,ret);
GetClassName(a,PChar(ss),Length(ss));
 Form1.ListBox1.Items.Add(ss);
Result:=true;
end;

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

{منظور از پنجره های فرزند پنجره هایی میباشد که داخل یک پنجره دیگر قرار دارند در اصل همون پنجره های داخل فرم های ام دی ای}

برای شمردن تمام زیر پنجره های یک پنجره اصلی شما باید هندل پنجره اصلی رو بدونید به طور مثال اگه می خواهید از روی کپشن پنجره اصلی هندل اونو پیدا کنید می توانید به شکل زیر عمل کنید :

۱-- یک ادیت روی فرم قرار دهید

۲-- یک لیست باکس روی فرم قرار دهید

۳-- یک دکمه روی فرم قرار دهید تابع زیر را بنویسید :

Function GetWinP(A:HWND;LP:Cardinal):bool;Stdcall
var
 ss:string;
 ret:integer;
begin
ret:=GetWindowTextLength(a);
setlength(ss,ret);
GetWindowText(a,PChar(ss),ret+1);
Form1.ListBox1.Items.Add(ss);
Result:=true;
end;

خب حلا در رویداد فشرده شدن دکمه بنویسید :

procedure TForm1.Button1Click(Sender: TObject);
 var
 H:HWND;
begin
H:=FindWindow(nil,PChar(Edit1.Text));
EnumChildWindows(h,@GetWinP,0);
end;

خب دیگه کار این دکمه پیدا کردن فرم اصلی از روی کپشن اون سپس هندل و تابع رو به ای پی ای انوم چایلد ویندوز میده در نهایت در تابعی که بالا تعریف کردیم تمام کپشن پنجره های فرزند رو از روی هندل آن ها گیر آوردیم . و صد البته قادریم که کار های زیادی روی این پنجره های فرزند انجام بدهیم .

متن تابع مون هم که مثل اون اولین هست برای همین دیگه تحلیل نمی کنم .

خب اینم یه آموزش جدید از دانستی ها دنیای پاسکال و دلفی امیدوارم مفید واقع شده باشه و لذت برده باشید

نظر هم یادتون نره (به قول یه دوستی نظر برای وبلاگ نویس از نون شب واجب تره !!!) در ضمن هر گونه پیشنهاد جهت تبادل لینک دارید می تونید در قسمت نظر های این آموزش بگویید

امیدورام لذت برده باشید - تا  آموزش های بعدی از دنیای برنامه نویسی خدا نگه دار

وحید


نوشته شده توسط دایرکتور در پنجشنبه 9 تیر 1384 و ساعت 01:06 ق.ظ
نوشته های پیشین
+ معرفی سرویس جدید پارسی باکس+ فراخوان دعوت به همکاری+ بازم شروعی دوباره !!!+ شروعی دوباره ؟؟؟؟؟+ الگوریتم های فشرده سازی+ .........+ گذری بر Delegate ها در سی شارپ+ کار با دیتا بیس ۲ + ارتباط با دیتا بیس ..... + افزودن یک ایتم منو به فلش پلیر+ عذر خواهی وکوکی+ پروسس ها در دات نت+ تغییر آدرس وبلاگ + اشاره گر ها و توابع + آموزش ASP.NET شماره ۱

صفحات: