PDA

View Full Version : بدست نام فرمی که توسط فرم جدید فعال شده



fahimi
چهارشنبه 18 شهریور 1388, 16:10 عصر
من یک برنامه جستجو نوشته ام که توسط فرم مختلف فراخوانی میشود برای این که بتوان مقادیر را به فرم اصلی ارسال کنم نیاز دار که نام فرم را بدست بیاورم لازم به ذکر در محیط ویرایش نام فرم عنوان متغییر نمی شود استفاده کرد

جواد ملاولی
چهارشنبه 18 شهریور 1388, 18:08 عصر
سلام. نفهمیدم منظور شما چیه؟ یه کم واضح تر توضیح بدید.

fahimi
چهارشنبه 18 شهریور 1388, 19:05 عصر
برای اینکه مجبور نباشم روالهای تکرای جستجو را بنویسم یک فرم جستجو ایجاد کرده ام که در صورت نیاز کاربر براب پیدا کردن نام آن را فراخوانی میکند پس از پیدا کردن روی آن کلیک میکند و با این عمل نتایج به فرم اصلی ارسال میشود با توجه به اینکه فرم جستجو ممکن است از فرم مختلفی فراخوانی شود لذا بایستی نام فرم درخواست کننده جستجو را برای ارسال پارامتر بدست بیاورم که متاسفانه آن را نتوانستم در ادیتور دلفی پیاده کنم

aradsystem
چهارشنبه 18 شهریور 1388, 19:59 عصر
من هم همین سوال رو دارم ولی کاملترش می کنم. هم اسم فرمی که فرم جستجو رو فراخوانی کرده و هم اسم کنترلی که فوکوس اونجا بوده. چون نتیجه جستجو رو در اون فرم و در کنترل مورد نظر قرار بده.

majid_ramak
چهارشنبه 18 شهریور 1388, 21:29 عصر
برای اینکه مجبور نباشم روالهای تکرای جستجو را بنویسم یک فرم جستجو ایجاد کرده ام که در صورت نیاز کاربر براب پیدا کردن نام آن را فراخوانی میکند پس از پیدا کردن روی آن کلیک میکند و با این عمل نتایج به فرم اصلی ارسال میشود با توجه به اینکه فرم جستجو ممکن است از فرم مختلفی فراخوانی شود لذا بایستی نام فرم درخواست کننده جستجو را برای ارسال پارامتر بدست بیاورم که متاسفانه آن را نتوانستم در ادیتور دلفی پیاده کنم
یک متغیر عمومی از نوع TComponentName تعریف کنید و نام فرم مورد نظر را به اون پاس بدین.

merced
چهارشنبه 18 شهریور 1388, 22:00 عصر
اين طوري عمل كن



SearchForm.PrepareIt('يك متغير كه نشان دهد چه طوري آماده اش كنه') ; // ‌
SearchForm.ShowModal ;
ThisForm.Edit1.Text := SearchForm.Edit3.Text ;
بر فرض اينكه نتايج جستجو توي كامپوننتهايي در فرم جستجو قرار مي گيره شما بعد از بستن فرم جستجو
از طريق همين فرم اطلاعات اون رو بخوني نه اينه اطلاعات رو از اون به اين بفرستي!!

majid_ramak
چهارشنبه 18 شهریور 1388, 22:06 عصر
من هم همین سوال رو دارم ولی کاملترش می کنم. هم اسم فرمی که فرم جستجو رو فراخوانی کرده و هم اسم کنترلی که فوکوس اونجا بوده. چون نتیجه جستجو رو در اون فرم و در کنترل مورد نظر قرار بده.
دوست عزیز اگر فرمتون توسط Button ها کنترل میشه و با کلیک بر روی یک Button فرمتون بسته میشه آخرین جایی که Focus داشته همون Button خواهد بود و این کمکی به شما نمیکنه.
اگر هم اینطور نشه فقط کافیه قبل از خروج کاربرتون بر روی یک Objcet دیگه Focus کنه اونوقت هم شما نتیجه درستی نمی گیرید.
بهتر دنبال یک روش بهتر باشید دوست عزیز.

fahimi
پنج شنبه 19 شهریور 1388, 17:43 عصر
جناب merced
با تشکر از جواب شما لطفا
SearchForm.PrepareIt('يك متغير كه نشان دهد چه طوري آماده اش كنه') ; //
بیشتر توضیح بده

