31-08-2013, 12:07 PM
السلام عليكم
لا لا يمكن للـ procedure ان يعيد قيمة بنفس مفهوم function
لكن يمكن ان تغير مباشرة في متغيرات البرامترات الممررة اذا تم تمريرها بالمرجع
ما هو التمرير بالمرجع و ما هو التمرير بالقيم
بداية قم بتعريف التالي
لنلاحظ المثال التالي:
قمنا باعطاء قيم للمتغير s عند بداية التشغيل سنقوم بتمرير المتغير الى اجرائين مختلفين الاول نمرر فيه المتغير بالقيمة و الثاني نمرر المتغير بالمرجع ثم نقوم باجراء بعض العمليات التغييرات على المتغير s لنلاحظ كيف بتأثر المتغير الاصلي
هنا قمنا باسناد قيمة جديدة للمتغير s المفروض ShowMessage ستضهر لنا 'Pass by value' لكن
الذي يضهر هو 'Delphi4Arab' هذا لاننا قمنا باستخدام التمرير بالقيمة الـ procedure سيقوم بانشاء نسخة من المتغير المرر لذلك مهما قمت باجراء التغييرات لن يتأثر المتغير الاصلي
هنا استخدمنا التمرير بالمرجع اي ان التغيرات التي تحدثها في المتغير يتم عكسها على المتغير الاصلي للتمرير بالمرجع يكفي ان تضيف var قبل المتغير
مثال من الدلفي الـ procedure الحذف Delete يستخدم التمرير بالمرجع
بارك الله فيك على السآل هذه الاسئلة هي التي تجعل منا نتعلم و نتقدم
لا لا يمكن للـ procedure ان يعيد قيمة بنفس مفهوم function
لكن يمكن ان تغير مباشرة في متغيرات البرامترات الممررة اذا تم تمريرها بالمرجع
ما هو التمرير بالمرجع و ما هو التمرير بالقيم
بداية قم بتعريف التالي
PHP كود :
private
s: string;
procedure DoSomthingWithS(s: string);
procedure DoSomthingToS(var s: string);
لنلاحظ المثال التالي:
PHP كود :
procedure TForm1.FormCreate(Sender: TObject);
begin
s := 'Delphi4Arab';
end;
قمنا باعطاء قيم للمتغير s عند بداية التشغيل سنقوم بتمرير المتغير الى اجرائين مختلفين الاول نمرر فيه المتغير بالقيمة و الثاني نمرر المتغير بالمرجع ثم نقوم باجراء بعض العمليات التغييرات على المتغير s لنلاحظ كيف بتأثر المتغير الاصلي
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
begin
DoSomthingWithS(s); // pass by value
ShowMessage(s);
DoSomthingToS(s); // pass by reference
ShowMessage(s);
end;
PHP كود :
procedure TForm1.DoSomthingWithS(s: string);
begin
s := 'Pass by value';
end;
هنا قمنا باسناد قيمة جديدة للمتغير s المفروض ShowMessage ستضهر لنا 'Pass by value' لكن
الذي يضهر هو 'Delphi4Arab' هذا لاننا قمنا باستخدام التمرير بالقيمة الـ procedure سيقوم بانشاء نسخة من المتغير المرر لذلك مهما قمت باجراء التغييرات لن يتأثر المتغير الاصلي
PHP كود :
procedure TForm1.DoSomthingToS(var s: string);
begin
s := 'Pass by reference';
end;
هنا استخدمنا التمرير بالمرجع اي ان التغيرات التي تحدثها في المتغير يتم عكسها على المتغير الاصلي للتمرير بالمرجع يكفي ان تضيف var قبل المتغير
مثال من الدلفي الـ procedure الحذف Delete يستخدم التمرير بالمرجع
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s:= 'Delphi4Arab';
Delete(s, 1, 4);
ShowMessage(s);
end;
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج

