PDA

View Full Version : خبر: باگ در دلفی 7 (شاید هم بالاتر)



یوسف زالی
دوشنبه 23 اردیبهشت 1392, 00:09 صبح
سلام.
دوستان در جریان Refactoring یک برنامه متوجه باگ زیر شدم؛ البته من با دلفی 7 تست کردم، ببینید در دلفی های بالاتر هم همین وضع برقراره؟

اما باگ:

دو تا فرم درست کنید،
روی فرم یک، یک دکمه بگذارید و روی فرم دو، یک PageControl با چند تا TabSheet.
فرم دو رو در فرم یک یوز کنید،
در رویداد کلیک دکمه در فرم یک این رو بنویسید:


Form2.Parent := Self;
Form2.TabSheet1.TabVisible := false;
Form2.ShowModal;

(دوستان من دقیقا همین روال رو می خوام، پس لطفا صبور باشید و نگید MDI)

در دلفی 7 روی خط TabVisible := false یک ارور عجیب مبنی بر تخطی از اندیس مجاز می گیریم!!!!

خیلی بررسی کردم، دیدم ایراد از اینه که TabSheet ما Handle نداره!!!!!!!!!!!!!!
خب، با کد زیر درستش کردم:



Form2.Parent := Self;
Form2.PageControl1.HandleNeeded;
Form2.TabSheet1.TabVisible := false;
Form2.ShowModal;


اما این ایراد چرا بوجود اومده؟؟
آیا در XE هم همین ارور رو می گیرید؟
چه وقت از HandleNedded استفاده می کنیم؟ توضیح پلیز..
و اینکه چرا اشیای دیگه این ایراد رو ندارن؟

MohsenB
دوشنبه 23 اردیبهشت 1392, 00:27 صبح
سلام

در دلفی ایکس-ای 2 که مشکلی نداشت ولی میتونید با یه جابجایی ساده مشکل رو حل کنید ، اینطوری :

Form2.TabSheet1.TabVisible := False;
Form2.Parent := Self;
Form2.ShowModal;

و یا :

Form2.Parent := Self;
Form2.PageControl1.TabIndex:= 0;
Form2.TabSheet1.TabVisible := False;
Form2.ShowModal;
مثل اینکه تو دلفی 7 تغییر این تنظیم به پرنت فرم یه جورایی بستگی داره .

موفق باشید

Ananas
دوشنبه 23 اردیبهشت 1392, 00:32 صبح
سلام.
به نظر منطقی میاد.
وقتی روی tab آخر فکوس میشه و برنامه اجرا میشه در رویداد سازنده ی فرم tab اول حذف میشه و تعداد tab ها یکی کم میشه پس دیگه آخرین tab ما با اندیس قبلی جور در نمیاد (یکی بیشتره)
مثلا اگه 3 تا tab داشته باشیم یکیش کم بشه آخری میشه 2 ولی index ما هنوز 3 هست پس ارور میده.
حالا اگه روی tab اول فکوس کنید و برنامه رو اجرا کنید دیگه خطا نمیده (البته اگه تعداد tab ها بیشتر از یکی باشه)

یوسف زالی
دوشنبه 23 اردیبهشت 1392, 09:29 صبح
نه.


میتونید با یه جابجایی ساده مشکل رو حل کنید

به دلیل ساختار برنامه این دو کد با ترتیب های متفاوت نمی تونن ظاهر بشن و اجبار به همین ترتیب وجود داره.
فرض کنید روی فرم 10 تا PageControl داشتیم، باید همش رو ست کنیم!!



به نظر منطقی میاد.

این حرف با این که در XE مشکل نداشته جور در نمیاد.
شما Parent فرم رو پس از ساخت فرم عوض می کنید نه در حین انجام اون.
اگر حرف شما درست باشه مشکل باید همیشه در ساخت فرم بوجود بیاد نه وقتی که Parent فرم رو انتصاب می دیم.
ضمنا چرا فقط هنگام استفاده از TabVisible یا کدهای مشابه که لیست رو رفرش می کنند هست و در سایر قسمت ها ارور نیست؟
از طرفی، چرا با گذاشتن اون کد HandleNedded مشکل حل می شه؟

این مساله یک باگ هست.
اگر این طور نبود می باید تمام اشیایی که با لیست سروکار دارند ارور بدهند، مثل کمبو، گرید، ..

