|
Тема |
Re: :) като си такъв отворко [re: Mixy] |
|
Автор | Ц++ (Нерегистриран) | |
Публикувано | 16.11.06 10:56 |
|
|
тук думите умници, отворковци много се тачат. явно само такива се очаква да ползват Делфи.
There are several ways to eliminate the flicker in the PaintBox control.
Add a WM_ERASEBKND handler and block the erase action - Тцъ! донт бачка. и аз така по инерция следвайки концепцията на VCL действах и си направим наследник на TPaintBox, но туй съобщение просто не пристигна. ходих да погледна в сорса малко - ами че то просто не се препраща на подконтролите TGraphicControl. за справка: procedure TWinControl.WMEraseBkgnd(var Message: TWMEraseBkgnd); в Controls unit.
Add csOpaque to the ControlStyle of the PaintBox - това csOpaque прави същото, като опита да прихванеш WM_ERASEBKND. справка: procedure TControl.InvalidateControl(IsVisible, IsOpaque: Boolean);
...
InvalidateRect(Parent.Handle, @Rect, not (IsOpaque or
(csOpaque in Parent.ControlStyle) or BackgroundClipped));
...
т.е. опцията указва дали по default като викнеш Invalidate на даден контрол, да се вика InvalidateRect с TRUE/FALSE за изпращане на EraseBkgnd. обаче ако Windows си реши поради каквито и да е други причини (например оразмеряване на прозореца да прерисува нещо, flicker-а е 100% налице при TGraphicControl).
Don't call Repaint, Refresh, or Invalidate. - точно Invalidate може да се вика без грижи, ако му включиш csOpaque. flicker тогава няма да имаш (горе кода с InvalidateRect).
п.с. може и да се бъркам някъде. някъде да не съм провел теста сериозно или да съм се подвел. но въпроса ми беше не толкова да се разпали война за или против делфи, борланд и т.н. колкото до това да се поприказва за концепцията. за това има ли счупен момент някъде и къде е той. как да се заобиколи и т.н. тук в TGraphicControl съвсем определено има. и то не че е толкова невъзможен и труден за реализация, ами е просто някакво недоглеждане.
п.с.#2 - ако искате да спомена за още недоглеждания - TClientSocket в асинхронен режим изхвърляше един Exception, който няма начин как да се прихване. просто гръмва (не си спомням точно как и защо). това беше още при Делфи 3! имаше го в Делфи 4 и в Делфи 5. не знам дали са го оправили. откакто се сблъсках с него ползвам други сокет компоненти. резонния въпрос е - като ще има компонененти VCL за какво да ги ползваме, след като ще трябва да търсим други работещи неща. тези в палитрата били само за общия случай.
общия случай е да правиш бързо стабилни неща с малко усилия и труд. на това аз му викам RAD (rapid application development) - нещо за което претендира делфито. и трябва да го защитава.
|
| |
|
|
|