PDA

View Full Version : مشکل عدم نمایش اشیاء در opengl به هنگام مینیمایز کردن برنامه



asadi.ir
شنبه 23 اردیبهشت 1396, 16:22 عصر
با سلام . من در دلفی XE2 در یک panel دارم با opengl یه سری اشیاء سه بعدی ترسیم میکنم و رندر کردن رو هم با تابعی بنام gldraw انجام میدم . همه چی بدون مشکل انجام میشه تا زمانی که من برنامه رو مینیمایز میکنم و دوباره ماکزیمایز میکنم کلا panel خالی میشه تا اینکه با ماوس کلیک میکنم روی صفحه یا می خوام صحنه رو مثلا بچرخونم دوباره نمایش داده میشه . حتی اومدم در رویدادهای مختلف panel هم مجدد gldraw رو صدا زدم ولی نمیشه که نمیشه . لطفا راهنمایی بفرمایید.

golbafan
شنبه 23 اردیبهشت 1396, 23:57 عصر
سلام
رندر کردن در opengl مستقل از vcl و نرم افزار شماست. انتظار نداشته باشید با نمایش فرم، dll های opengl عملیات رندر رو اتوماتیک انجام بدن. بنابر این باید موقع restore شدن فرم مجدد دستور رندر رو از طرف opengl اجرا کنید.
برای این کار یک کامپوننت ApplicationEvents روی فرم بزارید و دستور رندر رو در متد OnRestore بنویسید

asadi.ir
شنبه 30 اردیبهشت 1396, 19:30 عصر
ممنون از پاسخ شما دوست عزیز. کامپوننت ApplicationEvents جزء کامپوننتهای پیشفرض دلفی هست ؟ میشه بفرمایید دقیقا با این کامپوننت باید چیکار کنم ؟ منظورم نمونه کد هست . ممنون.

persia_hrn
یک شنبه 31 اردیبهشت 1396, 13:51 عصر
سلام
کامپوننت ApplicationEvents جزء کامپوننتهای اصلی دلفی هست .
وقتی کامپوننت رو روی فرم گذاشتین توی برگه رویدادهاش چند تا رویداد داره که دستور رندر رو توی رویداد OnRestore بنویسید .

این کامپوننت رویدادهای فرمتون رو رصد میکنه و اگر فرم از حالت minimize خارج و restore بشه اون دستوری که نوشتین ( دستور رندر ) رو اجرا میکنه براتون

asadi.ir
پنج شنبه 04 خرداد 1396, 15:36 عصر
ممنون از پاسخ شما

asadi.ir
شنبه 20 خرداد 1396, 01:20 صبح
دوست عزیز کاری که گفتید رو انجام دادم ولی باز هم همون مشکل هست. جالبه وقتی یک showmessage قبل از دستور رندر در همون رویداد onrestore میذارم پیام که نشون داده میشه و ok رو میزنم رندر هم انجام میشه و نمایش داده میشه ولی وقتی showmessage رو برمیدارم رندر انجام میشه ولی نمایش داده نمیشه

persia_hrn
شنبه 20 خرداد 1396, 10:32 صبح
احتمالاً عمل رندر زمانی اتفاق میافته که خود فرمتون هنوز از تسکبار به صورت کامل Restore نشده ، شما یکبار به جای OnRestore ، عملیات رندر رو توی OnActive کامپوننتتون انجام بدید .

اگر باز هم جواب نگرفتین ، یه راه سادش اینه که یه وقفه برای رندر کردن بذارید

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
Sleep(1000); توقف یک ثانیه ای بعد از restore
عملیات رندر
end;