PDA

View Full Version : ارسال متن از چند فرم به فرم جستجو ؟



emdadgar_shahed
شنبه 06 شهریور 1389, 15:40 عصر
سلام
من یه برنامه ای نوشتم که در آن درخواست کد درس در فرم های مختلف داده میشه .
می خوام با زدن کلید فرضا اف 4 وارد فرم جستجو درس بشه و پس از سرچ درس با فشردن کلید اینتر کد درس در فرم اول نمایش داده بشه .
نحوه ارسال متن تکس باکس فرم جستجو به فرم اولیه را می خواستم .
ممنون

hossein_h62
شنبه 06 شهریور 1389, 16:05 عصر
سلام
نحوه ارسال متن تکس باکس فرم جستجو به فرم اولیه را می خواستم .
ممنون

سلام



Frm_main.Edit1.text:=Frm_search.Edit1.text;


درضمن اضافه کردن یونیت فرم جستجو در فرم اصلی فراموش نشه!

emdadgar_shahed
شنبه 06 شهریور 1389, 16:12 عصر
سلام
این برای وقتی هست که می خوایم اطلاعات فرم جستجو را فقط برای یک فرم خروجی بگیریم
ولی من در فرم های مختلف مجبور به فراخوانی این کد هستم که در این صورت باید با هر بار فراخوانی این کد را بنویسم .



Frm_main1.Edit1.text:=Frm_search.Edit1.text;
Frm_main2.Edit1.text:=Frm_search.Edit1.text;
Frm_main3.Edit1.text:=Frm_search.Edit1.text;
Frm_main4.Edit1.text:=Frm_search.Edit1.text;


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

SAASTN
شنبه 06 شهریور 1389, 17:15 عصر
دنبال کدی جایگزین هستم که برای همه فرم های برنامه هنگام فراخوانی بکار بیاد. یعنی هر گاه نیاز به فرم سرچ پیدا کردم اونو فراخوانی کنیم و محیط تکس باکس اونو در به فرمی که از آنجا فراخوانی فرم جستجو انجام شده برگردانه.
کد جایگزینی که وجود نداره، شما باید یه تابع بنویسی که خروجیش string باشه و داخلش فرم جستجو نمایش پیدا کنه و متن Edit رو توی خروجیش قرار بده. اونموقع کد بصورت زیر نوشته میشه:
Frm_main1.Edit1.text := FindCourseID;
Frm_main2.Edit1.text := FindCourseID;
Frm_main3.Edit1.text := FindCourseID;
Frm_main4.Edit1.text := FindCourseID;

در کل دسترسی به کنترلهای فرم دیگه خیلی کار قشنگی نیست.
البته اگه درستش باشه خروجی تابع نباید از نوع متن باشه چون ممکنه کاربر از جستجو منصرف بشه یا جستجو نتیجه ای نداشته باشه، اگه من باشم خروجی تابع رو یه Integer قرار می دم که وضعیت قبول یا لغو یا ... رو مشخص کنه، نتیجه جستجو رو هم با یه پارامتر out منتقل می کنم.

emdadgar_shahed
شنبه 06 شهریور 1389, 17:25 عصر
من تو این زمینه تجربه ای ندارم
ممکنه یه نمونه سورس بذارید؟

vcldeveloper
شنبه 06 شهریور 1389, 17:38 عصر
این کار پیچیده ایی نیست؛ کافیه یک متد ساده در اون فرم جستجوتون تعریف کنید که خروجی اش مقدار کد اون درس پیدا شده باشه. هر فرمی که نیاز به جستجوی درس داره، اون متد رو فراخوانی میکنه، اون متد هم فرم جستجو را نمایش میده، و کد درس را به عنوان خروجی خودش برگشت میده. بخواید این کار رو درست و حسابی انجام بدید، قالب کلی کار میشه یک چیزی مثل کد زیر:
interface

uses
...

type
TfrmSearch = class(TForm)
{Component declarations come here}
btnOK : TButton;
procedure btnOKClick(Sender: TObject);
private
FFoundCode : string;
FSearchTerm : string;
public
function DoSearch: Boolean;
class function Execute(const SearchTerm: string): string;
property SearchTerm : string read FSearchTerm write FSearchTerm;
property FoundCode : string read FFoundCode;
end;

implementation

class function TfrmSearch.Execute(const SearchTerm: string): string;
var
AForm : TfrmSearch;
begin
AForm := TfrmSearch.Create(nil);
try
AForm.SearchTerm := SearchTerm;
if AForm.ShowModal = mrOK then
Result := AForm.FoundCode;
finally
AForm.Free;
end;
end;

function TfrmSearch.DoSearch: Boolean;
begin
{Do your search here, and return the result into FFoundCode}
{If anything is found, then return True; otherwise, return False}
end;

procedure TfrmSearch.btnOKClick(Sender: TObject);
begin
if DoSearch then
Self.ModalResult := mrOK;
end;

دقت کنید که کد بالا یک کد کامل نیست، و من فقط بخش هایی که باید بهشون دقت کنید رو نوشتم. همچنین ممکن مشکلات Syntax هم داشته باشه، چون من کد را در IDE ننوشتم، و تست نکردم.

در هر حال، در کد بالا، شما یک متد Execute دارید که سایر فرم ها اون رو فراخوانی می کنند. خصوصیاتی هم برای نگهداری عبارت مورد جستجو و نتیجه جستجو دارید. یک متد هم برای انجام جستجو دارید که در صورت پیدا کردن عبارت مورد نظر، مقدار True را برگشت میده. یک دکمه فرضی با نام btnOK هم دارید که در صورتی روی آن کلیک بشه، عمل جستجو را انجام میده.


حالا برای استفاده از همچین فرمی در سایر فرمها، می تونید به این شکل عمل کنید:


Edit1.Text := TfrmSearch.Execute('CourseName');یا اگر نمی خواید فرم جستجو هر بار Create/ Free بشه، از کدی مثل این:


frmSearch.SearchTerm := 'CourseName';
if frmSearch.DoSearch then
Edit1.Text := frmSearch.FoundCode;توی این کدها فرض بر این هست که شما دارید برای یک درس که اسمش CourseName هست، جستجو انجام میدید.

SAASTN
شنبه 06 شهریور 1389, 17:51 عصر
ببین به کارت میاد:




خوب کدی که آقای کشاورز گذاشتن خیلی فنی تره. پاسخ ها همزمان شد.

SAASTN
شنبه 06 شهریور 1389, 18:01 عصر
حالا برای استفاده از همچین فرمی در سایر فرمها، می تونید به این شکل عمل کنید:


Edit1.Text := TfrmSearch.Execute('CourseName');
یه توضیح راجع به این تابع Execute می دین. یک متغیر از نوع خود کلاس داخل یکی از توابع خود کلاس ایجاد شده؟:متفکر:

vcldeveloper
شنبه 06 شهریور 1389, 18:40 عصر
ه توضیح راجع به این تابع Execute می دین. یک متغیر از نوع خود کلاس داخل یکی از توابع خود کلاس ایجاد شده؟
اون متد Execute یک class function هست، نه یک instance function. در نتیجه، برای فراخوانی آن، نیازی به Create کردن یک Instance از اون کلاس نیست. اون متد خودش یک Instance از کلاس خودش ایجاد میکنه، و به این ترتیب، کل منطق مربوط به نمایش فرم، جستجو و برگشت نتیجه در داخل همون کلاس کپسوله میشه.