Witam.
Moj problem wyglada nastepująco:
Tworze komponent TProgressBarMarquee, ktory jest paskiem postepu dzialajacym w nieskonczonosc, czyli pokazuje, ze cos sie dzieje, ale nie jestem w stanie ocenic czasu trwania tej operacji.
Jego kod jest bardzo krotki i wyglada nastepujaco:
interface
uses Windows, ComCtrls, Messages, Controls;
const
PBS_MARQUEE = $08;
PBM_SETMARQUEE = (WM_USER + 10);
type TProgressBarMarquee = class(TProgressBar)
private
FActive: Boolean;
procedure SetActive(const Value: Boolean);
protected
procedure CreateParams(var Params: TCreateParams); override;
published
public
property Active : Boolean read FActive write SetActive;
end;
implementation
procedure TProgressBarMarquee.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or PBS_MARQUEE;
end;
procedure TProgressBarMarquee.SetActive(const Value: Boolean);
begin
FActive := Value;
if Value
then SendMessage(Handle, PBM_SETMARQUEE, 1, 0)
else SendMessage(Handle, PBM_SETMARQUEE, 0, 0);
end;
end.
Wszystko jest fajnie, poza jedna wadą - komponent odświeża sie na tyle często (jak to marquee), ze widac mruganie. Jest to strasznie nieestetyczne.
Gdy uzywamy zwyklego paska postepu TProgressBar, ten problem tez wystepuje, ale mozna go wyeliminowac przez uzycie podwojnego buforowania (DoubleBufferd := True).
Tutaj natomiast, gdy probuje tak zrobic, komponent "przestaje dzialac". Pasek postepu przestaje "latac". Po prostu nic sie nie dzieje.
Czy wie ktos jaka jest tego przyczyna i przede wszystkim jak to obejsc i jednak zastosowac tutaj podwojne buforowanie komponentu?
PS. Podwojne buforowanie calego formularza, czy tez nadrzednego kontenera jak np. TPanel powoduje albo taki sam skutek, albo wcale nie zwalcza migotania (czyli tak naprawde buforowania dalej nie ma na moim komponencie)