انتقال داده بين فرم ها در دلفي

sara_she

Member
سلام به دوستان
من تو دلفي تازه كارم
مي خوام بدونم چطور مي تونم مقدار متغيرها رو از يه فرم به فرم ديگه اي منتقل كنم و تو فرم دوم ازشون استفاده كنم
 

DrXoX

Active Member
سلام
خیلی راحت میشه این کار رو انجام داد من با یک مثال این کارو توضیح میدم ، مرحله به مرحله و به زبان ساده:
1- دو تا فرم ایجاد کنید در فرم اول دو تا باتن و یک ادیت قرار بدین و در فرم 2 هم دو تا باتن قرار بدین
2-روی فرم 1 دوبار کلیک کنید و در متغیر عمومی ( بالای یونیت) یک متغیر تعریف کنید مثلا من ایکس رو تعریف کردم
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
X:integer;
implementation


3- حالا در باتن 1 در فرم 1 این کد رو بنویسید
x:=strtoint(edit1.text);
4- در باتن 2 در فرم 1 هم این کد رو بنویسید
5- حالا یک بار برنامه را اجرا کنید F9 و پیغامی که ظاهر میشه رو یس بزنید
6- حالا در باتن 1 در فرم 2 این کد را بنویسید
7- دوباره برنامه را اجرا کنید و پیغامی که ظاهر میشه رو یس بزنید
8- در باتن 2 در فرم2 این کد را بنویسید
form2.caption:=inttostr(x);
نکته: مرحله 4 و 6 باعث میشه فرم ها با هم ارتباط برقرار کنند

آزمایش: برنامه را اجرا و در فرم 1 در ادیت مثلا عدد 20 را وارد کنید و بعد باتن 1 را در فرم 1 بزنید با این کار عدد 20 در متغیر X قرار میگیره حالا روی بات 2 کلیک کنید تا وارد فرم 2 بشین و روی باتن 2 در فرم2 کلیک کنید می بینید که کپشن فرم عدد 20 رو نمایش میده
نکته2: شما می تونید بعد از این که اتصال فرم ها انجام شد باتن 1 در فرم 2 همراه با کدی که داخلش نوشتید رو پاک کنید یعنی کد


9- تمام
_____________________

روزي کـه تو آمــــدي به دنيا عــريان *** جمعي به تو خندان و تو بودي گريان
کاري بکن اي دوست که وقت رفتن *** جمعي به تو گريند و تو باشي خندان
 
آخرین ویرایش:

sara_she

Member
سلام
از راهنماييتون ممنونم

منظور شما از ارتباط بين فرم ها استفاده از use unit‌ از منوي file است؟

يه سوال برام پيش اومده اگه فرمي رو show كنيم و بعد ببنديم بازم مي تونيم اطلاعات اونو به فرمي كه بعد از بسته شدن فرم اول باز شده انتقال بديم؟ يا اينكه بايد براي انتقال داده بين دو فرم هر دو بايد در حالت show‌ يا active‌باشند؟
 

DrXoX

Active Member
نیازی به استفاده از Use unit نیست چون دلفی بعد از نوشتن کد مثلا در فرم 1 کد ، Form2.show این کارو (ارتباط بین فرم ها )رو به صورت اتوماتیک انجام میده وارتباط برقرار میشه

در مورد سوال دوم اگر ارتباط بین فرم ها برقرار شده باشه می تونید داده ها رو بین فرم ها انتقال بدین و نیازی به Show بودن فرم ها نیست (تا وقتی برنامه در حال اجرا باشه میشه داده ها رو بین فرم ها انتقال داد ،در صورت برقراری ارتباط بین دو فرمی که می خوایین داده ها رو بین اونها انتقال بدین)

بازم اگه سوالی داشتید من در خدمتم
_________________________

روزي کـه تو آمــــدي به دنيا عــريان *** جمعي به تو خندان و تو بودي گريان
کاري بکن اي دوست که وقت رفتن *** جمعي به تو گريند و تو باشي خندان
 
آخرین ویرایش:

zahra_no

New Member
با سلام و خستع نباشید

یک سوال داشتم، چطوری میتوان از متغیر x در فرم 2 در TForm2.FormCreate استفاده کرد؟؟؟ چون من در این حالت متغیر x رو نمیتونستم مقدارش رو بخونه ولی ولی با button1.click میتونه بخونه، اگر میشه راهنماییم کنید
 

saalek110

Well-Known Member
من دقیقا مشکل شما را متوجه نشدم ولی شاید استفاده از رویدادهای دیگر فرم کمک کند. مثل FormActivate یا FormShow و یا رویدادهای دیگر .
 
آخرین ویرایش:

zahra_no

