PDA

View Full Version : چه موقعی متغیر سراسری میشه و کی مقدار پیش فرض می گیره؟



mbshareat
چهارشنبه 14 اسفند 1387, 19:39 عصر
چه فرق می کنه متغیر رو توی Private یا بعد از Var و قبل از Implementation تعریف کنیم ؟
سوال دومم هم اینه که چه موقعی متغیر رو که تعریف می کنیم از همان اول مقدار اولیه مثلا صفر می گیره؟:چشمک:
من قبلا با VB کار می کردم که متغیر هرجا به کار می رفت در هر صورت مقدار اولیه مثل رشته خالی و صفر و false داشت ولی به نظر می رسه دلفی هیچوقت مقدار پیشفرض برای متغیر نداره و اول هر Procedure مجبوریم علاوه بر تعرف نوع مقدار اولیه هم براش تعیین کنیم .
اگه تصور بنده جایی درست نیست لطفا من رو راهنمایی کنین!:لبخندساده:

vcldeveloper
پنج شنبه 15 اسفند 1387, 00:36 صبح
چه فرق می کنه متغیر رو توی Private یا بعد از Var و قبل از Implementation تعریف کنیم ؟
فرقش در اینه که متغیر تعریف شده در بخش private یک کلاس فقط توسط آن کلاس در دسترس هست، در حالی که متغیر تعریف شده در بخش var در همه یونیت هایی که آن یونیت را در uses خودشان دارند، قابل دسترسی هست. همچنین متغیر تعریف شده در کلاس، فقط زمانی قابل استفاده هست که یک شی از آن کلاس ساخته شده باشه.
البته برای موارد بالا استثناعاتی هم مطرح هست که فکر نکنم الان لزومی داشته باشه بهشون پرداخته بشه.


به نظر می رسه دلفی هیچوقت مقدار پیشفرض برای متغیر نداره و اول هر Procedure مجبوریم علاوه بر تعرف نوع مقدار اولیه هم براش تعیین کنیم .
دلفی متغیرهای سراسری را مقداردهی اولیه میکنه. فیلدهای یک کلاس، یا متغیرهای تعریف شده در داخل یک تابع یا Procedure را شما باید مقداردهی اولیه کنید. البته بعضی از انواع داده، مثل string، همیشه مقداردهی اولیه میشند.

mbshareat
یک شنبه 18 اسفند 1387, 11:28 صبح
آقای کشاورز .دوست گرامی لطفا به بنده بفرمایید منظورتون از فیلد کلاس چیه؟آیا غیر از کلاس فرم می تونم داخل یونیت یه کلاس مثلا از نوع TButton تعریف کنم که مثلا Property خاصی داشته باشد؟:چشمک:
من توی دلفی 6 کار می کنم و نتونستم یه کلاس تعریف کنم که پیغام MouseLeave که توی دلفی 6 جزء Event ها نیست رو بتونه به کار ببرم!:گیج:

vcldeveloper
یک شنبه 18 اسفند 1387, 23:27 عصر
منظورتون از فیلد کلاس چیه؟
فیلدها داده های یک کلاس هستند که بصورت متغیر در آن کلاس تعریف می شوند. برای تعریف اینگونه اصطلاحات باید حتما کتب مربوط به برنامه نویسی شی گرا را مطالعه کنید.


آیا غیر از کلاس فرم می تونم داخل یونیت یه کلاس مثلا از نوع TButton تعریف کنم که مثلا Property خاصی داشته باشد؟
بله، یک یونیت میتونه به هر میزان که شما میخواید کلاس داشته باشه.


من توی دلفی 6 کار می کنم و نتونستم یه کلاس تعریف کنم که پیغام MouseLeave که توی دلفی 6 جزء Event ها نیست رو بتونه به کار ببرم!
این سوال به این تاپیک مربوط نمیشه، و باید در تاپیک جداگانه ایی مطرح بشه. البته تا جایی که من یادم هست، چندین تاپیک درباره چگونگی Handle کردن Messageهای ویندوز، و چگونگی اضافه کردن رویداد برای پیام هایی مثل WM_MOUSEENTER یا WM_MOUSELEAVE در این تالار وجود دارند، که شما می تونید به آنها مراجعه کنید.

Developer Programmer
سه شنبه 20 اسفند 1387, 12:40 عصر
چه فرق می کنه متغیر رو توی Private یا بعد از Var و قبل از Implementation تعریف کنیم ؟

البته شاید بهتر باشه این نکته رو بگم که Private فقط به کلاس جاری اشاره میکنه و هر فیلدی که توش تعریف بشه، فقط در همان کلاس قابل دسترسیه.
اگر در Protected تعریف بشن ، در کلاسهای فرزند اما اگه در Public تعریف بشه، در تمام کلاسها(فرزند و غیر فرزند) قابل دسترسیه .
var هم مشابه Public عمل میکنه. تصور من اینه که عبارت Var رو بورلند به خاطر حفظ سازگاری نسخه های اولیه پاسکال با دلفی اضافه کرده بود.

vcldeveloper
سه شنبه 20 اسفند 1387, 19:31 عصر
var هم مشابه Public عمل میکنه. تصور من اینه که عبارت Var رو بورلند به خاطر حفظ سازگاری نسخه های اولیه پاسکال با دلفی اضافه کرده بود.
نه. اگر من کدی مثل این داشته باشم:


TMyClass = class
public
X : integer;
end;

var
Y : integer;

میتونی بدون ساختن یک نمونه شی از TMyClass به X دسترسی داشته باشی؟! نمیتونی، ولی به Y میتونی. یعنی، برای دسترسی به X باید بنویسی:

MyClass := TmyClass.Create;
وگرنه X قابل دسترس نخواهد بود!

البته در نسخه های جدیدتر دلفی امکان تعریف class var اضافه شده، به این صورت:

TMyClass = class
public
class var
X : integer;
end;

در این صورت، میشه به X بدون نیاز به ساختن شی از TMyClass دسترسی داشت:

TMyClass.X
اون وقت میشه گفت که این X مشابه متغیر سراسری Y عمل میکنه.