2012-01-02 53 views
1

我有一個由Delphi XE2創建的應用程序有一種形式。當應用程序將表單閃爍到桌面時,它並不平滑。我已經設定了「雙重緩衝」和「父母雙重緩衝」對所有可能性都是真實的。但形式ficler是存在的。然後我添加了一個FadeInTimer,它工作正常。我的問題是「沒有任何計時器德爾菲形式閃爍可以被刪除或不」。如果可能請告訴我如何?Delphi Form閃爍

這裏是我的代碼:

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

你是什麼意思的「忽悠」嗎?計算機上其他應用程序的窗口閃爍嗎?發佈repro代碼。 – 2012-01-03 05:57:37

+0

表單閃爍意味着當應用程序運行一個閃爍時。我的電腦上的其他應用程序沒有這個。我已經在Hotfile中上傳了我的項目文件。請下載並seee。請幫幫我。 這裏是下載鏈接: http://hotfile.com/dl/139737012/08f4647/KoushikHalder.7z.html – 2012-01-03 17:24:54

+0

開始刪除所有'DoubleBuffered'重複設置。將其設置一次(如果需要)並保持獨立。 'DoubleBuffered'中的變化有副作用,你可以在'TWinControl.SetDoubleBuffered'中看到 - 當它改變時它不是一個簡單的屬性設置。 'BitBtn01Click'中的所有代碼都與這裏提出的問題無關。 – 2014-12-16 19:21:17

回答

1

DoubleBuffered並不總是解決閃爍,並在某些情況下可能使事情變得更糟。您可能會考慮在調整大小時僅使用DoubleBuffered,然後在調整大小時將其切換回。該屬性只能用於實際調整大小的那些控件。例如,在調整窗體大小時,在窗體上啓用DoubleBuffered。但是,只調整面板的內容時,只需爲該面板(及其所有子控件)啓用它。

但這裏有從A Collection of Delphi Tips & Tricks (PDF)的一些技巧

避免在圖形編程 有減少閃爍四種方式閃爍:

  1. 使用TWinControl後裔DoubleBuffered屬性:設置DoubleBuffered: = true;如果您的控件不透明,請在ControlStyle中包含csOpaque:ControlStyle:= ControlStyle + [csOpaque];如果您的控件不透明,請在ControlStyle中包含csOpaque:ControlStyle:= ControlStyle + [csOpaque];如果您的控件不透明,

  2. 處理WM_ERASEBKGND Windows消息並設置Msg.Result:= 1;

  3. 所述處理機離屏位圖(如雙緩衝,但適用於任何控制)