PDA

View Full Version : مشکل با double buffered



Delphi-Man
سه شنبه 03 شهریور 1388, 00:24 صبح
سلام
من دلفی 2009 گرفتم خیلی هم عالی بود. فقط doublebuffered جواب نمیده... :عصبانی:چیزی که نیاز خیلی خیلی خیلی حیاتی بهش دارم. آیا چیز خاصی هست که باید فعال بشه؟ :عصبانی++:

vcldeveloper
سه شنبه 03 شهریور 1388, 00:57 صبح
جواب نمیده یعنی چی؟ اتفاقا بهتر از گذشته از این خصوصیت پشتیبانی میکنه. سوال واضح بپرسید، که آدم مجبور نشه برای جواب دادن چند تا سوال دیگه هم بپرسه!

Delphi-Man
سه شنبه 03 شهریور 1388, 11:02 صبح
خیلی سادست! من روی خود فرم کلیک می کنم بعد DoubleBuffered=true میذارم. بعد یه برنامه می نویسم که وقتی روی یک مستطیل کلیک می کنی و میکشی جا به جا میشه ولی مرتب چشمک می زنه.
آقای کشاورز اگه برای شما کار داد لطفا یه برنامه کوچیک بنویسید و به من بدید ببینم عمل میده یا نه.
ممنون

Felony
سه شنبه 03 شهریور 1388, 12:08 عصر
نمونه رو ببینید ، فکر میکنم مشکل از کدنویسی شماست .

Delphi-Man
چهارشنبه 04 شهریور 1388, 01:07 صبح
ممنون. ولی ظاهرا روی mdi application جواب نمیده.

Delphi-Man
شنبه 11 مهر 1388, 18:48 عصر
اصلا از این دلفی 2009 خوشم نیومد باگ داره آخه وقتی panel ایجاد می کنیم خاصیت doublebuffered قبول نمیکنه و هر چی true می کنیم حرف تو کلش نمیره :عصبانی++: مگه اینکه AlphaBlend بیخودی به فرم بدیم که این هم اشتباه محضه. کسی از دوستان راه حلی داره؟

vcldeveloper
یک شنبه 12 مهر 1388, 01:21 صبح
اصلا از این دلفی 2009 خوشم نیومد باگ داره آخه وقتی panel ایجاد می کنیم خاصیت doublebuffered قبول نمیکنه و هر چی true می کنیم حرف تو کلش نمیره :عصبانی++: مگه اینکه AlphaBlend بیخودی به فرم بدیم که این هم اشتباه محضه. کسی از دوستان راه حلی داره؟
من همچین مشکلی با دلفی 2009 ندارم.

Delphi-Man
یک شنبه 12 مهر 1388, 07:18 صبح
من همچین مشکلی با دلفی 2009 ندارم.
یعنی شما اگه فرم MDI طراحی کنید یا اگر panel قرار بدین و همه ی DoubleBuffered ها رو هم True کنید (Property) بازم عمل میده؟ برای من چشمک میزنه. توی یه برنامه ساده هم اینکارو کردم بازم عمل نداد. لطفا یه سورس بذارید منم ببینم.
ممنون

vcldeveloper
یک شنبه 12 مهر 1388, 16:30 عصر
یعنی شما اگه فرم MDI طراحی کنید یا اگر panel قرار بدین و همه ی DoubleBuffered ها رو هم True کنید (Property) بازم عمل میده؟
اولا من هیچ وقت از MDI استفاده نمی کنم، چون یک روش منسوخ شده هست، و خود مایکروسافت هم به برنامه نویسان ویندوز توصیه میکنه در نرم افزارهای جدید از این روش استفاده نکنند.
ثانیا، ویندوز با پنجره های MDI را متفاوت از پنجره های عادی برخورد میکنه.
ثالثا، چرا نیاز دارید DoubleBuffered را برای همه کنترل ها فعال کنید؟!!
رابعا، بله، حتی در صورت استفاده از MDI Form و فعال کردن DoubleBuffered برای همه کنترل ها هم من پرش یا چشمکی در ویندوز ویستا و XP ندیدم.

سورس به همراه یک نمونه EXE کامپایل شده، ضمیمه شد.

Delphi-Man
یک شنبه 12 مهر 1388, 20:28 عصر
اولا من هیچ وقت از MDI استفاده نمی کنم، چون یک روش منسوخ شده هست، و خود مایکروسافت هم به برنامه نویسان ویندوز توصیه میکنه در نرم افزارهای جدید از این روش استفاده نکنند.
ثانیا، ویندوز با پنجره های MDI را متفاوت از پنجره های عادی برخورد میکنه.
ثالثا، چرا نیاز دارید DoubleBuffered را برای همه کنترل ها فعال کنید؟!!
رابعا، بله، حتی در صورت استفاده از MDI Form و فعال کردن DoubleBuffered برای همه کنترل ها هم من پرش یا چشمکی در ویندوز ویستا و XP ندیدم.

سورس به همراه یک نمونه EXE کامپایل شده، ضمیمه شد.
اولا سورستون ناقص بود!! ثانیا عکس توی panel قرار نداشت. ثالثا جابجا کردن فرم تاثیری در چشمک زدن یا نزدن نداره. رابعا اینو که از سورس خودتون درست کردم ببینید: (روی عکس کلیک رو نگه دارید و اونو جابجا کنید تا ببینید که چطوری با وجود روشن بودن doubleBuffered چشمک میزنه...)

AbiriAmir
یک شنبه 12 مهر 1388, 20:50 عصر
اولا من هیچ وقت از MDI استفاده نمی کنم، چون یک روش منسوخ شده هست، و خود مایکروسافت هم به برنامه نویسان ویندوز توصیه میکنه در نرم افزارهای جدید از این روش استفاده نکنند.
ثانیا، ویندوز با پنجره های MDI را متفاوت از پنجره های عادی برخورد میکنه.
ثالثا، چرا نیاز دارید DoubleBuffered را برای همه کنترل ها فعال کنید؟!!
رابعا، بله، حتی در صورت استفاده از MDI Form و فعال کردن DoubleBuffered برای همه کنترل ها هم من پرش یا چشمکی در ویندوز ویستا و XP ندیدم.

سورس به همراه یک نمونه EXE کامپایل شده، ضمیمه شد.

چرا استفاده نکنن؟؟؟
مگه چشه؟
چه دلیلی داره؟؟؟

AbiriAmir
یک شنبه 12 مهر 1388, 20:53 عصر
در ضمن از چه روشی استفاده کردین که اینجوری Image رو میگیریم و جابجا میکنیم؟
تو دلفی 7 هم میشه؟؟؟

vcldeveloper
یک شنبه 12 مهر 1388, 23:18 عصر
اولا سورستون ناقص بود!
چیش ناقص بود؟!


ثانیا عکس توی panel قرار نداشت.
مگه شما اشاره ایی هم به عکس در سوالتان کرده بودید؟! سوال شما این هست:


اصلا از این دلفی 2009 خوشم نیومد باگ داره آخه وقتی panel ایجاد می کنیم خاصیت doublebuffered قبول نمیکنه و هر چی true می کنیم حرف تو کلش نمیره :عصبانی++: مگه اینکه AlphaBlend بیخودی به فرم بدیم که این هم اشتباه محضه.
در جای دیگه هم اشاره کردید که منظورتون فرم MDI هست. سورسی هم که برای شما قرار داده شد، نشان میده که در فرم های MDI میشه خصوصیت DoubleBuffered یک Panel را بدون نیاز به تغییر AlphaBlend فرم تنظیم کرد.

یک بار در پست شماره 2 به شما گفتم:

سوال واضح بپرسید، که آدم مجبور نشه برای جواب دادن چند تا سوال دیگه هم بپرسه!
ولی متاسفانه دقت نمی کنید!


در هر حال، در ویندوز ضمانتی وجود نداره که DoubleBuffered به طور کامل Flicker (یا همون چشمک زدن) را در هنگام رسم از بین ببره، بلکه SDK ویندوز به شما میگه این حالت میتونه باعث از بین رفتن یا کاهش Flicker بشه. دلفی برای استفاده از آن از توابع API ویندوز استفاده میکنه.

Delphi-Man
دوشنبه 13 مهر 1388, 15:55 عصر
در ضمن از چه روشی استفاده کردین که اینجوری Image رو میگیریم و جابجا میکنیم؟
تو دلفی 7 هم میشه؟؟؟
معلومه چرا نشه؟!

چیش ناقص بود؟!
مگه شما اشاره ایی هم به عکس در سوالتان کرده بودید؟!
در جای دیگه هم اشاره کردید که منظورتون فرم MDI هست. سورسی هم که برای شما قرار داده شد، نشان میده که در فرم های MDI میشه خصوصیت DoubleBuffered یک Panel را بدون نیاز به تغییر AlphaBlend فرم تنظیم کرد.
ولی متاسفانه دقت نمی کنید!

آقای کشاورز وقتی من می گم panel ، مسلما منظورم داخل panel هست، ولی شما عکس رو خارج از اون گذاشته بودین. بعدم جا به جا کردن فرم دلیل جالبی برای اثبات چشمک زدن عکس نمیشد که تو این مثالی که گذاشتم چشمک زدن تابلو بود.


در ویندوز ضمانتی وجود نداره که DoubleBuffered به طور کامل Flicker (یا همون چشمک زدن) را در هنگام رسم از بین ببره، بلکه SDK ویندوز به شما میگه این حالت میتونه باعث از بین رفتن یا کاهش Flicker بشه. دلفی برای استفاده از آن از توابع API ویندوز استفاده میکنه.

پس چرا دلفی 7 این مشکل رو نداره؟!! :متعجب:

vcldeveloper
سه شنبه 14 مهر 1388, 02:21 صبح
پس چرا دلفی 7 این مشکل رو نداره؟!
در دلفی 7 شما اصلا برای کنترل ها خصوصیت DoubleBuffered ندارید! فقط برای فرم این خصوصیت را دارید. من کد شما را در دلفی 7 تحت ویستا اجرا کردم، اگر DoubleBuffered فرم MDI Child فعال باشه، کل رسم Panel دچار مشکل میشه، و در صورت درگ کردن تصویر، رسم کل Panel به هم میریزه. اگر هم DoubleBuffered غیرفعال باشه، همون Flickerهایی که در دلفی 2009 موقع درگ ایجاد می شدند، در دلفی 7 هم ایجاد میشند. البته برای من هم در دلفی 7 و هم در دلفی 2009 میزان این Flickerها بسیار ناچیز و محدود بود.

Delphi-Man
سه شنبه 14 مهر 1388, 14:41 عصر
اتفاقا برای همه ی WinControl ها (از جمله فرم) این کار شدنی هست... هم در دلفی 7 و هم 2009 با این تفاوت که دلفی 2009 بازم چشمک میزنه. من الان با دلفی 7 یه برنامه بزرگ نوشتم و مجبور بودم از این خاصیت استفاده کنم برای multiSelection چند شیء ؛ که از canvas.Rect مربوط به فرم استفاده کردم و چشمک نمیزد. ولی در دلفی 2009 چشمک میزنه!! پس دلفی 2009 ایراد داره!

vcldeveloper
سه شنبه 14 مهر 1388, 18:54 عصر
من الان با دلفی 7 یه برنامه بزرگ نوشتم و مجبور بودم از این خاصیت استفاده کنم برای multiSelection چند شیء ؛ که از canvas.Rect مربوط به فرم استفاده کردم و چشمک نمیزد. ولی در دلفی 2009 چشمک میزنه!! پس دلفی 2009 ایراد داره!
این مدل منطق را می تونید برای خودتون نگهدارید. در ویندوز XP میشد در Program Files فایل ها را تغییر داد، درحالی که مطابق مستندات ویندوز، برنامه نویس باید فایل های مرتبط با برنامه را در پوشه AppData نگهداری می کرد. برنامه نویس توجه نمی کرد، ویندوز هم گیر نمی داد. در ویندوز ویستا این روال تغییر کرد، و ویندوز مطابق با مستندات خودش مانع از این شد که فایل های Program Files توسط برنامه تغییر داده بشند. بعضی از برنامه ها از کار افتادند. حالا برنامه نویسان این برنامه ها باید بیان بگن که ویستا مشکل داره؟ یا باید جواب بدن که چرا از اول بر اساس آن چیزی که در SDK ویندوز مطرح شده بود عمل نکردند؟!

شما کدی نوشتید که در دلفی 7 کار می کرد (حالا بماند که برای من کد دلفی 7 هم Flicker داشت)، کد را به دلفی 2009 منتقل کردید، و چون دیدید Flicker داره، بلافاصله نتیجه گرفتید که مشکل از دلفی 2009 هست؟!

در زمان دلفی 7، ویندوز توابع اختصاصی برای رسم بافر شده ارائه نمی کرد. برنامه نویس خودش باید با کدنویسی این مکانیزم را فراهم می کرد. این همون کاری هست که دلفی 7 برای شما انجام میده. در نسخه های جدیدتر ویندوز توابع اختصاصی این کار در UxTheme.dll فراهم شدند. در دلفی 2009، اگر خاصیت DoubleBuffered فعال باشه، متد WMPaint که Message Handler مربوط به پیام WM_PAINT هست، شیوه رسم را با توجه به ورژن ویندوز تعیین میکنه. اگر برنامه در حال اجرای بر روی ورژن های قدیمی ویندوز باشه، از کد مشابه دلفی 7 برای رسم استفاده میکنه، وگرنه از توابع اختصاصی ویندوز در UxTheme.dll برای رسم بافر شده استفاده میکنه.