Ananas
دوشنبه 23 اردیبهشت 1392, 14:10 عصر
به ورژنش که فرقی نداره چون برای من xe2 هست همین ارور رو میده.
بعد اینکه دقت کردی ShowModal رو به Show تبدیل میکنی هم ارور نمیده.
من وقتی ShowModal باشه هیچ دسترسی ای به هیچ کدوم از فرم ها ندارم با دلفی میبندمش.

یوسف زالی
دوشنبه 23 اردیبهشت 1392, 14:44 عصر
نه راستش دقت نکرده بودم.


در دلفی ایکس-ای 2 که مشکلی نداشت..

به نظر حاج محسن که مشکلی نداشت. شاید پچی چیزی داره. نمی دونم.
با این تفاسیر هنوز به نظرت باگ نیست؟
اگر هست، چطور می شه این باگ رو به شرکت ریپورت کرد؟
لینکش دقیقا چیه؟

BORHAN TEC
دوشنبه 23 اردیبهشت 1392, 15:01 عصر
سلام

با این تفاسیر هنوز به نظرت باگ نیست؟
از این باگها در دلفی و محیط های دیگر کم نیستند. همین الان در مورد دلفی 100 تا میشه مثال زد. :چشمک:

اگر هست، چطور می شه این باگ رو به شرکت ریپورت کرد؟
لینکش دقیقا چیه؟
از طریق QC. روش کار در اوایل کتاب Delphi XE3 Starter Essentials به صورت کامل توضیح داده شده است.

یوسف زالی
دوشنبه 23 اردیبهشت 1392, 16:13 عصر
اون HandleNedded دقیقا چه می کنه؟

Ananas
سه شنبه 24 اردیبهشت 1392, 15:52 عصر
ببین دقت کن من تو دو تا حالت تست زدم، یکی وقتی که روی TabSheet آخر بودم برنامه رو اجرا کردم و یکی هم وقتی روی TabSheet های دیگه بودم. وقتی ارور میده که روی آخری باشی! حالا حاج محسن رو کدوم حالت تست کرده؟ این مهمه. وگرنه وقتی منم روی TabSheet مثلا اولی باشم برای منم ارور نمیده.

MohsenB
سه شنبه 24 اردیبهشت 1392, 18:36 عصر
سلام

دوباره تست کردم دیدم که اگر تب آخر بصورت پیشفرض انتخاب باشه خطا ایجاد میکنه .

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

موفق باشید

یوسف زالی
سه شنبه 24 اردیبهشت 1392, 19:26 عصر
من برنامه رو روی بستر و کانفیگی که خودم نوشتم دارم بالا میارم و تا به جال همین Style ها و Skin ها و کامپوننت ها چندین هزار خط شده و خدارو شکر جواب هم داده.
همین رو بگم که نیاز دارم یک پنل رو در یک فرم ShowModal کنم!
و در اون پنل ممکنه یک فرم دیگه هم وجود داشته باشه.
به این صورت که فرم فرزند درون فرم پدر و به صورت Modal نمایش داده می شه.
این کار رو سال گذشته کردم و مشکلی نداشت تا اینکه به یکی از همین باگ ها برخوردم.
البته باگ رو هم رفع کردم و برای آینده نگری برای سایر اجزا هم چاره کردم.
مشکلی ندارم.
سوال اینه که داستان چیه که داره با HandleNeeded رفع می شه؟
اگر جزییات بیشتری لازم داشته باشید متاسفانه درحال حاضر نمی تونم این کار رو کنم.
همین رو بدونید که Refactpring یک برنامه ی 800 هزار خطی به روش سریع هست.

MohsenB
سه شنبه 24 اردیبهشت 1392, 22:08 عصر
سلام

فکر کنم بدونم چه چیزی میخواید ، میخواید یه پنجره دیالوگ محلی برای فرم داشته باشید که وقتی نمایش داده میشه اولا درون خود فرم باشه و ثانیا اجزای پشت این کادر غیر فعال بشن . یه چیزی شبیه پنجره های سیستم عامل مک او اس . چند وقت پیش من هم دنبال همچین چیزی بودم و به در نهایت به این نتیجه رسیدم که :

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

موفق باشید

یوسف زالی
سه شنبه 24 اردیبهشت 1392, 23:03 عصر
ممنون.
من دقیقا رفتار ShowModal یک فرم رو برای یک کنترل داخلی یک فرم پیاده کردم.
برای اینکه:
1- تمام کنترل های فرم پدر قفل بشن
2- دستور در خطی که ShowModal کرده اونقدر منتظر بشه تا تکلیف این کنترل داخلی با بستن مشخص بشه تا خط بعد از ShowModal ران بشه.