我有它的系統滾動條的圖形TCustomControl
後裔組成部分。問題是,當我將窗口移動到屏幕外部並將其拖回時,滾動條會消失(不會被繪製)。我怎樣才能解決這個問題 ?我在想,也許我應該在組件Paint
中調用滾動條Paint
方法,但我不知道如何。爲什麼我的滾動條並不總是正確繪製?
這是代碼。有沒有需要安裝的組件或放東西的主要形式,只需將代碼複製並分配TForm1.FormCreate
事件:
Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SuperList;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
List: TSuperList;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
List:=TSuperList.Create(self);
List.AlignWithMargins:=true;
List.Align:=alClient;
List.Visible:=true;
List.Parent:=Form1;
end;
end.
SuperList.pas
unit SuperList;
interface
uses Windows, Controls, Graphics, Classes, Messages, SysUtils, StdCtrls, Forms;
type
TSuperList = class(TCustomControl)
public
DX,DY: integer;
procedure Paint; override;
constructor Create(AOwner: TComponent); override;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure CreateParams(var Params: TCreateParams); override;
published
property TabStop default true;
property Align;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Marus', [TSuperList]);
end;
procedure TSuperList.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or WS_VSCROLL;
end;
procedure TSuperList.WMLButtonDown(var Message: TWMLButtonDown);
begin
DX:=Message.XPos;
DY:=Message.YPos;
Invalidate;
inherited;
end;
constructor TSuperList.Create(AOwner: TComponent);
begin
inherited;
DoubleBuffered:=true;
TabStop:=true;
Color:=clBtnFace;
BevelKind:=bkFlat;
Width:=200; Height:=100;
DX:=50; DY:=50;
end;
procedure TSuperList.Paint;
begin
Canvas.Brush.Color:=clWindow;
Canvas.FillRect(Canvas.ClipRect);
Canvas.TextOut(10,10,'Press left mouse button !');
Canvas.Brush.Color:=clRed;
Canvas.Pen.Color:=clBlue;
Canvas.Rectangle(DX,DY,DX+30,DY+20);
end;
end.
不知道你的問題,因爲我還沒有測試出來。但快速瀏覽一下你的代碼會發現一個可能會在未來出錯的錯誤。這是什麼錯誤。在你的組件類型定義所做tab屬性爲出版,使其在ObjectInspector是可見的,因此alow用戶將其設置爲True或False根據自己的需要,但您總是在接受tab爲True超然的接受tab值的組件構造在設計時設定。這可能會讓你的用戶感到厭惡,因爲在設計時刻這個價值就沒有用處了。所以你最終得到一個很容易被忽視的bug。 – SilverWarior 2014-10-07 22:33:32
不,這不是一個錯誤。當您將組件放在窗體上時,構造函數只執行一次,之後您可以根據需要更改該屬性的值。我測試過了。 – 2014-10-07 23:10:17
您不應該在控件的代碼中設置DoubleBuffered。同樣TabStop。 SilverWarrior的評論是準確的。 – 2014-10-08 07:20:07