درباره DoubleBuffered هم قبلا توضیح دادم که هیچ جا تضمین داده نشده استفاده از این تکنیک لزوما به معنای حذف Flicker هست، بلکه گفته شده به منظور حذف یا کاهش Flicker میشه از اون استفاده کرد. اینکه آیا استفاده از این خصوصیت باعث حذف Flicker میشه، یا کاهش آن، تا حدود زیادی به نحوه رسم اون کنترل خاص، و چگونگی استفاده از آن کنترل بستگی داره.

Delphi-Man
چهارشنبه 15 مهر 1388, 07:00 صبح
این مدل منطق را می تونید برای خودتون نگهدارید. در ویندوز XP میشد در Program Files فایل ها را تغییر داد، درحالی که مطابق مستندات ویندوز، برنامه نویس باید فایل های مرتبط با برنامه را در پوشه AppData نگهداری می کرد. برنامه نویس توجه نمی کرد، ویندوز هم گیر نمی داد. در ویندوز ویستا این روال تغییر کرد، و ویندوز مطابق با مستندات خودش مانع از این شد که فایل های Program Files توسط برنامه تغییر داده بشند. بعضی از برنامه ها از کار افتادند. حالا برنامه نویسان این برنامه ها باید بیان بگن که ویستا مشکل داره؟ یا باید جواب بدن که چرا از اول بر اساس آن چیزی که در SDK ویندوز مطرح شده بود عمل نکردند؟!

شما کدی نوشتید که در دلفی 7 کار می کرد (حالا بماند که برای من کد دلفی 7 هم Flicker داشت)، کد را به دلفی 2009 منتقل کردید، و چون دیدید Flicker داره، بلافاصله نتیجه گرفتید که مشکل از دلفی 2009 هست؟!

در زمان دلفی 7، ویندوز توابع اختصاصی برای رسم بافر شده ارائه نمی کرد. برنامه نویس خودش باید با کدنویسی این مکانیزم را فراهم می کرد. این همون کاری هست که دلفی 7 برای شما انجام میده. در نسخه های جدیدتر ویندوز توابع اختصاصی این کار در UxTheme.dll فراهم شدند. در دلفی 2009، اگر خاصیت DoubleBuffered فعال باشه، متد WMPaint که Message Handler مربوط به پیام WM_PAINT هست، شیوه رسم را با توجه به ورژن ویندوز تعیین میکنه. اگر برنامه در حال اجرای بر روی ورژن های قدیمی ویندوز باشه، از کد مشابه دلفی 7 برای رسم استفاده میکنه، وگرنه از توابع اختصاصی ویندوز در UxTheme.dll برای رسم بافر شده استفاده میکنه.

درباره DoubleBuffered هم قبلا توضیح دادم که هیچ جا تضمین داده نشده استفاده از این تکنیک لزوما به معنای حذف Flicker هست، بلکه گفته شده به منظور حذف یا کاهش Flicker میشه از اون استفاده کرد. اینکه آیا استفاده از این خصوصیت باعث حذف Flicker میشه، یا کاهش آن، تا حدود زیادی به نحوه رسم اون کنترل خاص، و چگونگی استفاده از آن کنترل بستگی داره.
من نگفتم برنامم رو از دلفی 7 به دلفی 2009 انتقال دادم. من گفتم یه نمونه برای تست نوشتم تو دلفی 2009 دیدم اونجوریه. برنامه ی اصلی که از همون اولش در دلفی 2009 نوشتم برنامه ای هستش که toolbar بالای اون به صورت fade عمل می کنه. یعنی ماوس وقتی واردش میشه fade in میشه و وقتی خارج میشه fade out. ولی در طی فرآیند چشمک میزنه و این مشکل همونجوری که گفتم با doubleBuffered حل نمیشه. بلکه با AlphaBlend به طور کامل حل میشه. ولی AlphaBlend راه استانداردی برای اینکار نیست. حالا شما راهی رو می دونید که بتونم اجرا کنم تا مشکل Flicker حل یشه؟

Delphi-Man
پنج شنبه 16 مهر 1388, 14:58 عصر
سلام
مشکل با غیر فعال کردن ParentBackground حل شد. دم این Embarcadero گرم!! تو فروم هاش جواب این سوال رو دادن!! خیلی کیف کردم. از آقای کشاورز هم ممنونم.

amir_ir
پنج شنبه 16 مهر 1388, 23:51 عصر
سلام به همه دوستان
میشه واسه ما تازه کارها هم توضیح بدید اصلا MDI و doublebuffer چیه و قصد دارید چیکار کنید ؟ سعی می کنیم استفاده ببریم
ممنون .شاد و پیروز