View Full Version : تفاوت نواحی implementation و private مربوط به فرم برای تعریف متغیرها
مهران رسا
شنبه 28 فروردین 1389, 12:39 عصر
با سلام
اگر فرض رو بر این بگیریم که در هر Unit حداکثر یک فرم میتونه وجود داشته باشه و فعلاً بحث تخصیص حافظه و استثناهایی که در شی گرا شدن دلفی به وجود اومده رو هم در نظر نگیریم ؛ آیا کسی دلیلی منطقی واسه استفاده الزامی از هریک از مناطق implementation یا private (مربوط به کلاس فرم) برای تعریف متغیرهای محلی که در کل فرم قابل دسترسی باشند داره ؟
ممنون میشم پاسخ بدید
اوبالیت به بو
شنبه 28 فروردین 1389, 18:27 عصر
این سوال من هم هست.
فرقشون تو چیه؟
vcldeveloper
شنبه 28 فروردین 1389, 20:05 عصر
گر فرض رو بر این بگیریم که در هر Unit حداکثر یک فرم میتونه وجود داشته باشه و فعلاً بحث تخصیص حافظه و استثناهایی که در شی گرا شدن دلفی به وجود اومده رو هم در نظر نگیریم
خب، پس چی رو در نظر بگیریم؟!
یک فیلد Private روی Heap قرار میگیره، یک متغیر var در Implementation روی Stack قرار میگیره.
برای استفاده از فیلدهای اون کلاس حتما باید یک نمونه شی از آن کلاس بسازید.
متغیرهای عمومی در بخش های Interface و Implementation میراث Turbo Pascal برای دلفی هستند.
مهران رسا
شنبه 28 فروردین 1389, 20:29 عصر
ممنون . خیالم از این بابت راحت شد دیگه :دی
برای استفاده از فیلدهای اون کلاس حتما باید یک نمونه شی از آن کلاس بسازید.خوب شد این مورد رو گفتین . یک سوال جدید :
برای استفاده از یک کلاس در دلفی باید ازش شی ساخته بشه و بعد از طریق اون شی به متدها و غیره دسترسی داشت . درسته ؟ . برای مثال در منطقه interface یک شی از کلاس فرم به صورت زیر تعریف شده :
var
Form1: TForm1;تا اینجا که مشکلی نیست . مثلاً برای مقدار دهی به Caption فرم میشه از Form1.Caption استفاده کرد . سوالی که وجود داره اینه که چرا در کد زیر برای دسترسی به رویه ی کلاس فرم از شی Form1 استفاده نشده و مستقیماً نام کلاس مورد استفاده قرار گرفته ؟
procedure TForm1.FormCreate(Sender: TObject);
ممنون از توجه شما
:لبخندساده:
SAASTN
یک شنبه 29 فروردین 1389, 00:25 صبح
تا اینجا که مشکلی نیست . مثلاً برای مقدار دهی به Caption فرم میشه از Form1.Caption استفاده کرد . سوالی که وجود داره اینه که چرا در کد زیر برای دسترسی به رویه ی کلاس فرم از شی Form1 استفاده نشده و مستقیماً نام کلاس مورد استفاده قرار گرفته ؟
این کد برای دسترسی به متد FormCreate نیست، بلکه شروع پیاده سازی این متد از کلاس TForm1 رو نشون میده. توی بخش تعریف کلاس TForm1 هم که بگردی تعریف این متد رو پیدا می کنی.
حالا شما هر چند تا شئ که از TForm1 ایجاد کنی و متد FormCreate اون اشیاء رو فراخونی کنی این بخش از کد اجرا میشه.
امیدوارم گویا بوده باشه.
Mahmood_M
یک شنبه 29 فروردین 1389, 01:43 صبح
تا اینجا که مشکلی نیست . مثلاً برای مقدار دهی به Caption فرم میشه از Form1.Caption استفاده کرد . سوالی که وجود داره اینه که چرا در کد زیر برای دسترسی به رویه ی کلاس فرم از شی Form1 استفاده نشده و مستقیماً نام کلاس مورد استفاده قرار گرفته ؟
همونطور که جناب SAASTN اشاره کردن دستوری که قرار دادید ، برای دسترسی به متد Create کلاس TForm1 نیست بلکه برای تعریف اون متد هست ...
به مثال زیر دقت کنید :
type
TMyObject = class(TObject)
procedure DoSomething;
private
public
end;
در کد بالا یک Procedure با نام DoSomething تعریف شد ، ولی اگه بخواید برنامه ی بالا رو کامپایل کنید با خطای زیر مواجه میشید ( دلفی 2010 ) :
[DCC Error] Unit1.pas(11): E2065 Unsatisfied forward or external declaration: 'TMyObject.DoSomething'
کامپایلر در خطای بالا اعلام میکنه که متدی با نام DoSomething عملکردش تعریف نشده ، یا به نوعی تعریف ( اعلان ) خارجی نشده ، تعریف خارجی یا همون External Declaration که در پیغام اومده ، یعنی تعریف عملکرد Procedure در خارج از بدنه ی کلاس صاحب اون که TMyObject هست ...
به طور کلی بعد از تعریف یک تابع یا یک Procedure در بدنه ی یک کلاس باید عملکردش رو در خارج از بدنه ی کلاس تعریف شده ، تعریف کنیم ، با تعریف Procedure به صورت زیر دیگه خطایی دریافت نمی کنیم :
type
TMyObject = class(TObject)
procedure DoSomething;
private
public
end;
...
implementation
procedure TMyObject.DoSomething;
begin
...
end;
برای کلاس TForm1 هم به همین صورت یعنی ابتدا درون بدنه ی کلاس یک Procedure با نام FormCreate به صورت زیر تعریف میشه :
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
...
و در خارج از بدنه ی تابع هم خود Procedure نوشته میشه :
procedure TForm1.FormCreate(Sender: TObject);
begin
...
end;
شئ Form1 که از نوع TForm1 تعریف شده ، تنها یک نمونه از کلاس TForm1 هست و عملکردش تابع خصوصیات کلاس اصلی TForm1 هست و نمیشه برای Form1 یک Procedure یا تابع یا متغیر یا هر چیز دیگه ای تعریف کرد ، بلکه Form1 از خصوصیات و توابع و Procedure ها و ... ی TForm1 استفاده میکنه ، دستوراتی مانند FormCreate هم که تعریف می کنید درواقع برای کلاس TForm1 هستند نه برای Form1
امیدوارم مفید بوده باشه ...
موفق باشید ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.