New Member
میدونم خیلی ساده و مسخره است این مشکل، ولی وافعا به مشکل بر خورده ام.


ببینید من یک متغیر به نام x دارم که از فرم یک به صورت public می باشد.
در فرم 2 در قسمت FormCreate وقتی میخواهم از مقدار این متغیر استفاده کنم مقدار این متغیر خالی است و چیزی نشان نمیدهد

میتونم این طوری بگم

چطوری میشه به محض اینکه فرم 2 نمایش داده شد، مقدار x در caption فرم 2 نمایش داده بشه (بدون کلیک پاتن).


اگر بازم نامفهوم بود میتونم نمونه برنامه بفرستم.
 

saalek110

Well-Known Member

من این کارها را کردم.
دلفی 7 را باز کردم.
که خود به خود یک پروژه می سازد.
از منوی فایل new را زدم و بعد form را زدم تا پروژه صاحب دو فرم شود.

یک باتون به فرم 1 افزودم و کد زیر را درش گذاشتم تا بشود باهاش فرم 2 را فعال کرد:
کد:
form2.show;

بعد این کد را به برنامه افزودم:
کد:
  x: integer ;
یک باتون دیگر به فرم 1 افزودم و نوشتم :
کد:
x:=2;

حالا می رویم فرم 2.
یک باتون به فرم 2 افزودم و کد زیر را به آن افزودم:
کد:
ShowMessageFmt('number is  %d', [form1.x]);
بار اول که play را بزنی میگه form1 را نمی شناسم. ولی بار دوم برنامه را اجرا می کند. و خط زیر هم در فرم 2 اضافه شده است:
کد:
uses Unit1;
در فرم 1 هم این اضافه شده:
کد:
uses Unit2;

بعد اجرای این برنامه اول باتون 2 فرم 1 را بزنید تا به x مقدار دهی بشود. بعد با باتون 1 فرم 1 می توانیم فرم 2 را نشان دهیم و بعد تنها باتون فرم 2 را می زنیم که مقدار x را برابر 2 نشان می دهد .

----------------
برای اینکه مقدار 2 در روی کپشن باتون نمایش داده بشه می توانیم بنویسیم:
کد:
procedure TForm2.FormShow(Sender: TObject);
begin
       button1.caption := IntToStr (form1.x) ;
end;

یعنی رفتم پنجره ((آبجکت اینسپکتر)) و رویداد ONShow را دابل کلیک کردم تا این رویداد باز بشود که برایش کد بنویسم.
دلیل اینکه چرا از رویداد FormShow استفاده شده و نه از رویداد FormCreate را در پست بعد ببینید.
----------------
تحلیل: شاید اینجا ما متغیر x را عمومی فرم 1 تعریف کردیم و گلوبال نیست. منظور از گلوبال یعنی اینکه در همه فرم ها شناسایی شود. سئوال اینه که آیا در دلفی متغیر گلوبال نداریم؟
ما آمدیم با uses کردن از متغیرهای فرم دیگر استفاده کرده ایم.
شاید یک بحث این uses هاست. که در دلفی استفاده می شود و شاید باید نظم آنها را مراقب باشیم.

--------------
عکسی بعد اجرای برنامه گرفتم که عدد 2 را هم روی باتون فرم 2 و هم بعد زدن باتون می بینید(در ShowMessageFmt ).
 

پیوست ها

  • a1.gif
    a1.gif
    31.2 کیلوبایت · بازدیدها: 3
آخرین ویرایش:

saalek110

Well-Known Member
آزمایش دوم :
پروژه ای بسازید.
فرم 2 را به پروژه بیافزایید.

در فرم 1 این کدها را داریم:
(دو باتون افزوده اید.)
کد:
....
 x: integer;
.......

procedure TForm1.FormCreate(Sender: TObject);
begin
      x:=3;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 x:= 4 ;
end;

در فرم 2 این را دارید:
(یک باتون دارید.)
کد:
procedure TForm2.FormCreate(Sender: TObject);
begin
button1.Caption :=   IntToStr (form1.x) ;
end;

بعد اجرا می بیند که زدن باتون 2 فرم 1 تاثیری در عدد روی باتون فرم 2 ندارد. چون این عدد موقع خلق فرم 2 به باتون داده شده. و عدد 3 چاپ شده. عدد 3 در رویداد خلق فرم 1 نسبت داده شده.
پس میشه توالی را این طور در نظر گرفت.

ابتدا فرم 1 خلق شده.
کدهای درون رویداد خلق فرم 1 اجرا شده.
فرم 2 خلق شده.
کدهای درون رویداد خلق فرم 2 اجرا شده.

برای همین بود که در پست قبلی من از رویداد FormShow استفاده کردم و نه از رویداد FormCreate .
 

جدیدترین ارسال ها

بالا