PDA

View Full Version : متغیر global



yazdan
دوشنبه 18 اسفند 1382, 10:47 صبح
در دلفی چگونه می توان متغیر global تعریف کرد.

hr110
دوشنبه 18 اسفند 1382, 11:11 صبح
با سلام

دوست عزیز راههای مختلفی برای این منظور وجود دارد که میتوانید یکی از انها را استفاده کنید ولی اخری از همه بهتر میباشد:
1- متغییر مربوطه را در بالای implementation یکی از یونیتها که در تمامی یونیتها صدا شده است تعریف شود. من در تمامی پروژه ها معمولا یک یونیت با نام common دارم که تمامی متغییرها و کلاسهای مشترک در ان تعریف شده است و این یونیت را در تمامی یونیتهای برنامه به اصطلاح use میکنم.
2- راه دوم استفاده از یک کلاس میباشد، به این صورت که تمامی متغییرها را در کلاس تعریف کرده و این کلاس نیز باید به شکل Singlton پیاده سازی شود و متغییرهای خود را با استفاده از پراپرتیهایی که در کلاس تعریف مینمایم مقداردهی و فراخوانی(خواندن) مینمایید. اگر قرار است در یک تیم کارکنید و برنامه شما هم به زبان عامیانه پدر مادر دار است از این روش استفاده کنید


موفق باشید.

JavanSoft
دوشنبه 18 اسفند 1382, 13:23 عصر
برنامه شما هم به زبان عامیانه پدر مادر دار است
اصطلاح باحالی بود

FirstLine
دوشنبه 18 اسفند 1382, 13:33 عصر
با سلام

راه دوم استفاده از یک کلاس میباشد، به این صورت که تمامی متغییرها را در کلاس تعریف کرده و این کلاس نیز باید به شکل Singlton پیاده سازی شود و متغییرهای خود را با استفاده از پراپرتیهایی که در کلاس تعریف مینمایم مقداردهی و فراخوانی(خواندن) مینمایید.

امکان داره یه ذره بیشتر در این مورد توضیح بدهید؟
با تشکر

مهدی کرامتی
دوشنبه 18 اسفند 1382, 14:39 عصر
منم علاقه‌مندم ببینم روش پیاده سازی کلاس بصورت Singleton چگونه است. اگر ممکن است بیشتر توضیح دهید.

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
sGlobalUsername:String; // این متغیر چون در اینجا تعریف شده حکم فیلد کلاس فرم را دارد
end;
و بعدا میتواند به اینصورت به آن مراجعه کرد:

Form1.sGlobalUsername
مثلا:

Form1.sGlobalUsername := 'Reza';
و یا:

SomeVariable := Form1.sGlobalUsername
برای در دسترس بودن Form1 در یونیت‌های دیگر باید یونیت حاوی Form1 را در آنها Use کنید.

Behzad_Asharkhan
دوشنبه 18 اسفند 1382, 15:22 عصر
سلام

یه روش خوب برای تعریف متغیر های گلوبال اینه که یه یونیت جدید به نام GlobalVars.pas به پروژت اضفه کنی و هر چیزی که میخوای گلوبال باشه ( Type ، Procedure ، Function ، Class ، Var .. ) اون تو تعریف کنی و هر جا لازمه Use کنی.
اینطوری برنامه خیلی خوانا تره و حتی چند سال بعد هم میشه با یه نگاه به برنامه متغیرهای گلوبال رو پیدا کرد.
ساختارش میتونه شبیه زیر باشه.


unit GlobalVars;

interface

uses
// needed units;

type
TGlobalType1 = (gtFirst, gtSecond);
...

TGlobalClass1 = Class
...
private
...
{ Private declarations }
public
...
{ Public declarations }
end;
...

var
MyVar1: integer;
MyVar2: string;
....

function MyGlobalProcedure1;
...

implementation

//********************************

Constructor TGlobalClass1.create;
begin
...
end;

procedure MyGlobalProcedure;
begin
...
end;

end.

مهدی کرامتی
دوشنبه 18 اسفند 1382, 15:34 عصر
اینم یک روش خوبه که اتفاقا منم تو کارهام ازش استفاده میکنم.

Delphi-Clinic
دوشنبه 18 اسفند 1382, 16:53 عصر
سوال خوب.

جواب ها عالی و کلاسیک :)

دوستان متشکرم.

hr110
سه شنبه 19 اسفند 1382, 11:30 صبح
با سلام
با روش singlton فکر کنم خیلی از برنامه نویسها اشنا باشند، من به این صورت تعریف میکنم:
نوعی از پیاده سازی کلاسهای میباشد که شما در هنگام استفاده از متدها نیازی به object(که همان instance ایی از کلاس میباشد) ندارید ، متدی که شما به این صورت استفاده میکنید از نوع متدهای class میباشد.

