2017-10-02 10 views
0

Je déplace un objet TMemo à gauche et à droite dans mon application graphique. Le problème est, est que les lettres dans mon TMemo clignotent dès que le mouvement commence. J'ai regardé ceci, et, apparemment, la définition de la propriété DoubleBuffering de mon formulaire principal aurait dû m'aider, mais ce n'était pas le cas. J'ai donc essayé de définir cette propriété sur true sur tous les objets en mouvement, mais le scintillement était toujours présent.Comment éviter le scintillement lors de l'animation de composants GUI dans Lazarus

Existe-t-il des moyens de réaliser des animations sans scintillement des composants de l'interface graphique dans Lazarus? Je suis un novice dans Lazarus, alors je cherche des solutions à l'aveuglette. J'apprécierais volontiers de l'aide.

Fournir davantage de contexte, voici comment j'anime mon TMemo: J'ai un TTimer avec une valeur d'intervalle de 10, et son événement OnTimer bouge mon TMemo gauche et à droite jointive. Pour rendre le mouvement légèrement plus fluide, j'ai ajouté une simple fonction d'interpolation cosinus.

En fin de compte est ici le code:

procedure TServerSideForm.ControlPanelHideTimerTimer(Sender: TObject); 
begin 
    if (hideAnimVal < 1) then 
    begin 
    hideAnimVal := hideAnimVal + 0.025; 
    end 
    else 
    begin 
    MemoHideTimer.Enabled:=false; 
    end; 


    // hideStart - starting position of my TMemo, hideEnd - end position of my TMemo 
    hideCurr := Round(CosineInterpolation(hideStart, hideEnd, hideAnimVal)); 

    Memo.Left:=hideCurr; 
end; 

interpolation Cosinus:

function CosineInterpolation(Val1, Val2, Angle: Double): Double; 
var 
    Percent: Double; 
begin 
    Percent := (1-Cos(Angle*PI))/2; 
    Result := (Val1 * (1 - Percent) + Val2 * Percent); 
end; 

Répondre

0

Je voudrais essayer de déplacer une image à la place:

var 
    Memo1dc: hdc; 
    Cnv: TCanvas; 
    Rct: TRect; 

implementation 

procedure TForm1.MemoHideTimerTimer(Sender: TObject); 
begin 
    if Memo1.Visible then 
    begin 
    Memo1dc := GetDC(Memo1.Handle); 
    Cnv.Handle := Memo1dc; 
    Rct.Height := Memo1.Height; 
    Rct.Width := Memo1.Width; 
    Image1.Left := Memo1.Left; 
    Image1.Top := Memo1.Top; 
    Image1.Width := Memo1.Width; 
    Image1.Height := Memo1.Height; 
    Image1.Canvas.CopyRect(Rct, Cnv, Rct); 
    Memo1.Visible := False; 
    Image1.Visible := True; 
    end; 
    if (hideAnimVal < 1) then 
    begin 
    hideAnimVal := hideAnimVal + 0.025; 
    end 
    else 
    begin 
    MemoHideTimer.Enabled := False; 
    end; 

    // hideStart - starting position of my TMemo, hideEnd - end position of my TMemo 
    hideCurr := Round(CosineInterpolation(hideStart, hideEnd, hideAnimVal)); 
    Image1.Left := hideCurr; 
    if MemoHideTimer.Enabled = False then 
    begin 
    Memo1.Left := Image1.Left; 
    Memo1.Visible := True; 
    Image1.Visible := False; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Cnv := TCanvas.Create; 
end;