2012-01-02 36 views
1

私は、1つのフォームを持つDelphi XE2によって作成されたアプリケーションを持っています。アプリケーションがデスクトップ上でフォームの点滅を実行すると、滑らかではありません。私は "ダブルバッファー"と "ペアレントダブルバッファー"をすべての可能性に当てはめました。しかし、フォームficlerが存在します。その後、私は1つのFadeInTimerを追加し、それは正常に動作します。私は質問している "任意のタイマーデルファイフォームなしでちらつきを削除することができますかどうか"です。可能であれば、どのように教えてください?Delphiフォームのちらつき

unit KoushikHalder01; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls, 
    Vcl.ComCtrls; 
type 
    TForm01 = class(TForm) 
    Label01: TLabel; 
    Edit01: TEdit; 
    Edit02: TEdit; 
    BitBtn01: TBitBtn; 
    BitBtn02: TBitBtn; 
    procedure FormCreate(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormShow(Sender: TObject); 
    procedure FormHide(Sender: TObject); 
    procedure BitBtn01MouseEnter(Sender: TObject); 
    procedure BitBtn02MouseEnter(Sender: TObject); 
    procedure BitBtn01MouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure BitBtn02MouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure BitBtn01MouseLeave(Sender: TObject); 
    procedure BitBtn02MouseLeave(Sender: TObject); 
    procedure BitBtn02Click(Sender: TObject); 
    procedure BitBtn01Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form01: TForm01; 

implementation 

{$R *.dfm} 

uses System.IOUtils; 

procedure TForm01.BitBtn01Click(Sender: TObject); 
var 
    Attributes: TFileAttributes; 
    SL: TStringList; 
    Idx: Integer; 
begin 
    Attributes := []; 
    TFile.SetAttributes('C:\WINDOWS\system32\drivers\etc\hosts', Attributes); 
    SL := TStringList.Create; 
    try 
     SL.LoadFromFile('C:\WINDOWS\system32\drivers\etc\hosts'); 

    if 
     SL.IndexOf('10.220.70.34 VIRTSDP25') <> -1 
    then 
     begin 
     Edit02.Text := 'Your Host File Has Already Been Modified Successfully.'; 
     end; 
    if 
     SL.IndexOf('10.220.70.34 VIRTSDP25') = -1 
    then 
     begin 
     SL.Add('10.220.70.34 VIRTSDP25'); 
     Edit02.Text := 'Your Host File Has Been Modified Successfully.'; 
     end; 
    if 
     SL.IndexOf('10.220.70.32 BSNLESDP25A') = -1 
    then 
     SL.Add('10.220.70.32 BSNLESDP25A'); 
    if 
     SL.IndexOf('10.220.70.33 BSNLESDP25B') = -1 
    then 
     SL.Add('10.220.70.33 BSNLESDP25B'); 
    if 
     SL.IndexOf('10.220.70.34 VIRTBSNLESDP25') = -1 
    then 
     SL.Add('10.220.70.34 VIRTBSNLESDP25'); 
    if 
     SL.IndexOf('10.220.70.34 KOSDPTwentyfive.bsnl.in.net') = -1 
    then 
     SL.Add('10.220.70.34 KOSDPTwentyfive.bsnl.in.net'); 
    if 
     SL.IndexOf('10.220.70.34 KOSDPTwentyfive.bsnl.net.in') = -1 
    then 
     begin 
      SL.Add('10.220.70.34 KOSDPTwentyfive.bsnl.net.in'); 
      SL.SaveToFile('C:\WINDOWS\system32\drivers\etc\hosts'); 
     end; 
    finally 
     SL.Free; 
    end; 
    Include(Attributes, TFileAttribute.faSystem); 
    Include(Attributes, TFileAttribute.faReadOnly); 
    TFile.SetAttributes('C:\WINDOWS\system32\drivers\etc\hosts', Attributes); 
end; 

procedure TForm01.BitBtn01MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    BitBtn01.Font.Color :=10379745; 
end; 

procedure TForm01.BitBtn01MouseEnter(Sender: TObject); 
begin 
    BitBtn01.Font.Color :=16711825; 
end; 

procedure TForm01.BitBtn01MouseLeave(Sender: TObject); 
begin 
    BitBtn01.Font.Color :=15756035; 
end; 

procedure TForm01.BitBtn02Click(Sender: TObject); 
begin 
    Form01.Close; 
end; 

procedure TForm01.BitBtn02MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    BitBtn02.Font.Color :=10379745; 
end; 

procedure TForm01.BitBtn02MouseEnter(Sender: TObject); 
begin 
    BitBtn02.Font.Color :=16711825; 
end; 

procedure TForm01.BitBtn02MouseLeave(Sender: TObject); 
begin 
    BitBtn02.Font.Color :=15756035; 
end; 

procedure TForm01.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Doublebuffered := True; 
end; 

procedure TForm01.FormCreate(Sender: TObject); 
begin 
    Doublebuffered := True; 
end; 

procedure TForm01.FormHide(Sender: TObject); 
begin 
    Doublebuffered := True; 
end; 

procedure TForm01.FormShow(Sender: TObject); 
begin 
    Doublebuffered := True; 
end; 

end. 
+1

あなたは「ちらつき」とはどういう意味ですか?あなたのコンピュータ上の他のアプリケーションのウィンドウはちらつきますか?再発コードを投稿してください。 –

+0

フォームの点滅とは、アプリケーションが実行されたときに1つの瞬きがあることを意味します。私のコンピュータ上の他のアプリケーションはこれを持っていません。 Hotfileにプロジェクトファイルをアップロードしました。ダウンロードしてご覧ください。私を助けてください。 ここにダウンロードリンクがあります: http://hotfile.com/dl/139737012/08f4647/KoushikHalder.7z.html –

+0

「DoubleBuffered」の繰り返し設定をすべて削除することから始めます。それを一度(必要に応じて)設定しておきます。 'DoubleBuffered'の変更には、' TWinControl.SetDoubleBuffered'で見られるように副作用があります。変更すると単純なプロパティ設定ではありません。 'BitBtn01Click'の全てのコードは、ここで尋ねられた質問とは無関係です。 –

答えて

1

DoubleBufferedは常にちらつきを修正していない、といくつかの状況では物事を悪化させることができます。

は、ここに私のコードです。サイズ変更中はDoubleBufferedのみを使用し、サイズ変更が完了すると元に戻します。このプロパティは、実際にサイズ変更されているコントロールでのみ使用する必要があります。たとえば、フォームのサイズを変更する場合は、フォームでDoubleBufferedを有効にします。しかし、パネルのコンテンツのサイズを変更するときは、そのパネル(およびすべての子コントロール)に対してのみ有効にしてください。

しかし、ここでは

避けがちらつきを低減するための4つの方法があります プログラミング、グラフィックのちらつきA Collection of Delphi Tips & Tricks (PDF)からいくつかのヒントがあります:

  1. 使用のTWinControlの子孫のDoubleBufferedプロパティ:設定DoubleBuffered: =真;

  2. コントロールが透明でない場合は、ControlStyleにcsOpaqueを追加します。ControlStyle:= ControlStyle + [csOpaque];

  3. WM_ERASEBKGND Windowsメッセージを処理し、Msg.Result:= 1;を設定します。ハンドラ内

  4. (ダブルバッファリングのような、しかし、すべてのコントロールのために働く)オフスクリーンビットマップを使用し

関連する問題