delphi4arab منتديات دلفي للعرب
هل ممكن للبروسيدر ان يرجع قيمه - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : هل ممكن للبروسيدر ان يرجع قيمه (/showthread.php?tid=5500)



هل ممكن للبروسيدر ان يرجع قيمه - noor - 31-08-2013

السلام عليكم

كما اعرف ان الفونكشن يرجع لنا قيمه عكس البروسيدر
لاكني سمعت من الممكن للبروسيدر ان يرجع قيمه

ممكن احد يعطيني مثال صغير


استطيع فعل هذا بلفونكشن
لاكن هدفي التعلم


هل ممكن للبروسيدر ان يرجع قيمه - SMP3 - 31-08-2013

مبدءيا يمكن القول أنه من المستحيل على Procedure أن يرجع أي قيمة .
لكن يمكن أن يفعل في حال تم استخدام الأسمبلي أو طرق ملتوية :
مثال على السريع :
PHP كود :
procedure Sum(a,b:integer);
asm
  add eax
,edx
end
;
procedure TForm3.Button1Click(Sender: TObject);
var 
sResult:integer;
begin
   Sum
(2,4);
  
asm
    MOV sResult
,EAX
  end
;
  
Caption:=IntToStr(sResult);
end; 


مثال ثاني :
PHP كود :
procedure Sum(a, b: integer);
begin
  SetLastError
(a + b);
end;

function 
GetResult: integer;
begin
  Result 
:= GetLastError;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  
sResult: integer;
begin
  Sum
(2, 4);
  
sResult := GetResult;
  
Caption := IntToStr(sResult);
end; 



هل ممكن للبروسيدر ان يرجع قيمه - Coldzer0 - 31-08-2013

او ممكن كالتالى

PHP كود :
program Project1;

{
$APPTYPE CONSOLE}

uses
  SysUtils
;
var
  
Value : Integer;

procedure Sum(a,b:Integer; var result: Integer);
begin
  result 
:= a + b;
end;

begin
  sum
(5,5,Value);
  
Writeln(value);
  
Readln;
end. 



هل ممكن للبروسيدر ان يرجع قيمه - S.FATEH - 31-08-2013

السلام عليكم

لا لا يمكن للـ 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; 
بارك الله فيك على السآل هذه الاسئلة هي التي تجعل منا نتعلم و نتقدم


هل ممكن للبروسيدر ان يرجع قيمه - Agmcz - 31-08-2013

السلام عليكم
إجابة s.fateh كافية


هل ممكن للبروسيدر ان يرجع قيمه - SMP3 - 31-08-2013

يجدر الذكر أن ال Object تستخدم التمرير بالمرجع (لا وجود للتمرير بالقيمة)
PHP كود :
type
  TMyObj 
= class
  private
    
FMyPropertyStr: string;
    
FMyPropertyInt: Integer;
    
property MyPropertyStr: string read FMyPropertyStr write FMyPropertyStr;
    
property MyPropertyInt: Integer read FMyPropertyInt write FMyPropertyInt;

  
end;

//---------------------------------------------
procedure DoSomething(m: TMyObj);
begin
  m
.MyPropertyStr := 'Test';
  
m.MyPropertyInt := 20;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  
MyObj: TMyObj;
begin
  MyObj 
:= TMyObj.Create;
  
MyObj.MyPropertyInt := 10;
  
MyObj.MyPropertyStr := 'Hi';
  
DoSomething(MyObj);
  
Caption := MyObj.MyPropertyStr + ' -- ' + IntToStr(MyObj.MyPropertyInt);
  
MyObj.Free;
end; 



هل ممكن للبروسيدر ان يرجع قيمه - S.FATEH - 31-08-2013

SMP3 نعم معك حق حتى لو استخدمت var فان التمرير يبقى بالمرجع و هو الاستثاء الذي نسيت ذكرة