هل ممكن للبروسيدر ان يرجع قيمه
#1
السلام عليكم

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

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


استطيع فعل هذا بلفونكشن
لاكن هدفي التعلم
الرد
#2
مبدءيا يمكن القول أنه من المستحيل على 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; 
Open Your Source .. Open Your Mind
الرد
#3
او ممكن كالتالى

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. 
الرد
#4
السلام عليكم

لا لا يمكن للـ 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; 
بارك الله فيك على السآل هذه الاسئلة هي التي تجعل منا نتعلم و نتقدم
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#5
السلام عليكم
إجابة s.fateh كافية
سبحان الله وبحمده سبحان الله العظيم
الرد
#6
يجدر الذكر أن ال 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; 
Open Your Source .. Open Your Mind
الرد
#7
SMP3 نعم معك حق حتى لو استخدمت var فان التمرير يبقى بالمرجع و هو الاستثاء الذي نسيت ذكرة
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد


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


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