PDA

View Full Version : یک فرم و عمل های متعدد



Hsimple11
پنج شنبه 28 شهریور 1387, 22:34 عصر
با سلام.

فرم جستجویی دارم که هر قسمتی از برنامه کاربر میتواند آن را باز کند و جستجو کند. یعنی ممکنه در هر قسمتی و هر فرمی که قرار دارد، این فرم جستجو را باز کند.

ولی بر حسب اینکه الان کاربر در چه قسمتی است که این فرم جستجو را باز کرده، باید نتایج جستجو بر روی همان قسمت اعمال شود. مثلا اگر در بخش گزارش گیری این فرم فرا خوانده می شود، باید نتایج جستجو در همان بخش آورده شود و اگر....

از اونجا که این فرم یکی است و همیشه از روی دکمه ای بر روی فرم اصلی برنامه Show می شود ، میخواستم ببینم بهترین راه چیست.

اینکه با زدن دکمه اعمال نتایج روی فرم جستجو، (IF Assigned(Form1 های زیادی برای تمام فرمها داشته باشیم که هرفرم الان ساخته شده، تغییرات به تناسب همان فرم اعمال شوند؟ مثلا :

Search.EmaleNatayejOnClick

IF Assigned(Form1) Then
Begin
....
End;

IF Assigned(Form2) Then
Begin
....
End;

IF Assigned(Form3) Then
Begin
....
End;
و الی آخر برای همه فرمها....


یا مثلا یک متغیر Global داشته باشیم که با نمایش هر فرم مقدار خاصی بگیرد و بجای IF های Case...OF اون متغیر رو چک کنیم؟

شما چه راهی پیشنهاد میکنید؟


واقعا ممنونم.....

shervin farzin
جمعه 29 شهریور 1387, 00:27 صبح
سلام
من همين كارو يه مدتي قبل انجام دادم و از همون تكنيك متغير Global استفاده كردم و
هيچ مشكلي پيش نيومد . شايد لازم باشه بگم تعداد فرمهاي ريفرنس در برنامه من 12 تا بود .
موفق باشيد .

Hsimple11
جمعه 29 شهریور 1387, 00:34 صبح
مرسی ولی تعداد فرمهای من بیشتره. در ضمن فکر میکنم Assigned راهکار ساده تری باشه چون متغیر باید برای هر فرم هم در زمان ساخت و هم تخریب دوبار مقدار دهی بشه.

vcldeveloper
جمعه 29 شهریور 1387, 02:06 صبح
من ترجیح میدم یک class function بنویسم به بنام Execute، و براش یک پارامتر ورودی هم در نظر بگیرم که مشخص کنه چه فرمی فرم جستجوی من را فراخوانی کرده، سپس یک شی از فرم جستجو در اون class function بسازم، و مقدار پارامتر ورودی را هم به یکی از فیلدهای شی ساخته شده نسبت بدم. بعد در رویداد OnShow اون فرم بررسی کنم که مقدار اون فیلد چی بوده، و براساس اون ظاهر فرم را تغییر بدم. اینطوری هر فرمی که نیاز به فرم جستجو داره، فقط Execute را فراخوانی میکنه و پارامتر مربوط به خودش را بهش میده، مابقی کارها از دید فرم فراخوان مخفی میمونه و به فرم جستجو مربوط میشه. مثال:


TSearchForm = class(TForm)
procedure SearchFormOnShow(Sender: TObject);
private
FCaller : TComponent;
public
property Caller: TComponent read FCaller write FCaller;
constructor Create(AOwner, ACaller : TComponent);
class function Execute(Caller: TComponent): Boolean;
end;

/////////////////////////////////////////////////////////////////
constructor Create(AOwner, ACaller: TComponent);
begin
inherited Create(AOwner);
FCaller := ACaller;
end;

class function Execute(Caller: TComponent): Boolean;
var
Form : TSearchForm;
begin
Form := TSearchForm.Create(nil,Caller);
try
Result := (Form.ShowModal = mrOK);
finally
Form.Free;
end;
end;

procedure SearchFormOnShow(Sender: TObject);
begin
if not Assigned(FCaller) then Exit;

if FCaller.ClassName = 'TForm1' then
begin

end
else
if FCaller.ClassName = 'TForm2' then
begin

end
else
begin

end;
end;

نحوه استفاده:



if TSearchForm.Execute(TForm1) then
//Do something

Hsimple11
جمعه 29 شهریور 1387, 14:37 عصر
با تشکر فراوان.

1- چرا باید از Class Function در اینجا استفاده کرد؟

2- فرم جستجوی من از روی هر فرم فراخوانده نمی شود. همانطوری که گفتم این فرم از روی فرم اصلی که همیشه نمایان است نمایش داده می شود و نیازی به تغییر ظاهر اون ندارم. البته این راه حلی که گفتید بسیار عالیه که بر اساس فیلد ورودی شیئ ساخته شده را تغییر دهم. ولی فرم جستجو از روی هر فرم باز نمی شود.

3- در مورد این دو خط میشه بیشتر توضیح بدید؟


Form := TSearchForm.Create(nil,Caller);
try
Result := (Form.ShowModal = mrOK);



Form1.ShowModal = mrOK از نوع Boolean است؟

vcldeveloper
جمعه 29 شهریور 1387, 18:12 عصر
1- چرا باید از Class Function در اینجا استفاده کرد؟
برای اینکه در هر بار فراخوانی فرم جستجو، کد فراخوان مجبور نباشه یک نمونه از فرم جستجو را Create کنه. اگر به فراخوانی اش دقت کنید، نوشته:

TSearchForm.Execute(TForm1);

یعنی متد از طریق کلاس TSearchForm اجرا شده، نه از طریق ساخت یک شی از کلاس TSearchForm. در واقع class functionها نیازی به ساختن یک نمونه از کلاس برای اجرا شدن ندارند. البته محدودیت هایی هم دارند، مثل عدم دسترسی به Self. در هر حال، درباره class function قبلا در یک تاپیکی کاملتر توضیح داده بودم.


Form.ShowModal = mrOK از نوع Boolean است؟
هر شرطی که مقدار True یا False برگردانه را میشه به یک متغیر Boolean اختصاص داد. در کد بالا هم میگه مقدار Result مساوی هست با نتیجه شرط Form.ShowModal = mrOK، یعنی اگر این تساوی برقرار باشه، Result مقدارش True میشه، اگر هم نباشه، مقدارش False میشه. می شد این را طور دیگه ایی هم نوشت:


if Form.ShowModal = mrOK then
Result := True
else
Result := False;