fahimi
پنج شنبه 19 شهریور 1388, 17:45 عصر
یک متغیر عمومی از نوع TComponentName تعریف کنید و نام فرم مورد نظر را به اون پاس بدین.لطفا یک مثال کوچک بزنید

majid_ramak
پنج شنبه 19 شهریور 1388, 22:59 عصر
لطفا یک مثال کوچک بزنید




var
FComponentName: TComponentName;





حالا در فرم مورد نظر مقدار FComponentName را برابر نام فرم قرار دهید:



FComponentName:= Form1.Name;

fahimi
جمعه 20 شهریور 1388, 00:22 صبح
با تشکر من به دنبال تابعی هستم که نام فرم مبدا برگرداند تا بتوان در محیط دلفی آزن استفاده کنم برای روشن ترشدن منظورم تصویر را ضمیمه میکنم

majid_ramak
جمعه 20 شهریور 1388, 12:38 عصر
با توجه به تصویری که فرستادین شما میخواین محتویات Edit در فرم 2 رو در Edit فرم 1 نمایش بدین نه اسم فرم .
برای این کار می تونید یک متغیر عمومی در فرم یک از نوع string تعریف کنید و در فرم 2 با کلیک بر روی Button کپی محتویات Edit که در فرم 2 هست رو به متغیر تعریف شده بفرسیتد.
و در نهایت در خود فرم 1 مقدار Edit رو برابر با متغیر تعریف شده در نظر بگیرید.


var
FText: string;

در فرم 2:

FText:= Edit1.Text;

در فرم 1: (در OnActivate فرمتون بنویسید).



Edit1.Text:= FText;

Mahmood_M
جمعه 20 شهریور 1388, 17:13 عصر
علاوه بر توضیحات دوستان ، من نمونه برنامه ای واستون گذاشتم که می تونه کمکتون کنه ...
با رسیدن به هدفتون باید چندتا نکته رو رعایت کنید ، مثلا Edit ای که می خواد نتیجه ی جستجو رو نمایش بده در تمام فرمها به یک نام ثابت باشه تا بتونید با همچین کدی اون رو پیدا کنید :

((Application.FindComponent(FName) as TForm).FindComponent('Edit1') as TEdit).Text := 'Searched';

دوم اینکه در هنگام نمایش فرم جستجو مشخص کنید که کدوم فرم اون رو فراخوانی کرده ...
برنامه ی نمونه رو از اینجا دانلود کنید (http://nabegheh.parsaspace.com/Examples/Search.rar) و مشاهده کنید تا منظورم رو بهتر بفهمید ، اگر من موضوع رو بد فهمیدم و نمونه ی ساخته شده مشکلتون رو حل نکرد ، مشکلتون رو با توضیحات بیشتر بیان کنید تا جواب بهتری بگیرید ...

موفق باشید ...

merced
جمعه 20 شهریور 1388, 21:58 عصر
جناب merced
SearchForm.PrepareIt('يك متغير كه نشان دهد چه طوري آماده اش كنه') ; //
بیشتر توضیح بده


ببين شما يك فرم رو براي كارهاي مختلف مي سازي مثلاً ثبت، ويرايش و مشاهده اطلاعات.
اين سه حالت است كه با يك فرم مي خواي اجرا كني پس توي يونيت اين فرم سه تابع به صورت Public‌ مي نويسي



Procedure New();
begin
table.append ;
showmodal ;
if modalresult = mrok then
table.post
else
table.cancel ;
end ;

Procedure Edit(tID : integer);
begin
table.Locate('ID', tID,[]);
table.Edit ;
showmodal ;
if modalresult = mrok then
table.post
else
table.cancel ;
end ;

Procedure Edit(tID : integer);
begin
table.Locate('ID', tID,[]);
dbedit1.readonly := true ;
...
showmodal ;
dbedit1.readonly := false ;
...
end ;


خوب حالا تو فرم مبدا فقط يكي از اين سه تابع رو فراخوني مي كني.

اگه فرم جستجو رو Modal مي كنيد بخونيد . وگرنه ... .

برا جستجو هم همين طوره.
شما كه از فرم مبدا به كامپوننت هاي فرم مقصد دسترسي داري لزومي نداره كه اطلاعات رو از فرم دومي (مقصد) به مبدا بفرستي
كافي از فرم مبدا اطلاعات فرم مقصد رو بخواي



fMaghsad.ShowModal ;
showMessage( fMaghsad.ResultEdit1.Text ) ;

vcldeveloper
شنبه 21 شهریور 1388, 02:44 صبح
وقتی هر دو نوع فرم دست خودتان هست، چرا لقمه را دور سرتان می چرخونید؟!!

یک فرم پایه ایجاد می کنید، و توش یک Property تعریف می کنید. اینجا من اسم فرم پایه رو گذاشتم TBaseForm و اسم اون Property رو هم گذاشتم ResultStr:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TBaseForm = class(TForm)
private
{ Private declarations }
protected
function GetResultStr: string; virtual; abstract;
procedure SetResultStr(const Value: string); virtual; abstract;
public
property ResultStr: string read GetResultStr write SetResultStr;
end;

implementation

{$R *.dfm}

end.
دقت کنید که لزومی نداره این فرم Auto Create باشه، برای همین از لیست Auto Create حذفش کردیم، متغیر BaseForm: TBaseForm رو هم حذف کردیم.

حالا از منوی New گزینه Others را انتخاب می کنید از گروه Inherited Items گزینه BaseForm را انتخاب می کنید. این کار باعث میشه که یک فرم جدید ساخته بشه که از TBaseForm ارث گرفته شده. من اسمش را گذاشتم ChildForm.
دو تا متد Abstract ایی که در فرم پایه تعریف شده بود را در فرم فرزند پیاده سازی می کنید. در فرم فرزند یک Edit گذاشته شده، ما هم فرض می گیریم که مقدار عبارت قابل جستجو و نتیجه جستجو باید در همین Edit نوشته بشه. شما می تونید هر کدی خواستید اینجا بزارید.

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit1;

type
TChildForm = class(TBaseForm)
Edit1: TEdit;
btnSearch: TButton;
procedure btnSearchClick(Sender: TObject);
private
{ Private declarations }
protected
function GetResultStr: string; override;
procedure SetResultStr(const Value: string); override;
public
{ Public declarations }
end;

var
ChildForm: TChildForm;

implementation

uses Unit3;

{$R *.dfm}

{ TForm4 }

procedure TChildForm.btnSearchClick(Sender: TObject);
begin
TSearchForm.Execute(Self);
end;

function TChildForm.GetResultStr: string;
begin
Result := Edit1.Text;
end;

procedure TChildForm.SetResultStr(const Value: string);
begin
Edit1.Text := Value;
end;

end.

هر تعداد که نیاز داشتید، فرم فرزند از کلاس TBaseForm ایجاد کنید، و هر جور که دوست داشتید، اون دو متد را پیاده سازی کنید.


حالا یک فرم جدید ایجاد می کنیم(نیازی نیست فرزند ،BaseForm باشه، یک فرم معمولی فرزند TForm). اسمش را گذاشتیم TSearchForm. یک class function براش می سازیم که فرم فراخوان را بگیره، مقدار ResultStr را از اون بخونه، و فرم جستجو را نمایش بده، و در نهایت نتیجه را در همان ResultStr ذخیره کنه:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit1;

type
TSearchForm = class(TForm)
Button1: TButton;
Edit1: TEdit;
private
{ Private declarations }
public
class function Execute(Caller: TBaseForm): Boolean;
end;

implementation

{$R *.dfm}

{ TSearchForm }

class function TSearchForm.Execute(Caller: TBaseForm): Boolean;
begin
with TSearchForm.Create(nil) do
try
Edit1.Text := Caller.ResultStr;
Result := (ShowModal = mrOk);
if Result then
Caller.ResultStr := Edit1.Text;
finally
Free;
end;
end;

end.

لزومی نداره که حتما فرم ShowModal بشه، یا فقط یک property داشته باشیم؛ من برای راحتی کار اینطوری کردم. همچنین این فرم هم لزومی نداره که Auto Create بشه، چون همیشه از طریق متد Execute مورد دسترسی قرار میگیره، پس این فرم را هم از لیست Auto Create حذف کردیم، و متغیر SearchForm: TSearchForm را هم به تبع آن حذف کردیم.

فراخوانی فرم جستجو:
حالا در هر کدام از فرم های فرزند TBaseForm که طراحی کردیم، می تونیم کد زیر را بنویسیم تا فرم جستجو فراخوانی بشه، مقدار ورودی را خودش از فرم فراخوان بگیره، و مقدار خروجی را به فرم فراخوان برگردونه:

procedure TChildForm.btnSearchClick(Sender: TObject);
begin
TSearchForm.Execute(Self);
end;