الان بیش از این وقت ندارم انشاء الله بعد از نهار و نماز اگر زنده ماندم یک مثال برای درک بهتر آن خدمتتان خواهم نوشت که هم روش singlton در ان باشد و هم متغییرهای نوع Global



..... گلوبال اینه که یه یونیت جدید به نام GlobalVars.pas...
این روش را که بنده هم یک توضیح مختصری داده بودم

به امید دیدار

hr110
سه شنبه 19 اسفند 1382, 13:26 عصر
با سلام؛

برای آنکه مطلب واقعاً کاربردی باشد، در ذیل یکی از کلاسهایی که در تمامی پروژه ها از ان استفاده میکنم را خدمتتان معرفی مینمایم، کلاس مربوطه به Accounting پروژه:


unit Users;

interface

uses
Classes, Forms, Controls;

type

TUser = class(TComponent)
private
procedure SavePassword(s:string);
function GetPassword:string;
public
FID : string;
FPassword : string;
class function getUser : TUser;
property Password:string read GetPassword Write SavePassword;
end;

var
User : TUser;

implementation
uses
Dialogs,Sysutils;

{TUser}

function TUser.GetPassword: string;
begin
Result:=FPassword;
end;

procedure TUser.SavePassword(s: string);
begin
FPassword:=S;
// Format('update users set password=%S where ID=%s',[QuotedStr(FPassword),QuotedStr(FID)]);
end;

class function TUser.getUser: TUser;
begin
if User=nil then
begin
if MessageDlg('Please type Username & Password : ',mtConfirmation,mbOKCancel,0)<>mrOK then
begin
Application.Terminate;
end
else
begin
User:=TUser.Create(nil);
//ID:='hr';
User.Password:='110';
end;
end;
Result:=User;
end;

end.

یک مثال از روش استفاده از این کلاس، توجه کنید که تنها خط زیر کافی است و نیازی به create و..... ندارد:


procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=TUser.GetUser.Password;
end;

مسئله اصلی روش نوشتن کد متد getUser میباشد(چون singlton ابتدا در جاوا مطرح شده است بنابراین نام این متد را به روش جاوایی نوشتم :idea: ) در پروژه شما در اولین فراخوانی این متد ابجکت ایجاد شده و در دفعات بعد تنها اینستن آن برگردنده میشود، بنابراین کافی است که در اولین فرمی که یکی از اجزاء کلاس user (در این مثال تنها جزء password پیاده سازی شده است و مابقی فیلدها را نیز خودتان گسترش دهید) صدا شود ، فرم مربوط به لاگین نیز به کاربر نمایش داده شده و کاربر باید به سیستم وارد شود و در غیر اینصورت از برنامه خارج خواهد شد، بنابراین کافی است مثال بالا را در oncreateform فرم اصلی قرار دهید( :?: )



در این مثال من سعی کرده ام که کلمه عبور کاربر را که میتواند در یک پروژه متغییر global باشد را با استفاده از یک کلاس پیاده سازی کنم، این روش همانطور که گفتم یک روش پدر و مادر دار است. توجه شما را به نحوه تعریف این متغییر در کلاس هم جلب میکنم. همانطور که مشاهده میشود از property و دو متد با نامهای getpassword و setpassword استفاده شده است.
روش تعریف یک متغییر در کلاس به این روش، یک روش مطمئن یا safe میباشد چرا که اگر متدهای read و write آن پراپرتی صحیح و جامع پیاده سازی شود، در هنگام استفاده از متغییر (چه خواندن مقدار و چه تغییر مقدار آن) از اشتباهات و خطاها جلوگیری شده و میتوان مطمئن از متغییرهای global در هرکجای سیستم استفاده نمود و اعضای دیگر تیم برنامه نویسی هم بدون اینکه وارد جزئیات شوند و یا بخواهند که تمام کنترلها و ... را در هنگام استفاده از آن داشته باشند میتوانند از سورسهای شما استفاده کنند. برای درک مسئله شما فرض کنید که قرار است در پروژه شما کلمه عبور کاربران حداقل 3 کاراکتر باشد و اگر طول کلمه عبور کمتر از 3 کاراکتر بود سریعاً از کاربر خواسته شود که کلمه عبور صحیح را وارد کند؛ پر واضح است که شرط اول را باید در متد write و شرط دوم را در متد read پراپرتی کلمه عبور چک کرده و سورس کد مروطه را بنویسیم. حال با این کار هر کدامیک از برنامه نویسان تیم(از جمله خودتان) بدون واهمه میتوانید از این کلاس استفاده نماید و مطمئن باشید که خواسته کارفرمایتان در مورد کلمه عبور اجرا شده است.




امیدوارم که این مطلب خوانا و موثر واقع شده باشد.