ورود

View Full Version : مشکل با override کردن Paint



Delphi-Man
شنبه 23 خرداد 1388, 17:26 عصر
با سلام

دارم یه کامپیوننت با کلاس TImage میسازم که مجبورم پروسیجر Paint رو Override کنم. ولی بعد از Inherit و اجرای دستورات مثل Picture.bitmap.loadfromfile و یا اعمال تغییرات روی Canvas دوباره و دوباره Paint فراخوانی میشه. و در پایان همینجور این تابع فراخوانی میشه. چیکارش کنم؟

vcldeveloper
شنبه 23 خرداد 1388, 20:11 عصر
خب دیگه، وقتی شما دارید یک متد تقریبا سطح پایین مثل Paint را override می کنید، باید برای انجام کارتان هم از کدهای سطح پایین تر یا هم سطح آن استفاده کنید. کدهایی مثل LoadFromFile خودشان وابسته به متد Paint هستند و این متد را فراخوانی می کنند، طبیعی هست که اگر از آنها در داخل متد Paint استفاده کنید، موجب فراخوانی مجدد Paint بصورت بازگشتی می شوید.

Delphi-Man
یک شنبه 24 خرداد 1388, 00:43 صبح
پس چه راهکاری رو پیشنهاد می کنید؟

vcldeveloper
یک شنبه 24 خرداد 1388, 21:24 عصر
پس چه راهکاری رو پیشنهاد می کنید؟
گفتم که، باید از توابع یا متدهایی استفاده کنید که وابسته به Paint نباشند. من نمیدونم چرا باید در متد Paint از LoadFromFile استفاده کنید. متد Paint ممکن هست چندین هزار بار فراخوانی بشه، مسلما ارجاع به دیسک در همچین متدی کار جالبی نیست.

Delphi-Man
یک شنبه 24 خرداد 1388, 21:34 عصر
گفتم که، باید از توابع یا متدهایی استفاده کنید که وابسته به Paint نباشند. من نمیدونم چرا باید در متد Paint از LoadFromFile استفاده کنید. متد Paint ممکن هست چندین هزار بار فراخوانی بشه، مسلما ارجاع به دیسک در همچین متدی کار جالبی نیست.
ببینید کاری که می خوام انجام بدم اینه که یک کامپیوننت بسازم که دوتا Image به عنوان Property داره که انتخاب میشه. بعد یه property دیگه از نوع integer هست که مقدار AlphaBlend رو مشخص می کنه. وقتی که این عکس خودش جابه جا بشه یا یه شیءی روش جابه جا بشه می دونید که paint فراخوانی میشه. حالا می خوام هر دفعه که paint فراخوانی میشه عکس alphablend شده رو در picture اصلی TImage قرار بده. حالا اگه به جای paint کار دیگه ای میشه کرد یا اصلا کلا باید کار خاصی انجام داد ممنون میشم راهنمایی کنید.

vcldeveloper
دوشنبه 25 خرداد 1388, 00:48 صبح
خب LoadFromFile این وسط چی کاره هست؟

Delphi-Man
دوشنبه 25 خرداد 1388, 15:19 عصر
خب LoadFromFile این وسط چی کاره هست؟
خب اشتباه کردم! اصلا این لازم نیست! :افسرده: مهم اینه که هر تغییری در متد picture باعث دوباره فراخوانی paint میشه. :اشتباه:

vcldeveloper
سه شنبه 26 خرداد 1388, 02:23 صبح
مهم اینه که هر تغییری در متد picture باعث دوباره فراخوانی paint میشه.
بله. شما که میخواید متد سطح پایینی مثل Paint را override کنید، سعی کنید در آن مستقیما از توابع GDI یا GDI+ ویندوز برای رسم استفاده کنید. نکته بعدی هم اینکه، می تونید قبل از اعمال تغییرات، Canvas را با BeginUpdate قفل کنید، و بعد از تغییرات، آن را با EndUpdate از حالت قفل خارج کنید.

Delphi-Man
سه شنبه 26 خرداد 1388, 15:59 عصر
Canvas را با BeginUpdate قفل کنید، و بعد از تغییرات، آن را با EndUpdate از حالت قفل خارج کنید.
ولی اصلا پروسیجری به نام beginupdate وجود نداره در canvas

vcldeveloper
چهارشنبه 27 خرداد 1388, 13:53 عصر
ولی اصلا پروسیجری به نام beginupdate وجود نداره در canvas
ببخشید. فکر کنم در Canvas بجاش متدهای Lock و Unlock وجود داشته باشه.

Delphi-Man
چهارشنبه 27 خرداد 1388, 16:18 عصر
ببخشید. فکر کنم در Canvas بجاش متدهای Lock و Unlock وجود داشته باشه.
خواهش می کنم. من lock و unlock استفاده کردم قبلا ولی کار نمیکنه.

Delphi-Man
پنج شنبه 28 خرداد 1388, 16:54 عصر
آقا کسی جواب بنده رو نمیده؟ :(