用dephi作会计表格录入,因要仿真手工表金额填写的一条条线,表单用了很多tshape控件作为表线,
tedit控件上也覆盖了很多线条.整个表单上的控件总数量较多(一百多个吧),正常运行时,无什么问题,运行时,用鼠标拖动其它
应用程序(如word,ie等),在其上晃动,再拖走,表单即会出现色块,象是未刷新的样子,很难看.经调试发现,是自己作的一透明twincontrol控件
以及放于其上的tpanel控件(tpanel控件仅用于作为线条使用,盖于tedit上,用于模仿手工表中金额栏上的线条),以及tedit有重叠,将tpanel
控件去掉,好象不会出现色块.不知是什么原因造成,用什么办法可解决?
表单与控件的代码大概如下(因实际表单很大,只抽相关的部分) Delphi(Pascal) code
{控件的代码}
unit Unit2;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
twin1=class(twincontrol) protected
procedure CreateParams(var Params: TCreateParams); override;
private
public
constructor Create(AOwner: TComponent); override;
end;
implementation{twin1}
constructor twin1.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=controlstyle-[csopaque]
end;
procedure twin1.CreateParams(var Params: TCreateParams);
begin
inherited;
params.ExStyle:=params.ExStyle or WS_EX_TRANSPARENT
end;
{twin1 end}
end.
Delphi(Pascal) code
{表单的代码}
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,unit2, Buttons;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Shape4: TShape;
Shape5: TShape;
Shape6: TShape;
BitBtn1: TBitBtn;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit20: TEdit;
Edit21: TEdit;
Edit22: TEdit;
Edit23: TEdit;
Edit24: TEdit;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Panel6: TPanel;
Panel7: TPanel;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
mywin:twin1;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
mywin:=twin1.Create(self);
mywin.Parent:=self;
mywin.Left:=5;
mywin.Top:=30;
edit1.Parent:=mywin;
edit2.Parent:=mywin;
edit3.Parent:=mywin;
edit4.Parent:=mywin;
edit5.Parent:=mywin;
edit6.Parent:=mywin;
edit7.Parent:=mywin;
edit8.Parent:=mywin;
edit9.Parent:=mywin;
edit10.Parent:=mywin;
edit11.Parent:=mywin;
edit12.Parent:=mywin;
edit13.Parent:=mywin;
edit14.Parent:=mywin;
edit15.Parent:=mywin;
edit16.Parent:=mywin;
edit17.Parent:=mywin;
edit18.Parent:=mywin;
edit19.Parent:=mywin;
edit20.Parent:=mywin;
edit21.Parent:=mywin;
edit22.Parent:=mywin;
edit23.Parent:=mywin;
edit24.Parent:=mywin;
edit1.Left:=edit1.Left-5;
edit2.Left:=edit2.Left-5;
edit3.Left:=edit3.Left-5;
edit4.Left:=edit4.Left-5;
edit5.Left:=edit5.Left-5;
edit6.Left:=edit6.Left-5;
edit7.Left:=edit7.Left-5;
edit8.Left:=edit8.Left-5;
edit9.Left:=edit9.Left-5;
edit10.Left:=edit10.Left-5;
edit11.Left:=edit11.Left-5;
edit12.Left:=edit12.Left-5;
edit13.Left:=edit13.Left-5;
edit14.Left:=edit14.Left-5;
edit15.Left:=edit15.Left-5;
edit16.Left:=edit16.Left-5;
edit17.Left:=edit17.Left-5;
edit18.Left:=edit18.Left-5;
edit19.Left:=edit19.Left-5;
edit20.Left:=edit20.Left-5;
edit21.Left:=edit21.Left-5;
edit22.Left:=edit22.Left-5;
edit23.Left:=edit23.Left-5;
edit24.Left:=edit24.Left-5; edit1.Top:=edit1.Top-5;
edit2.Top:=edit2.Top-5;
edit3.Top:=edit3.Top-5;
edit4.Top:=edit4.Top-5;
edit5.top:=edit5.top-5;
edit6.top:=edit6.top-5;
edit7.top:=edit7.top-5;
edit8.top:=edit8.top-5;
edit9.top:=edit9.top-5;
edit10.top:=edit10.top-5;
edit11.top:=edit11.top-5;
edit12.top:=edit12.top-5;
edit13.top:=edit13.top-5;
edit14.top:=edit14.top-5;
edit15.top:=edit15.top-5;
edit16.top:=edit16.top-5;
edit17.top:=edit17.top-5;
edit18.top:=edit18.top-5;
edit19.top:=edit19.top-5;
edit20.top:=edit20.top-5;
edit21.top:=edit21.top-5;
edit22.top:=edit22.top-5;
edit23.top:=edit23.top-5;
edit24.top:=edit24.top-5; mywin.Width:=shape6.Width+20;
mywin.Height:=shape6.Height+10;
mywin.SendToBack;
mywin.Visible:=true;end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
mywin.Refresh;
end;end.造成的色块,就与执行mywin.refresh命令产生的一样,不过无那么严重 试着在twin1=class(twincontrol)
的repaint方法中增加一事件,在事件中加上刷新tshape与tpanel的代码,这样,执行mywin.refresh时可避免色块,
但其它程序在其上飞过时,mywin.repaint并不执行,不知其它程序在其上飞过时,delphi程序是如果刷新表单与控件的?
tedit控件上也覆盖了很多线条.整个表单上的控件总数量较多(一百多个吧),正常运行时,无什么问题,运行时,用鼠标拖动其它
应用程序(如word,ie等),在其上晃动,再拖走,表单即会出现色块,象是未刷新的样子,很难看.经调试发现,是自己作的一透明twincontrol控件
以及放于其上的tpanel控件(tpanel控件仅用于作为线条使用,盖于tedit上,用于模仿手工表中金额栏上的线条),以及tedit有重叠,将tpanel
控件去掉,好象不会出现色块.不知是什么原因造成,用什么办法可解决?
表单与控件的代码大概如下(因实际表单很大,只抽相关的部分) Delphi(Pascal) code
{控件的代码}
unit Unit2;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
twin1=class(twincontrol) protected
procedure CreateParams(var Params: TCreateParams); override;
private
public
constructor Create(AOwner: TComponent); override;
end;
implementation{twin1}
constructor twin1.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=controlstyle-[csopaque]
end;
procedure twin1.CreateParams(var Params: TCreateParams);
begin
inherited;
params.ExStyle:=params.ExStyle or WS_EX_TRANSPARENT
end;
{twin1 end}
end.
Delphi(Pascal) code
{表单的代码}
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,unit2, Buttons;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Shape4: TShape;
Shape5: TShape;
Shape6: TShape;
BitBtn1: TBitBtn;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit20: TEdit;
Edit21: TEdit;
Edit22: TEdit;
Edit23: TEdit;
Edit24: TEdit;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Panel6: TPanel;
Panel7: TPanel;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
mywin:twin1;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
mywin:=twin1.Create(self);
mywin.Parent:=self;
mywin.Left:=5;
mywin.Top:=30;
edit1.Parent:=mywin;
edit2.Parent:=mywin;
edit3.Parent:=mywin;
edit4.Parent:=mywin;
edit5.Parent:=mywin;
edit6.Parent:=mywin;
edit7.Parent:=mywin;
edit8.Parent:=mywin;
edit9.Parent:=mywin;
edit10.Parent:=mywin;
edit11.Parent:=mywin;
edit12.Parent:=mywin;
edit13.Parent:=mywin;
edit14.Parent:=mywin;
edit15.Parent:=mywin;
edit16.Parent:=mywin;
edit17.Parent:=mywin;
edit18.Parent:=mywin;
edit19.Parent:=mywin;
edit20.Parent:=mywin;
edit21.Parent:=mywin;
edit22.Parent:=mywin;
edit23.Parent:=mywin;
edit24.Parent:=mywin;
edit1.Left:=edit1.Left-5;
edit2.Left:=edit2.Left-5;
edit3.Left:=edit3.Left-5;
edit4.Left:=edit4.Left-5;
edit5.Left:=edit5.Left-5;
edit6.Left:=edit6.Left-5;
edit7.Left:=edit7.Left-5;
edit8.Left:=edit8.Left-5;
edit9.Left:=edit9.Left-5;
edit10.Left:=edit10.Left-5;
edit11.Left:=edit11.Left-5;
edit12.Left:=edit12.Left-5;
edit13.Left:=edit13.Left-5;
edit14.Left:=edit14.Left-5;
edit15.Left:=edit15.Left-5;
edit16.Left:=edit16.Left-5;
edit17.Left:=edit17.Left-5;
edit18.Left:=edit18.Left-5;
edit19.Left:=edit19.Left-5;
edit20.Left:=edit20.Left-5;
edit21.Left:=edit21.Left-5;
edit22.Left:=edit22.Left-5;
edit23.Left:=edit23.Left-5;
edit24.Left:=edit24.Left-5; edit1.Top:=edit1.Top-5;
edit2.Top:=edit2.Top-5;
edit3.Top:=edit3.Top-5;
edit4.Top:=edit4.Top-5;
edit5.top:=edit5.top-5;
edit6.top:=edit6.top-5;
edit7.top:=edit7.top-5;
edit8.top:=edit8.top-5;
edit9.top:=edit9.top-5;
edit10.top:=edit10.top-5;
edit11.top:=edit11.top-5;
edit12.top:=edit12.top-5;
edit13.top:=edit13.top-5;
edit14.top:=edit14.top-5;
edit15.top:=edit15.top-5;
edit16.top:=edit16.top-5;
edit17.top:=edit17.top-5;
edit18.top:=edit18.top-5;
edit19.top:=edit19.top-5;
edit20.top:=edit20.top-5;
edit21.top:=edit21.top-5;
edit22.top:=edit22.top-5;
edit23.top:=edit23.top-5;
edit24.top:=edit24.top-5; mywin.Width:=shape6.Width+20;
mywin.Height:=shape6.Height+10;
mywin.SendToBack;
mywin.Visible:=true;end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
mywin.Refresh;
end;end.造成的色块,就与执行mywin.refresh命令产生的一样,不过无那么严重 试着在twin1=class(twincontrol)
的repaint方法中增加一事件,在事件中加上刷新tshape与tpanel的代码,这样,执行mywin.refresh时可避免色块,
但其它程序在其上飞过时,mywin.repaint并不执行,不知其它程序在其上飞过时,delphi程序是如果刷新表单与控件的?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货