PDA

View Full Version : انتقال مقدار بين اشيا در فرمها



rezamahdizadeh
چهارشنبه 19 تیر 1387, 08:05 صبح
مي خواهيم يك فرمي داشته باشيم كه فرمهاي ديگر آن را باز كنند و نتيجه محاسبه شده در آن فرم را را در داخل Edit ها يا ComboBox هايي در فرمهاي فراخواننده باز گرداند بهترين راه براي انتقال مقدار محاسبه شده چيست چون در حالت كلي هر فرم و داخل همان فرم ممكن است چند Edit يا چند Combobox وجود داشته باشد؟ در اينجا مطابق شكل ضميمه 2 تا فرم داريم كه كاربر روي هر دكمه اي كليك كرد فرم ماشين حساب باز مي شود و مقدار محاسبه شده در فرم ماشين حساب به EditBox مربوط به آن دكمه ريخته شود. بهترين راه چيست؟

vcldeveloper
چهارشنبه 19 تیر 1387, 16:46 عصر
1-
یک Property جدید به فرم ماشین حسابتون، در بخش Public اضافه کنید، مثلا CalcResult:


TMyCalcForm = class(TForm)
private
FCalcResult : double;
public
property CalcResult : double read FCalcResult;
end;
در هنگام بسته شدن فرم - در رویداد OnClose - مقدار محاسبه را در این Property بریزید.
فرمی که فرم ماشین حساب را فراخوانی کرده، میتونه با خواندن این Property نتیجه محاسبه را بدست بیاره.

2-
یک class function به کلاس فرم ماشین حساب اضافه کنید که وظیفه اش نمایش فرم و برگرداندن نتیجه محاسبه باشه. در این صورت، فرم های دیگه می توانند این تابع را فراخوانی کنند و مقدار برگشتی اش را دریافت کنند. مثلا یه چیزی شبیه این:


TMyCalcForm = class(TForm)
...
public
class function Execute: double;
end;

implementation

class function Execute: double;
var
MyCalc : TMyCalcForm;
begin
Result := 0.0;
MyCalc := TMyCalcForm.Create(nil);
try
MyCalc.ShowModal;
Result := StrToFloat(edtResult.Text);
finally
MyCal.Free;
end;
end;

و برای فراخوانی اش از سایر فرم ها:


procedure TForm1.Button1Click(Sender: TObject);
begin
CalcResult := TMyCalcForm.Execute;
end;

babak_delphi
پنج شنبه 20 تیر 1387, 02:50 صبح
ببخشید نمیشد به جای class function از function استفاده کرد؟

vcldeveloper
پنج شنبه 20 تیر 1387, 02:54 صبح
ببخشید نمیشد به جای class function از function استفاده کرد؟

اون وقت باید قبل از هر بار فراخوانی اون تابع، فرم را Create کنید! ولی ما در اینجا از class function استفاده کردیم تا لازم نباشه خودمون فرم را Create کنیم، و انجام این کار بر عهده خود class function باشه. لزومی هم نداره که فرم های فراخوان خودشون اون کار رو انجام بدند. این فرم ها فقط نتیجه محاسبه رو می خوان، نه چیز دیگه.

rezamahdizadeh
شنبه 22 تیر 1387, 13:26 عصر
در هنگام بسته شدن فرم - در رویداد OnClose - مقدار محاسبه را در این Property بریزید.
فرمی که فرم ماشین حساب را فراخوانی کرده، میتونه با خواندن این Property نتیجه محاسبه را بدست بیاره
آيا با اجراي OnClose كلاس و در نتيجه اين Property از بين نمي ره(اگر هم نرود ما براي آزاد سازي حافظه دستورات Free و مقداردهي به نال را مي نويسيم.)

vcldeveloper
شنبه 22 تیر 1387, 16:42 عصر
يا با اجراي OnClose كلاس و در نتيجه اين Property از بين نمي ره(اگر هم نرود ما براي آزاد سازي حافظه دستورات Free و مقداردهي به نال را مي نويسيم.)
تا زمانی که شی را Free نکنید، مقادیر فیلدهای آن از بین نمیره. وقتی فرم را می بندید، هنوز Free نشده، مقدار آن فیلد یا Property را می توانید توسط فرم فراخوان بخوانید و بعد فرم را Free کنید. در کد بالا هم همین کار انجام شده، ابتدا مقدار Property مربوطه به Result اختصاص داده شده، بعد فرم Free شده:


class function Execute: double;
var
MyCalc : TMyCalcForm;
begin
Result := 0.0;
MyCalc := TMyCalcForm.Create(nil);
try
MyCalc.ShowModal;
Result := StrToFloat(edtResult.Text);
finally
MyCal.Free;
end;
end;

rezamahdizadeh
شنبه 22 تیر 1387, 17:25 عصر
دستور Free در داخل فرم فراخواننده نيست بعد از كد شامل edtResult.Text خطا مي گيرد به اين شرح Instance Variable 'edtResult' inaccessible here

vcldeveloper
یک شنبه 23 تیر 1387, 01:38 صبح
دستور Free در داخل فرم فراخواننده نيست بعد از كد شامل edtResult.Text خطا مي گيرد به اين شرح Instance Variable 'edtResult' inaccessible here
کد را اشتباه نوشتید.
کدی که برای فراخوانی فرم مربوطه نوشتید را اینجا قرار بدید. در ضمن، توجه داشته باشید که در کد بالا edtResult یک نام فرضی برای کنترل Edit ایی است که نتیجه محاسبه را نمایش می دهد. لزوما نام آن کنترل در فرم شما edtResult نیست.

rezamahdizadeh
یک شنبه 23 تیر 1387, 07:43 صبح
البته من هم مي دانستم كه edtResult نام متغير فرضي است و متن پيغام خطا مي گويد كه به نمونه متغير edtResult از اينجا قابل دسترسي نيست در مورد حوزه تعريف مشگل وجود دارد. جالب است كه در قسمت private كلاس متغيري تعريف كردم اما در class string قابل استفاده نيست. آقاي كشاورز آيا ممكنه خودتون هم امتحان كنيد؟