PDA

View Full Version : تغيير مكان فرم توسط خودش وقتي ساخته ميشود !!؟؟



ali_mohamadi8928
پنج شنبه 02 آبان 1387, 18:49 عصر
سلام دوستان .

من يك فرم دارم و توي برنامم هر موقع لازمش داشتم اينجوري نمايشش ميدم


with TPopup_mfrm.Create(Application) do try
ShowModal;
finally
Free;
end;

خب حالا توي اون فرم كه نمايش داده ميشه يك Button هست كه فرمان زير توش هست


Popup_mfrm.Left:=100;

خب حالا راحت فرم ايجاد ميشه و نمايش داده ميشه ولي وقتي روي دكمه ي توش كليك ميكنم تا مختصات قرار گرفتنش تغيير كنه خطا ميگيره . :متفکر:

اينم متن خطاش



Access violation at address 004562B4 in module 'Project1.exe'. Read of address 00000048.


قبلا هم همين مشكل رو داشتم ولي هر چي گشتم چيزي پيدا نكردم و چون زياد نياز به حل اين مشكل جدي نبود يه جور ديگه مشكل رو حل كردم . ولي الان ديگه خيليكارم گيرش هست و هر كاري كردم نشد كه نشد . گفتم از دوستان راهنمايي بخوام :ناراحت:

mossaferin
پنج شنبه 02 آبان 1387, 20:29 عصر
سلام
اون پیغام خطا به خاطر اینه که زمانی که می خوای جای فرمتو تغییر بدی ، فرمی وجود نداره که بتونی تغییر مکانش بدی چون اونو ساختی ، نمایش دادی ، بعد هم آزادش کردی

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

موفق باشی

ali_mohamadi8928
پنج شنبه 02 آبان 1387, 21:26 عصر
اون پیغام خطا به خاطر اینه که زمانی که می خوای جای فرمتو تغییر بدی ، فرمی وجود نداره که بتونی تغییر مکانش بدی چون اونو ساختی ، نمایش دادی ، بعد هم آزادش کردی

دوست عزيز تا فرم بسته نشه ازاد نميشه ... مگه ميشه فرمي كه در حال نمايش هست و يك Button توش هست و وقتي روي اون Button كليك ميكني به خاطر عدم وجود فرم پيغام خطا بده ؟؟؟؟

كد نوشته شده توي اون Button هم


Popup_mfrm.Left:=100;

هست و Popup_mfrm هم نام همون فرم هست . فرم كه در حال نمايش هست . پس امكان نداره به خاطر عدم وجودش پيغام خطا بده .

خيلي عجيبه برام اين مشكل . هنوزم نتونستم حلش كنم :ناراحت:

Mahmood_M
پنج شنبه 02 آبان 1387, 22:31 عصر
مشکل شما در نحوه ساختن Form و نحوه تغییر خاصیت Left هست ...
به کد زیر دقت کنید :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
MyForm : TForm2;
begin
MyForm := TForm2.Create(Application);
try
MyForm.ShowModal;
finally
MyForm.Free;
end;
end;
بهتره فرمی که قصد ساختنش رو دارید به یک متغیر از اون نوع اختصاص بدید ...

اما نکته ی اصلی اینه که لزومی نداره برای کد مربوط به Button در فرم 2 نام اون رو هم بنویسید ، یعنی در کد زیر Popup_mfrm اضافه هست !

Popup_mfrm.Left:=100;
کد زیر کافیه :

Left:=100;

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

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

مهران موسوی
پنج شنبه 02 آبان 1387, 23:26 عصر
مشکل شما در نحوه ساختن Form

procedure TForm1.BitBtn1Click(Sender: TObject);
var
MyForm : TForm2;
begin
MyForm := TForm2.Create(Application);
try
MyForm.ShowModal;
finally
MyForm.Free;
end;
end;


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

در واقع در كد زير


with TPopup_mfrm.Create(Application) do try
ShowModal;
finally
Free;
end;يك نمونه از TPopup_mfrm ساخته ميشه و چون همراه با بلوك With هست نيازي به اختصاص يك متغيير از نوع TPopup_mfrm نيست . پس ميتونيم به راحتي در بلوك with اعمال لازم رو بر روي نمونه ي ساخته شده از TPopup_mfrm انجام بديم .

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


و اما در رابطه به تغيير مختصات فرم .

به كد زير دقت كنيد ..


Popup_mfrm.Left:=100;خب در واقع Popup_mfrm نمونه اي هست از TPopup_mfrm كه شما براي تغيير اندازه نامش رو قبل از متد Left بكار برديد .

دليل اينكه با خطا مواجح ميشيد اين هست كه فرم ايجاد شده حاصل ساخته شدن نمونه اي از فرم مورد نظر توسط شما هست . نه ساخته شدن Popup_mfrm كه يك نمونه ي پيش فرض در يونيت فرم مورد نظر هست . و چون هيچ وقت Popup_mfrm ساخته نشده در مواقع اي كه قصد فراخواني متد هاي اون رو داريد با پيغام خطا مواجح خواهيد شد .

ولي اگه روي استفاده از نمونه ي پيش فرض تعريف شده در يونيت فرمي كه ميخواي بسازي پافشاري داري اصلا ناراحت نباش ... خواستن توانستن است .

در رويداد OnCreate فرمت كد زير رو بنويسي حله ...


Popup_mfrm:=Self;خب حالا هر جا از فرمت كه دلت ميخواد ميتوني بدون هيچ مشكلي از متدهاي نمونه ي پيش فرض فرمت نهايت استفاده رو ببري :قهقهه:

يا حق ....

Mahmood_M
جمعه 03 آبان 1387, 02:18 صبح
يك نمونه از TPopup_mfrm ساخته ميشه و چون همراه با بلوك With هست نيازي به اختصاص يك متغيير از نوع TPopup_mfrm نيست . پس ميتونيم به راحتي در بلوك with اعمال لازم رو بر روي نمونه ي ساخته شده از TPopup_mfrm انجام بديم .

در واقع كدهايي كه اقاي محمدي براي ساخت فرم بكار برده هيچ فرقي با كدهاي اقا محمود نداره ولي كدهاي اقاي محمدي از نظر كوتاه نويسي و جمع و جور بودن بهتر و بهينه تر هست .
ممنون از توضیحات ...
استفاده از متغیر و تخصیص دادن فرمی که قراره ساخته بشه به اون ، باعث میشه که استفاده از اون در هر جای برنامه ممکن باشه ، من هم گفتم که بهتر هست استفاده بشه ، البته کدی که من نوشتن فرم رو به صورت متغیر عمومی نمی سازه ولی اگه متغیر مربوط به فرم به صورت عمومی تعریف بشه اونوقت میشه در فرم 2 یا هر فرم دیگه ای از کد زیر هم استفاده کرد :

MyForm.Left := 100;
البته باز باید چند تا چیز بررسی بشه !
این درواقع چیزی شبیه به راه حلی بود که شما در آخر پستتون اشاره کردید ... ، و من هم چون خواستم که توضیحات اضافه نداده باشم دیگه وارد جزئیات و بیان دلایل نشدم :

البته در مورد دلیل این موضوع میشه بحثهای مفصل تری کرد ، اگه نیاز به اطلاعات بیشتر بود ابتدا جستجو کنید و اگه پیدا نشد بگید تا دوستان راهنمایی کنند ...
به هر حال از تذکرتون ممنونم و امیدوارم مشکل دوستمون حل شده باشه ...

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