PDA

View Full Version : سوال: اضافه کردن مقادیر پیشفرض برای توابعی که فقط 1 مقدار پیشفرض دارند



Mask
شنبه 23 شهریور 1392, 20:27 عصر
در نوشتن تابع فقط میتونم اعلام کنم ، اگر فلان پارامتر براش نوشته نشد ، فلان مقدار رو جایگزین کن ، که مشکل این تیپ کد نویسی این هست که اگر این پارامتر وسط کد کال کننده باشه نمیشه چیزی براش در نظر نگرفت ، که تابع مقدار پیش فرضش رو قرار بده ، پس مجبوریم مقدار ('' خالی) بهش پاس بدیم.
که در این صورت مقدار پیشفرض براش در نظر گرفته نمیشه و مقدار خالی ثبت میشه . چطور میتونیم در اعلان تابع طوری تعریف کنم که وقتی مقدار ('' خالی) بود ، همان مقدار پیشفرض براش در نظر گرفته بشه ؟
مثال زیر رو ببینید :

function test(Name: string = 'All'; Famil: string = 'All';
Password: string = 'NoSet'): Boolean;
var
ini: TIniFile;
begin
try
ini := TIniFile.Create('c:\ini.ini');
try
ini.WriteString('option', 'Name', Name);
ini.WriteString('option', 'Famil', Famil);
ini.WriteString('option', 'Password', Password);
Result := True;
finally
ini.Free;
end;
except
Result := False;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not test('ali','','12345') then
ShowMessage('Error Write file');
end;
توی این مثال من پارامتر فامیل رو مثلا نمیدونم: اولا نمیتونم متنی ارسال نکنم و نال باشه ، چون قاط میزنه برنامه ، پس مجبورم مقدار خالی بفرستم . در صورتی که خالی هم نمیخام ، میخام مقدار پیشفرض به جای خالی باشه . در این چنین مورد ها سریعترین و کوتاهترین کدی که میشه نوشت چیه؟

MohsenB
شنبه 23 شهریور 1392, 22:50 عصر
سلام

دوتا راه الان به ذهنم میرسه :

1. از overload کردن توابع استفاده نمایید . البته باید یجورایی تابع رو سازماندهی کنید اگر نوع مقادیر یکی باشند :

function test(Name: string = 'All'; Famil: string = 'All';
Password: string = 'NoSet'): string; overload;
function test(Name: string = 'All'; Password: string = 'NoSet'): string; overload;
function test(Name: string = 'All'): string; overload;

...

function test(Name: string = 'All'; Famil: string = 'All';
Password: string = 'NoSet'): string;
begin
Result:= Name + ' . ' + Famil + ' . ' + Password;
end;

function test(Name: string = 'All'; Password: string = 'NoSet'): string;
begin
Result:= Name + ' . ' + 'All' + ' . ' + Password;
end;

function test(Name: string = 'All'): string;
begin
Result:= Name + ' . ' + 'All' + ' . ' + 'NoSet';
end;

و یا یه نوع جدید بسازید :

type
TMyName =string;
TMyFamil =string;
TMyPass =string;

function test(Name: TMyName = 'All'; Famil: TMyFamil = 'All';
Password: TMyPass = 'NoSet'): string; overload;
function test(Name: TMyName = 'All'; Famil: TMyFamil = 'All'): string; overload;
function test(Name: TMyName = 'All'): string; overload;

...

function test(Name: TMyName = 'All'; Famil: TMyFamil = 'All';
Password: TMyPass = 'NoSet'): string;
begin
Result:= Name + ' . ' + Famil + ' . ' + Password;
end;

function test(Name: TMyName = 'All'; Famil: TMyFamil = 'All'): string;
begin
Result:= Name + ' . ' + Famil + ' . ' + 'NoSet';
end;

function test(Name: TMyName = 'All'): string;
begin
Result:= Name + ' . ' + 'All' + ' . ' + 'NoSet';
end;

2. ویا میتونید پیشفرض ها رو بصورت عمومی تعریف کنید و هرجای خالی رو با اون پر کنید :

const
DEF_NAME = 'All';
DEF_FAMIL = 'All';
DEF_PASS = 'NoSet';


function test(Name: string = DEF_NAME; Famil: string = DEF_FAMIL;
Password: string = DEF_PASS): string;

...

function test(Name: string = DEF_NAME; Famil: string = DEF_FAMIL;
Password: string = DEF_PASS): string;
begin
Result:= Name + ' . ' + Famil + ' . ' + Password;
end;
// مثال :
procedure TForm1.btn1Click(Sender: TObject);
begin
btn1.Caption:= test('Mohsen', DEF_FAMIL, '122');
end;

موفق باشید

Ananas
شنبه 23 شهریور 1392, 23:44 عصر
سلام.
اشاره گر هم خوبه به نظرم:

function test(
Name: PWideChar;// = 'All';
Famil: PWideChar;// = 'All';
Password: PWideChar// = 'NoSet'
): Boolean;
var
ini: TIniFile;
begin
try
ini := TIniFile.Create('d:\ini.ini');
try
if (Name = nil) then Name := 'All';
if (Famil = nil) then Famil := 'All';
if (Password = nil) then Password := 'NoSet';
ini.WriteString('option', 'Name', Name);
ini.WriteString('option', 'Famil', Famil);
ini.WriteString('option', 'Password', Password);
Result := True;
finally
ini.Free;
end;
except
Result := False;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if not test('ali',nil,'12345') then
ShowMessage('Error Write file');
end;

Ananas
یک شنبه 24 شهریور 1392, 00:03 صبح
اصلا اینم میشه:

function test(
Name: string;// = 'All';
Famil: string;// = 'All';
Password: string// = 'NoSet'
): Boolean;
var
ini: TIniFile;
begin
try
ini := TIniFile.Create('d:\ini.ini');
try
if (Name = '') then Name := 'All';
if (Famil = '') then Famil := 'All';
if (Password = '') then Password := 'NoSet';
ini.WriteString('option', 'Name', Name);
ini.WriteString('option', 'Famil', Famil);
ini.WriteString('option', 'Password', Password);
Result := True;
finally
ini.Free;
end;
except
Result := False;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if not test('ali','','12345') then
ShowMessage('Error Write file');
end;

Mask
یک شنبه 24 شهریور 1392, 16:51 عصر
ممنون از دوستان عزیز بابت کد : اما :
دوست عزیز ، Ananas : این یه مثال بود که 3 پارامتر داشت و در برنامه ای که میخام بنویسم ، حدود 15 تا پارامتر هست ،که البته خودم هم همین کد رو نوشته بودم ، اما اگه بخواهیم به این روش بریم جلو 15 تا IF باید بنویسم که زیاد جالب نیست.(بیشتر مد نظرم تغییر در نوشتن اعلان فانکشن به صورت دریافت دو مقدار به صورت پیشفرض بود)
و دوست خوبم MohsenB :بیشتر مد نظرم تغییر در نوشتن اعلان فانکشن به صورت دریافت دو مقدار به صورت پیشفرض بود. نه نوشتن Type خاص.
بیشتر کد نویسی جمع و جور مد نظرم بود.
به هر حال ممنون از وقتی که گزاشتید.

یوسف زالی
یک شنبه 24 شهریور 1392, 17:27 عصر
مگه هنوز مشکلت حل نشده؟
اگر هنوز نیاز داری، بریم تو فاز (بندری :لبخند:) نوشتن تابع با پارامتر های باز و مقادیر پیش فرض..