ارجاع اكثر من قيمة باستخدام Function
#1
السلام عليكم 
هل يمكن للـ Function ان نعيد بها اكثر من قيمة 
في الدلفي يمكن للـ Function ان تعيد Record او Object او Varible و بالتالي يمكننا ان نجعل الـ Function ان تعيد لنا Record يحتوي على سلسلة من المتغيرات او Object يحتوي على العديد من الحقول Fields او نستخدم تمرير البرامترات بالمرجع ..

1- اعادة اكثر من قيمة باستخدام السجلات Records 

اولا نقوم بتعيرف بنية الـ Record في الـ Type Section 
PHP كود :
type

  TPerson 
= record
    FirstName
: string;
    LastName: string;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    function Ident(AFullName: string): TPerson;
  public
    { Public declarations }
  end; 

نقوم بانشاء Function حيث الناتج سيكون Record 
PHP كود :
    function Ident(AFullName: string): TPerson; 
الدالة ستكون كاتالي نمرر لها الإسم و اللقب مفصول بينهما بفراغ ' ' تقوم الدالة بالحصول على الإسم و اللقب..
PHP كود :
function TForm1.Ident(AFullName: string): TPerson;
var
  StringList: TStringList;
begin
  StringList
:= TStringList.Create;
  try
    StringList.DelimitedText := AFullName;
    Result.FirstName := StringList[0];
    Result.LastName  := StringList[1];
  finally
    StringList.Free;
  end;
end; 

للإستخدام نقوم بتعريف متغير من نمط الـ Record ثم نستدعي الدالة 

PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  Person: TPerson;
begin
  Person 
:= Ident('FATEH S');
  ShowMessage(Person.FirstName);
  ShowMessage(Person.LastName);
end; 

2- اعادة اكثر من قيمة باستخدام الاغراض Objects

نقوم بتعريف هيكلية الكلاس ملاحظة الذي تراه لا يتبع القواعد السليمة للـ OOP فقط لتوضيح فكرة اعادة اكثر من قيمة باستخدام Objects

PHP كود :
  TPerson = class
  private
    FFirstName: string;
    FLastName: string;
  end; 

الـ Function الخاصة بنا 
PHP كود :
function TForm1.Ident(AFullName: string): TPerson;
var
  StringList: TStringList;
begin
  Result 
:= TPerson.Create;
  StringList:= TStringList.Create;
  try
    StringList.DelimitedText := AFullName;
    Result.FFirstName := StringList[0];
    Result.FLastName  := StringList[1];
  finally
    StringList.Free;
  end;
end; 

و إستدعاء الـ Function

PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  Person: TPerson;
begin
  Person
:= Ident('FATEH S');
  try
    ShowMessage(Person.FFirstName);
    ShowMessage(Person.FLastName);
  finally
    Person.Free;
  end;
end; 

هل يفضل استخدام الـ Records او Classes و ما الفرق بنهما 
عندما تقوم بتمرير Record بين Functions في الحقيقة انت تنسخ البيانات من مكان الى مكان في الذاكرة بينما عندما تمرر Class فانت تمرر مؤشر Pointer لذلك اذا كان Record صغير لا ضير في ذلك في حالة كان الهيكل كبير الحجم يفضل استخدام الكلاسات

3- اعادة اكثر من قيمة باستخدام تمرير البرامترات بالمرجع 

ProtoType الـ Function نستخدم ناتج الإفتراضي للـ Function لإعادة FirstName و نستخدم التمرير بالمرجع لاعادة LastName
PHP كود :
function Ident(AFullName: string; var ALastName: string): string; 

الـ Function 
PHP كود :
function TForm1.Ident(AFullName: string; var ALastName: string): string;
var
  StringList: TStringList;
begin
  StringList
:= TStringList.Create;
  try
    StringList.DelimitedText := AFullName;
    Result := StringList[0];
    ALastName  := StringList[1];
  finally
    StringList.Free;
  end;
end; 

و الإستدعاء 

PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  LastName: string;
  FirstName: string;
begin
  FirstName
:= Ident('FATEH S', LastName);
  ShowMessage(FirstName);
  ShowMessage(LastName);
end; 
بالتوفيف و السلام عليكم
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 8 users say قال شكرا ل S.FATEH على المشاركة المفيدة
  • Ben.Ja, أبو معاذ, محمد عبد العزيز, h-farid, bassem_43, delphi17, Delphi4Us, ELARAPY
الرد
#2
بورك فيك, يمكن أيضًا استخدام Array of string or int, etc, بعد تعريفه كنوع بيانات خاص:
Dynamic:

PHP كود :
type
TMyArrayOfStrings 
= array of string; 

or Static:
PHP كود :
type
TMyArrayOfStrings 
= array [0..1] of string; 

ثم استخدامه:
PHP كود :
function myFunc(aPrm: type): TMyArrayOfStrings;
begin
// code...
  SetLength(result, 2 ); // if using a dynamic array.
  Result[0] := '';
  Result[1] := '';
end. 
[-] كل من 5 users say قال شكرا ل Ben.Ja على المشاركة المفيدة
  • S.FATEH, h-farid, bassem_43, Delphi4Us, ELARAPY
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم