Delphi 7下控件编写的问题

zykj_2000 2003-03-25 09:21:28
在学习控件的编写的,由于找不到Delphi7 相关的资料所以只能用Delphi 5 的
但是碰到一个问题
我在

uses
Windows,Messages,SysUtils, Classes, Graphics,Controls,Forms,Dialogs,StdCtrls,Buttons;
type
TShade=record
C:array[0..15] of TColor;
end;

type
XPButton = class(TButton)
private {在private里定义的变量在下面却不能用}
FBaseColor:TColor;
FCanvas:TCanvas;
IsFocused:Boolean;
Shade:TShade;
………………………
………………………
………………………
………………………
………………………
………………………
constructor XPButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas:=TCanvas.Create();{这里它不认识 FCanvas}
FBaseColor:=$00DDB9B9;//$00777777;
ControlStyle:=ControlStyle-[csDoubleClicks];
Width:=85;
Height:=30;
Shade:=LoadShades(FBaseColor);
end;
...全文
38 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
longboy 2003-03-25
  • 打赏
  • 举报
回复
你把代码贴出来,给你跑一下,你说的问题其实太不可能了,
在自带的paint()中就可以画.直接用canvas.xxxxx
hot3000 2003-03-25
  • 打赏
  • 举报
回复
在d6下可以用啊! 给你个例子:
unit pro_unit;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics,Controls,
Dialogs, DBGrids, DB, ADODB,qry_unit;

type TXquery=class(TComponent)
private
Fquery_form:Tquery_form;
Fdelimiter:char;
FSqlText:Tstrings;
Fcaption:string;
FtableName:string;
FSubQuery:boolean;
procedure setDelimiter(value:char);
procedure setCaption(value:string);
procedure setAdoquery(value:Tadoquery);
procedure setTableName(value: string);
procedure setSubQuery(value:boolean);
public
OutSQL:String;
Fadoquery:TAdoquery;
constructor Create(AOwner:Tcomponent);override;
destructor Destroy;override;
function Execute:Boolean;
published
property tablename:string read FTableName write Settablename;
property adoquery:Tadoquery read Fadoquery write setAdoquery;
property delimiter:char read Fdelimiter write setDelimiter default #39;
property caption:string read Fcaption write setCaption ;
property SubQuery:boolean read FSubQuery write setSubQuery default false;
protected
{}
end;
procedure Register;
implementation

{ TXquery }

procedure Register;
Begin
RegisterComponents('Coko',[TXQuery]);
end;
constructor TXquery.Create(AOwner: Tcomponent);
begin
inherited create(AOwner);
Fcaption:='X查询';
end;

destructor TXquery.Destroy;
begin
// FsqlText.free;
inherited Destroy;
end;

function TXquery.Execute: Boolean;
begin
try
if Fadoquery=nil then begin
messageDlg('adoquery属性没有设置!',mtinformation,[mbok],0);
result:=false;
exit;
end;
Fquery_form:=TQuery_form.create(self);
with Fquery_form do //初始化数据
begin
caption:=Fcaption;
delimiter:=Fdelimiter;
if not Initial(Fadoquery) then //执行初始化操作
messagedlg('初始化失败!',mtinformation,[mbok],0);
end;
if Fquery_form.ShowModal=mrok then
begin
OutSQL:=Fquery_form.WideSQL;
result:=true;
end else result:=false;
finally
Fquery_form.free;
end;
end;

procedure TXquery.setAdoquery(value: Tadoquery);
begin
if Fadoquery<>value then
Fadoquery:=value;
end;

procedure TXquery.setCaption(value: string);
begin
if Fcaption<>value then
Fcaption:=value;
end;

procedure TXquery.setDelimiter(value: char);
begin
if Fdelimiter<>value then
Fdelimiter:=value;
end;

procedure TXquery.setSubQuery(value: boolean);
begin
if (Ftablename='') and (value=true) then
begin
MessageDlg('子查询的表名不能为空!', mtInformation,[mbOk], 0);
FSubQuery:=false;
end
else
FSubQuery:=value;
end;
procedure TXquery.setTableName(value: string);
begin
if (value='') and FSubQuery then
begin
MessageDlg('当SubQuery属性为true时.子查询的表名不能为空!', mtInformation,[mbOk], 0);
setSubQuery(false);
end;
if Ftablename<>value then
Ftablename:=value;
end;
end.
zykj_2000 2003-03-25
  • 打赏
  • 举报
回复
而且
private下的其它变量也不能用啊
zykj_2000 2003-03-25
  • 打赏
  • 举报
回复
但我上面的代码为什么错啊,
鸡毛掸子尘埃 2003-03-25
  • 打赏
  • 举报
回复
再button中,不用定义canvas了,直接在上面画就可以了
zykj_2000 2003-03-25
  • 打赏
  • 举报
回复
就是编辑器并没有把FCanvas当作是一个TCanvas对象啊
Drate 2003-03-25
  • 打赏
  • 举报
回复
什么叫它不认识呀?

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