2017-10-02 7 views
0

Ich verschiebe ein TMemo Objekt links und rechts in meiner GUI-Anwendung. Das Problem ist, dass die Buchstaben in meinem TMemo flackern, sobald die Bewegung beginnt.Wie zu vermeiden, flackern beim Animieren von GUI-Komponenten in Lazarus

Ich habe dies nachgeschlagen, und anscheinend die Einstellung der DoubleBuffering Eigenschaft meines Hauptformulars sollte mir geholfen haben, aber es tat nicht. Also habe ich versucht, diese Eigenschaft für alle bewegten Objekte auf true zu setzen, aber das Flimmern war immer noch vorhanden.

Gibt es Möglichkeiten, flackerfreie Animationen von GUI-Komponenten in Lazarus zu erreichen? Ich bin ein Neuling in Lazarus, also suche ich gerade blind nach Lösungen. Ich würde wirklich etwas Hilfe schätzen.

weiteren Kontext, hier ist, wie ich meine animieren TMemo: Ich habe einen TTimer mit einem Intervall von 10 bekam, und seine OnTimer Ereignis bewegt sich mein TMemo links und rechts zusammenhängend. Um die Bewegung etwas weicher zu machen, habe ich eine einfache Cosinus-Interpolationsfunktion hinzugefügt.

Am Ende hier ist der 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; 

Cosinus Interpolation:

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

Antwort

0

Ich würde versuchen, statt ein Bild zu bewegen:

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; 
Verwandte Themen