我的程式界面控制元件非常多,剛開始用時還好一點,接著越用越卡,卡到用滑鼠點擊一個控制元件時,可以清楚的看到控制元件對齊線緩緩的顯示出來,又緩緩的消失。兩三秒才回應過來,再用一會,報錯,IDE自動關閉。我現在一般都是用一個小時左右,關閉IDE重啟接著做。
最小化再恢復視窗時,里面的每個控制元件都是先一團黑,然后一個一個慢慢的顯示出原樣,有時候最小化再恢復可能都要好幾秒才能完成顯示。這個問題就連編譯后的 exe 運行起來也是這樣。網上說的什么雙緩沖,不但一點用沒有,就連在設計時期的界面上都顯示的一團糟。網上還有一段下面的代碼說可以解決編譯后 exe 的閃爍問題:
private
procedure CreateParams(var Params: TCreateParams); override;
procedure TFrm_Main.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := 33554432; //0x 02 00 00 00
end;
這段代碼可以解決剛show出表單時的閃爍問題,但當表單最小化再恢復時就沒有效果了。我估計是每次最小化再恢復時,Delphi 都會對表單進行重繪。
這問題只有D7不會,2010以上版本好像都會,反正我是從 XE2 開始用到現在的 Delphi 10 seattle ,這個問題一直都存在。 試過重裝系統,重裝 Delphi ,沒一點用。百度了一下,好像基本沒人說起這個問題,難道沒人有這樣的問題嗎? 不會吧..
uj5u.com熱心網友回復:
以前用Delphi2006的時候遇到過,不過不經常卡死,沒有好的辦法。只能將其他軟體安裝少點,或許是軟體沖突。uj5u.com熱心網友回復:
這與你的硬體有關,CPU速度,內在,顯卡記憶體,等等uj5u.com熱心網友回復:
建議換個顯卡,試試。有時顯眼反映,就是很慢。uj5u.com熱心網友回復:
很遺憾,從來沒碰到這種情況。這種情況一般都是程式CPU占用率非常高導致GUI更新遲鈍。uj5u.com熱心網友回復:
我遇到過,顯卡不行,造成顯示遲鈍。uj5u.com熱心網友回復:
今天剛好收了一臺I5 4460, 8G記憶體,固態,影馳750TI顯卡,然后全新安裝 WIN7 64,全新安裝 delphi。很遺憾,還是會出現這個問題,看來不是硬體問題。
uj5u.com熱心網友回復:
我測驗了一下,在一個視窗上創建超過1000個組件,在一個高配機器上縮放視窗能看到明顯的重繪程序,但也是瞬間完成,不會慢到不可接受。WS_EX_COMPOSITED(值0x02000000)擴展樣式可以改善閃爍,但此樣式有嚴重的副作用,在不同系統上副作用不同,比如非客戶區的按鈕影片效果消失,滾動條閃爍,CPU占用率高等。可以嘗試:1.把不涉及繪制界面的代碼放到單獨的執行緒里,主執行緒只用來重繪界面。2.個人建議少用WS_EX_COMPOSITED樣式。3.盡量減少子視窗類控制元件的使用,即減少CreateWindow創建的組件。使用DirectUI方式創建組件或者使用FMX庫,甚至可以html+js+css的方式創建界面。uj5u.com熱心網友回復:
測驗代碼如下:
procedure TForm1.FormCreate(Sender: TObject);
type
TWindowControlClass = class of TWinControl;
const
ObjList: array[0..11] of TWindowControlClass = (
TButton, TButton, TButton,
TCheckBox, TCheckBox, TCheckBox,
TEdit, TEdit, TEdit,
TRadioButton, TRadioButton, TRadioButton);
var
i, j: integer;
AControl: TWinControl;
begin
AutoScroll := true;
WindowState := wsMaximized;
for i := 0 to 11 do
for j := 0 to 99 do
begin
Acontrol := ObjList[i].Create(Self);
AControl.Parent := Self;
AControl.Width := 150;
AControl.Height := 20;
AControl.Left := i * 160;
AControl.Top := j * 20 + 5;
if AControl.ClassType = TButton then
(AControl as TButton).Caption := 'this is a button'
else
if AControl.ClassType = TCheckBox then
(AControl as TCheckBox).Caption := 'this is a checkbox'
else
if AControl.ClassType = TEdit then
(AControl as TEdit).Text := 'this is a edit'
else
if AControl.ClassType = TRadioButton then
(AControl as TRadioButton).Caption := 'this is a radiobutton';
end;
end;
在表單上生成1200個組件,都是帶視窗句柄的(從TWinControl派生),用XE5編譯,測驗了兩臺電腦,一臺AMD A10-6800k、一臺intel i7-6700k,都是16GB記憶體、核顯(很遺憾,我們這4、5年以來的電腦都是核顯),運行很流暢,只是從最小化恢復時有可感覺到的閃爍,其他的視窗移動、縮放、點擊、輸入都沒有任何問題。又在最老的一臺服務器(Pentium4 xeon 2.8GHz,1GB記憶體,實際這只是我們這最老的x86電腦,真正最老的電腦是一臺rs/6000 s80服務器,已經運行了將近18年,估計電費都耗了好幾萬
)上測驗了一下(遠程桌面),啟動有2~3秒的延遲,從最小化恢復時有明顯的重繪程序,從上到下、從右到左,不過視窗移動、縮放、點擊、輸入也沒有任何問題。所以我估計樓主的問題可能是:
1. 某些組件的事件處理比較耗時;
2. 有比較多的自繪制,而且不優化;
3. 多載了某些視窗處理程序,或者Application.OnMessage,某些操作耗時或導致反復重繪。
uj5u.com熱心網友回復:
從未遇到過,不過,我一直在用Delphi7,高版本的安裝程式太大。uj5u.com熱心網友回復:
如果一個視窗或一個界面,可視組件超過100個,則應該是設計思路有問題。一般xe以上版本可視組件超過100個就會有這種現象。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55091.html
標籤:VCL組件開發及應用
