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;
البته باز باید چند تا چیز بررسی بشه !
این درواقع چیزی شبیه به راه حلی بود که شما در آخر پستتون اشاره کردید ... ، و من هم چون خواستم که توضیحات اضافه نداده باشم دیگه وارد جزئیات و بیان دلایل نشدم :
البته در مورد دلیل این موضوع میشه بحثهای مفصل تری کرد ، اگه نیاز به اطلاعات بیشتر بود ابتدا جستجو کنید و اگه پیدا نشد بگید تا دوستان راهنمایی کنند ...
به هر حال از تذکرتون ممنونم و امیدوارم مشکل دوستمون حل شده باشه ...
موفق باشید ...
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.