PDA

View Full Version : مشکل با فرمها



صابر طهماسبی
شنبه 11 اردیبهشت 1389, 06:23 صبح
سلام
من در برنامه ام دو فرم دارم که یکی فرم اصلی است و دیگری با کلیک روی یک کلید که در فرم اصلی است نمایش داده می شود اما حواسم نبود formStyle فرم دوم رو به fsMDIChild تغییر دادم وبرنامه رو اجرا کردم خطا گرفت اون رو اصلاح کردم و به fsNormal تغییر دادم ،حالا وقتی برنامه رو اجرا می کنم هر دو فرم با هم نمایش داده می شوند!
فکری که به ذهنم رسید این بود که هنگام اجرای برنامه فرم رو مخفی کنم که کار اصولی نیست مهمتر اینکه می خوام بدونم ایراد از کجاست؟
تمام کدها رو نگاه کردم تغییری نکرده بود.

یه سوال دیگه اینکه وقتی در برنامه چند فرم داریم چطور باید داده ها را بین آنها رد و بدل کنیم من خودم یک یونیت به نام sharedUnit در نظر گرفتم که متغیر ها رو اونجا تعریف کردم و در همه ی فرم ها با uses ازش استفاده می کنم آیا این کار درست است یا روش دیگری وجود دارد؟
لطفا راهنمایی کنید

حسین شهریاری
شنبه 11 اردیبهشت 1389, 10:04 صبح
سلام

سوال اولتونا خودم هم چک کردم بله حق باشماست.ولی نتونستم جوابی براش پیدا کنم.

ولی برای سوال دومتون باید عرض کنم که اگه فرمی Unit فرم دیگه ای را Use کرده باشه میتونه به تمام اشیاء اون فرم دسترسی داشته باشه.

Form2.Edit1.text:='Test Text';

در مورد متغیر ها هم اگه اون متغیر ها در بخش Public تعریف شده باشند شما میتونی بهشون دسترسی داشته باشی.(این قضیه برای توابه و روالها هم صدق میکنه به شرطی که Prototype اونا را در Public juvdt تعریف کنید)

مثال دسترسی به متغیر:

Form2.Code:=100;
مثال دسترسی بهتوابه و روالها:

Form2.TestProcedure;

در مثال فوق متغیر فرضی Code در Unit2 در بخش Public تعریف شده.
در مثال فوق Procedure فرضی TestProcedure در Unit2 در بخش Public تعریف شده.

مثلا برای Use کردن یونیت دیگه روی Form1 قرار بگیرید و از منوی File گزینه Use Unit را انتخاب و یونیت Form2 که همان Unit2 است را انتخاب کنید.

موفق باشید.

صابر طهماسبی
شنبه 11 اردیبهشت 1389, 10:47 صبح
ممنونم
سایر دوستان اگه راه حلی پیدا کنن ممنون می شم

Felony
شنبه 11 اردیبهشت 1389, 10:51 صبح
سلام
من در برنامه ام دو فرم دارم که یکی فرم اصلی است و دیگری با کلیک روی یک کلید که در فرم اصلی است نمایش داده می شود اما حواسم نبود formStyle فرم دوم رو به fsMDIChild تغییر دادم وبرنامه رو اجرا کردم خطا گرفت اون رو اصلاح کردم و به fsNormal تغییر دادم ،حالا وقتی برنامه رو اجرا می کنم هر دو فرم با هم نمایش داده می شوند!
فکری که به ذهنم رسید این بود که هنگام اجرای برنامه فرم رو مخفی کنم که کار اصولی نیست مهمتر اینکه می خوام بدونم ایراد از کجاست؟
تمام کدها رو نگاه کردم تغییری نکرده بود.
از منو Project گزینه View Source رو انتخاب کنید ، سپس 2 نمونه از کد زیر رو میبینید ، یکی مربوط به فرم اول و یکی مربوط به فرم دوم ، کد مربوط به فرم دوم رو حذف کنید :


Application.CreateForm(TYourFormClass, YourFormName);

صابر طهماسبی
شنبه 11 اردیبهشت 1389, 11:27 صبح
بسیار سپاسگزارم
در اون قسمت تمام برای تمام فرمها این کد را تعریف کرده و با حذف خطی که فرمودید این اشکال پیش میاد که در فرم اول هنگامی که روی کلید کلیک می کنم به جای اینکه این فرم را باز کنه خطای زمان اجرا رخ میده!
به صورت زیر حلش کردم اما دلم راضی نمیشه چون کار تمیزی نیست:


Application.CreateForm(Tmain, main);
//Application.CreateForm(TAddSigma_form, AddSigma_form);
و در قسمت کد کلید :


procedure Tmain.ToolButton2Click(Sender: TObject);
begin
Application.CreateForm(TAddSigma_form, AddSigma_form);
AddSigma_form.Show;
waitForStateName:=True;
ToolBar1.Enabled:=False;
end;


یعنی درست زمانی که می خوام فرم را نشان بدم اون رو می سازم بعد نشون میدم البته اگه اشتباه نکنم با هربار کلیک یکبار فرم ساخته میشه درسته؟

Felony
شنبه 11 اردیبهشت 1389, 11:32 صبح
بسیار سپاسگزارم
در اون قسمت تمام برای تمام فرمها این کد را تعریف کرده و با حذف خطی که فرمودید این اشکال پیش میاد که در فرم اول هنگامی که روی کلید کلیک می کنم به جای اینکه این فرم را باز کنه خطای زمان اجرا رخ میده!

:لبخند: من سوال شما رو با دقت نخوندم و فکر کردم میخواین فرم دوم دیگه نمایش داده نشه و بعد خودتون بسازیدش ، برای اینکه به صورت خودکار نمایش داده نشه کافیه خصیصه Visible فرم دوم رو False کنید .

حسین شهریاری
شنبه 11 اردیبهشت 1389, 21:02 عصر
اگه Visible را False کنن اون موقه برای Show یا Show Dialog باید کار اضافی یعنی True کردن Visible را هم انجام بدن.
اگه کسی راه حل منطقی تری داره بگه چون برای خود من هم جالب بود!

Felony
شنبه 11 اردیبهشت 1389, 21:25 عصر
اگه Visible را False کنن اون موقه برای Show یا Show Dialog باید کار اضافی یعنی True کردن Visible را هم انجام بدن.
اگه کسی راه حل منطقی تری داره بگه چون برای خود من هم جالب بود!

راه حل از این منطقی تر ؟
خیر نیازی به True کرن دوباره Visible نیست !
شما قبل از اینکه خصیصه Style رو به MDIChild تغییر بدید خصیصه Visible فرم دوم رو ببینید ، به طور پیش فرض False هست !

SAASTN
یک شنبه 12 اردیبهشت 1389, 00:59 صبح
یه سوال دیگه اینکه وقتی در برنامه چند فرم داریم چطور باید داده ها را بین آنها رد و بدل کنیم من خودم یک یونیت به نام sharedUnit در نظر گرفتم که متغیر ها رو اونجا تعریف کردم و در همه ی فرم ها با uses ازش استفاده می کنم آیا این کار درست است یا روش دیگری وجود دارد؟
اگه طراحی رو طوری تغییر بدین که داده ها از طریق پارامتر ها منتقل بشن کار اصولی تر میشه. کلا هر چی متغیر های public غیر ضروری کمتر بشن به مفهوم انکپسولیشن نزدیکتر می شیم. تعریف متغیر های global هم که خیلی غیر شرعیه.

در ضمن اگه سوال هاتون رو توی تاپیک ها مجزا مطرح کنید مثل الان پارگی تو روند بحث بوجود نمیاد.