试着做了个控件,帮我看看(50分)

  • 主题发起人 主题发起人 Dk108
  • 开始时间 开始时间
D

Dk108

Unregistered / Unconfirmed
GUEST, unregistred user!
刚做了个控件,想在DrawGrid的每一行的第一列加上一个CheckBox,但是编译以后每次添加
到一个Form上,在DrawGrid上都有闪烁,而且运行也看不到CheckBox,那位高手能帮我看看是什么
原因!
unit XzlDrawGrid;

interface

uses
windows,SysUtils,Classes,Grids,Graphics,Messages,Controls,StdCtrls,Forms;
type
TXzlDrawGrid=class(TDrawGrid)
private
fcolor:TColor;
procedure setcolor(const value:TColor);
public
CheckBox:Array[1..100]of TCheckBox;
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
procedure DrawCell(ACol,ARow:LongInt;ARect:TRect;AState:TGridDrawState);override;
published
property mycolor:TColor read fcolor write setcolor;

end;

procedure Register;


implementation

procedure Register;
begin
RegisterComponents('Samples',[TXzlDrawGrid]);
end;

constructor TXzlDrawGrid.Create(AOwner:TComponent);
var
i:integer;
begin
inherited Create(AOwner);
FColor := clBtnFace;
for i:=1 to col do
CheckBox:=TCheckBox.create(Self);
end;

destructor TXzlDrawGrid.Destroy;
begin
inherited;
end;

procedure TXzlDrawGrid.setcolor(const value:TColor);
begin
Fcolor:=value;
refresh;
end;

procedure TXzlDrawGrid.DrawCell(ACol,ARow:LongInt;ARect:TRect;AState:TGridDrawState);
begin
if (ACol=1)and(ARow<>0) then
begin
CheckBox[ACol].Parent:=Self;
CheckBox[ACol].Left:=ARect.Left;
CheckBox[ACol].Top:=ARect.Top;
CheckBox[ACol].Height:=ARect.Bottom-ARect.Top;
CheckBox[ACol].Show;
end;
inherited;
end;
end.
 
你create的东西不用free的么?
 
constructor TXzlDrawGrid.Create(AOwner:TComponent);
var
i:integer;
begin
inherited Create(AOwner);
FColor := clBtnFace;
for i:=1 to col do
begin
CheckBox:=TCheckBox.create(Self);
CheckBox.Parent := Self
end;
end
 
to taozhiyu:
但是我要用到checkbox,怎么能free了呢?

to tseug:
Checkbox.parent我在DrawCell中附值了呀:)
 
我觉得在那里是有问题的。[:(],你试试吧,我这样做过没甚么问题。
 
to tseug:
我试了一下,把checkbox.parent加在create里面后,控件出错,可能是self还没有
创建的原因吧,你试过吗?可以吗?有没有源码?
 
正在看,晚上告诉你。
 
想给你改也不行啊,我放假了


 
你的控件存在以下问题:
1、CheckBox没有Free;
2、你在DrawCell中实际上只用到一个CheckBox,而你一下子定义了100个CheckBox,
简直是资源杀手;
3、你的处理思路根本性就是错误的,由于你都是用到同一个CheckBox来显示,所以当你的
显示下一行的时候CheckBox就相应的往下移动,这就是为什么在你要显示CheckBox的那一列
一直闪烁的原因。不改变你处理方式的话只能是每行用一个CheckBox,这将极大的浪费资源
你把if (ACol=1)and(ARow<>0) then改成if (ACol=1)and(ARow=1) then或者
改成:
if (ACol=1)and(ARow<>0) then
begin
CheckBox[ARow].Parent:=Self;
CheckBox[ARow].Left:=ARect.Left;
CheckBox[ARow].Top:=ARect.Top;
CheckBox[ARow].Height:=ARect.Bottom-ARect.Top;
CheckBox[ARow].Show;
end
else
inherited;

再看看,但这不是解决之道,正确的方法是在DrawCell方法中自己画CheckBox,可以画
CheckBox样子的图片或利用DrawFrameControl函数来显示。
 
大概改了一下,你看看吧
unit abc;

interface

uses
windows,SysUtils,Classes,Grids,Graphics,Messages,Controls,StdCtrls,Forms;
type
TXzlDrawGrid=class(TDrawGrid)
private
fcolor:TColor;
procedure setcolor(const value:TColor);
public
CheckBox:Array[1..100]of TCheckBox;
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
published
property mycolor:TColor read fcolor write setcolor;

end;

procedure Register;


implementation

procedure Register;
begin
RegisterComponents('Samples',[TXzlDrawGrid]);
end;

constructor TXzlDrawGrid.Create(AOwner:TComponent);
var
I : Integer;
Rect : TRect;
begin
inherited Create(AOwner);
Parent := TWinControl(AOWner);
FColor := clBtnFace;

for I := 1 to RowCount do
begin
Rect := CellRect(1, I);
CheckBox:=TCheckBox.Create(Self);
with CheckBox do
begin
Name := Format('CheckBox%d', );
Parent := Self;
Left := Rect.Left;
Top := Rect.Top;
Width := Rect.Right - Rect.Left;
Height := Rect.Bottom - Rect.Top;
end;
end;
end;

destructor TXzlDrawGrid.Destroy;
var
i : Integer;
begin
for i := 1 to col do
begin
CheckBox.Free;
end;
inherited;
end;

procedure TXzlDrawGrid.setcolor(const value:TColor);
begin
Fcolor:=value;
refresh;
end;

end.
 
我觉得你可以自己画一个CheckBox,没有必要用CheckBox控件
 
同意balaschen,可以在DBGrid的OnDBGrid1DrawDataCell事件中获得位置来显示CheckBox

如果是做控件的话,应该在DBGrid1DrawDataCell事件中进行控制
 
to tseug:我用你的方法试了,还是一样的闪烁不停

to zh96yy:自己画一个CheckBox?怎么做?能详细点吗?谢谢 :)
 
后退
顶部