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

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

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

  TPerson 
record
    FirstName
string;
    LastNamestring;
  end;

  TForm1 = class(TForm)
    Button1TButton;
    Edit1TEdit;
    Edit2TEdit;
    procedure Button1Click(SenderTObject);
  private
    function Ident(AFullNamestring): TPerson;
  public
    { Public declarations }
  end

نقوم بانشاء Function حيث الناتج سيكون Record 
PHP كود :
    function Ident(AFullNamestring): TPerson
الدالة ستكون كاتالي نمرر لها الإسم و اللقب مفصول بينهما بفراغ ' ' تقوم الدالة بالحصول على الإسم و اللقب..
PHP كود :
function TForm1.Ident(AFullNamestring): TPerson;
var
  StringListTStringList;
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(SenderTObject);
var
  PersonTPerson;
begin
  Person 
:= Ident('FATEH S');
  ShowMessage(Person.FirstName);
  ShowMessage(Person.LastName);
end

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

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

PHP كود :
  TPerson = class
  private
    FFirstNamestring;
    FLastNamestring;
  end

الـ Function الخاصة بنا 
PHP كود :
function TForm1.Ident(AFullNamestring): TPerson;
var
  StringListTStringList;
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(SenderTObject);
var
  PersonTPerson;
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(AFullNamestring; var ALastNamestring): string

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

و الإستدعاء 

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

PHP كود :
type
TMyArrayOfStrings 
= array of string

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

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


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


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف