我是个新手,怎么把已经实现功能的PAS做成控件?分太少,全给了 (3分)

  • 主题发起人 主题发起人 ztaif
  • 开始时间 开始时间
Z

ztaif

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经把有关DBGrid我要增强的功能在练习的单元中做好了,但我不会把它做成控件,
怎么办呀,还有没有人在线上,帮帮忙呀,

偶分只剩这一点了,全给了,等偶过一段时间分来了,偶再全部给您们加上,偶不要分

偶需要您们各位指导一下,好急呀,求救拉
 
to :seraph_q

哥哥,我先把分给你加上

那次发的到已答区了,我怕你看不到了又发了一个在这里
 
人呢 呜~~~~~~~~~~~~~~

偶要急死了
 
就是下面这段代码,我怎么把他弄到一个控件里边

unit uaccount;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids, DBGrids, DB, ADODB;

type
TForm1 = class(TForm)
ADOTable1: TADOTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure DBGrid1CellClick(Column: TColumn);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dbname:string; //定义数据库变量名称
sername:string; //定义数据库服务器变量名称
tabname:string; //定义该FORM中使用的数据表名称
pic1,pic2,pic3:tbitmap; //三个图片为布尔型值列准备
i:integer; // 为布尔型值的列索引准备一个循环变量
n:string; // 为布尔型值的列名集合准备一个字符串型变量
x,y:Integer; //布尔值列画图的坐标变量
k:integer; //定义一个变量等下用来设定初始列宽

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

form1.WindowState:=wsMaximized; //最大化
// wsMinimized; //最小化
// wsNormal; //默认
form1.AutoScroll:=false;
form1.autosize:=false;
form1.Caption:='人员权限设置';

pic1:=TBitmap.Create;
pic2:=TBitmap.Create;
pic3:=TBitmap.Create;
pic1.LoadFromFile('Bitmap1.bmp'); // 打勾图标,代表 true
pic2.LoadFromFile('Bitmap2.bmp'); // 打叉图标,代表 false
pic3.LoadFromFile('Bitmap3.bmp'); // 空白图标,用来清除数据字段



dbname:='ztaifdata'; //为数据库变量赋值
sername:='zy-server'; //为数据库服务器名称变量赋值
tabname:='z_userpopedom'; //为当前使用数据表赋值
adotable1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=True;'+
'User ID=sa;Initial Catalog='+
dbname+
';Data Source='+
sername;
//为ADO控件指定数据连接源

adotable1.TableName:=tabname; //将表名变量应用到ADOTABLE属性中
datasource1.DataSet:=adotable1; //设置数据来源
dbgrid1.DataSource:=datasource1; //设置数据网格使用数据来源

dbgrid1.Options:= [ //设置DBGRID属性
dgEditing, //网格显示是否处于编辑状态
// dgalwaysShowEditor, //是否一直处于编辑模式
dgTitles, //是否显示网格的上标题
dgIndicator, //是否显示网格的左侧标题
dgColumnResize, //网格列宽是否可以改变
dgColLines, //网格列竖线是否显示
dgRowLines, //网格横线是否显示
dgTabs, //是否可以使用TAB键
// dgRowsSelect, //是否可以整行选定
dgConfirmDelete, //是否确认确除
dgCancelOnExit //是否退出取消操作
// dgMultiSelect //是否可以复选_与dgrowSelect同时使用生效
];


adotable1.Active:=true; //激活ADOTABLE

begin
for k:=0 to dbgrid1.Columns.Count-1 do
begin
dbgrid1.Columns[k].Width:=length(dbgrid1.Columns[k].Field.AsString)*10+5;
dbgrid1.Columns[k].Alignment:=taCenter; //设置列值居中显示
// taLeftJustify //自左至右显示
// taRightJustify //自右至左显示
dbgrid1.Columns[k].Title.Alignment:=taCenter; //列标题居中显示

end;
end;

end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
n:='';
for i :=0 to dbgrid1.Columns.Count-1 do
if dbgrid1.Columns.Field is tbooleanfield
then
n:=n+','+dbgrid1.Fields.DisplayName;
n:=n+','; //判断那些列是布尔型的值并把列名写入一个变量n


if pos(','+Column.FieldName+',',n)>0 then // 将布尔型值字段清除成空白
begin
DBGrid1.Canvas.StretchDraw(Rect, pic3);

x:=(Rect.Right-Rect.Left-pic1.Width) div 2;
y:=(Rect.Bottom-Rect.Top-pic1.Height) div 2;

if (Column.Field.DisplayText='False') then
DBGrid1.Canvas.Draw(Rect.Left+x, Rect.Top+y, pic1)
else
DBGrid1.Canvas.Draw(Rect.Left+x, Rect.Top+y, pic2);
end; // 如果字段值是true,则画'打勾'图标,否则画'打叉'图标
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if pos(DBGrid1.SelectedField.FieldName+',',n)<=0 then
begin
dbgrid1.Options:= [ //设置DBGRID属性
dgEditing, //网格显示是否处于编辑状态
// dgalwaysShowEditor, //是否一直处于编辑模式
dgTitles, //是否显示网格的上标题
dgIndicator, //是否显示网格的左侧标题
dgColumnResize, //网格列宽是否可以改变
dgColLines, //网格列竖线是否显示
dgRowLines, //网格横线是否显示
dgTabs, //是否可以使用TAB键
// dgRowsSelect, //是否可以整行选定
dgConfirmDelete, //是否确认确除
dgCancelOnExit //是否退出取消操作
// dgMultiSelect //是否可以复选_与dgrowSelect同时使用生效
];
end;
begin

if pos(DBGrid1.SelectedField.FieldName+',',n)>0 then
begin

dbgrid1.Options:= [ //设置DBGRID属性
// dgEditing, //网格显示是否处于编辑状态
// dgalwaysShowEditor, //是否一直处于编辑模式
dgTitles, //是否显示网格的上标题
dgIndicator, //是否显示网格的左侧标题
dgColumnResize, //网格列宽是否可以改变
dgColLines, //网格列竖线是否显示
dgRowLines, //网格横线是否显示
dgTabs, //是否可以使用TAB键
// dgRowsSelect, //是否可以整行选定
dgConfirmDelete, //是否确认确除
dgCancelOnExit //是否退出取消操作
// dgMultiSelect //是否可以复选_与dgrowSelect同时使用生效
];


DBGrid1.DataSource.DataSet.Edit; // 设置DataSet为修改状态

if CompareStr(DBGrid1.SelectedField.DisplayText,'True')=0 then
DBGrid1.SelectedField.AsString:='False'
else // 将数据反向设置
DBGrid1.SelectedField.AsString:='True';
DBGrid1.DataSource.DataSet.Post; // 将修改过数据写入数据库
end;
end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
dbgrid1.anchors:=[akLeft,akTop,akRight,akBottom]; //设置DBGRID四边锚点
end;

end.
 
我刚刚试过,是可以的。基本上编写控件就是这样:
先找一个基类继承;
看看基类里面有没有和你想加的功能相关的东西,决定你的功能怎么加上去。
一般不外乎:
1、直接重载某个函数以扩充其功能,如我的例子;
2、重载消息处理函数WndProc或者是直接定义一个函数关联某个消息,然后编写针对这些消息的处理代码;
3、完全重新添加property,函数,事件等等。
基本上就想到这么多,别的手段还没想到,有待别人补充吧!
建议看看VCL控件的源码,特别是你的基类的源码,看看它里面是怎么实现的,如何定义
property, event等等。
如果你新建component的时候rebuild过,并且delphi告诉你new component注册成功,那么
你每次修改后compile一下就可以更新了。
 
咦,我刚刚发的例子呢?
 
哥哥,你怎么发消息到我机器上的,呵,好厉害哦

我在试先照你说的做一个看看,

那个贴我回不了,我又发了一个在这里,好可怜,没分了,没事,
我知道哥哥不是喜欢分的人,带小弟嘛,谢谢!!!

我现在正在试你的
 
嗯,是的,照你的做一定可以了,谢谢哥哥,偶现在一分都没有了,有了就加你上
 
哥哥,DBGRID没有CREATE 可不可以给他做一个
 
unit MyDBGrid;

interface

uses
SysUtils, Classes, Controls, Grids, DBGrids, Types, Graphics;

type
TMyDBGrid = class(TDBGrid)
private
FBmpTrue,FBmpFalse,FBmpEmpty:TBitmap;
{ Private declarations }
protected
procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); override;
procedure CellClick(Column: TColumn); override;
{ Protected declarations }
public
procedure SetBmpTrue(src:TBitmap);
procedure SetBmpFalse(src:TBitmap);
procedure SetBmpEmpty(src:TBitmap);
{ Public declarations }
published
property BMPTrue:TBitmap read FBmpTrue write SetBmpTrue;
property BMPFalse:TBitmap read FBmpFalse write SetBmpFalse;
property BMPEmpty:TBitmap read FBmpEmpty write SetBmpEmpty;
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
{ Published declarations }
end;

procedure Register;

implementation

uses db;

var n:string='';

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

procedure TMyDBGrid.SetBmpTrue(src:TBitmap);
begin
FBmpTrue.Assign(src);
end;

procedure TMyDBGrid.SetBmpFalse(src:TBitmap);
begin
FBmpFalse.Assign(src);
end;

procedure TMyDBGrid.SetBmpEmpty(src:TBitmap);
begin
FBmpEmpty.Assign(src);
end;


procedure TMyDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState);
var i,x,y:integer;
begin
if n='' then begin
//如果还没有设置n,则设置,否则就不用麻烦了
for i :=0 to Columns.Count-1 do
if Columns.Field is tbooleanfield then n:=n+','+Fields.DisplayName;
n:=n+',';
end;

if pos(','+Column.FieldName+',',n)>0 then begin // 将布尔型值字段清除成空白
Canvas.Brush.Color:=color;
Canvas.FillRect(Rect);
if (Column.Field.DisplayText='False') then begin
x:=(Rect.Right-Rect.Left-FBmpFalse.Width) div 2;
y:=(Rect.Bottom-Rect.Top-FBmpFalse.Height) div 2;
Canvas.Draw(Rect.Left+x, Rect.Top+y, FBmpFalse);
end else if (Column.Field.DisplayText='True') then begin
x:=(Rect.Right-Rect.Left-FBmpTrue.Width) div 2;
y:=(Rect.Bottom-Rect.Top-FBmpTrue.Height) div 2;
Canvas.Draw(Rect.Left+x, Rect.Top+y, FBmpTrue);
end else begin
x:=(Rect.Right-Rect.Left-FBmpEmpty.Width) div 2;
y:=(Rect.Bottom-Rect.Top-FBmpEmpty.Height) div 2;
Canvas.Draw(Rect.Left+x, Rect.Top+y, FBmpEmpty);
end;
end;
// 如果字段值是true,则画'打勾'图标,否则画'打叉'图标 ,否则就清空。因为数据库里可能有空值
inherited;//调用父类的同名函数,以抛出OnDrawColumnCell事件给控件的用户
end;

procedure TMyDBGrid.CellClick(Column: TColumn);
begin
if pos(SelectedField.FieldName+',',n)<=0 then Options:=Options+[dgEditing]
else begin
Options:=Options-[dgEditing];
DataSource.DataSet.Edit;
if SelectedField.DisplayText='' then SelectedField.asBoolean:=True
//如果本来是空的,置为True,否则
else SelectedField.asBoolean:=not SelectedField.asBoolean;//布尔类型反置
DataSource.DataSet.Post; // 将修改过数据写入数据库
end;
inherited;
end;

constructor TMyDBGrid.Create(AOwner:TComponent);
begin
inherited;
FBmpTrue:=TBitmap.Create;
FBmpFalse:=TBitmap.Create;
FBmpEmpty:=TBitmap.Create;
//初始化三个TBitMap。当然这时候是没有图片内容的。
//内容要在设计时,于Object Inspector中指定。
Options:= [ //设置DBGRID属性
dgEditing, //网格显示是否处于编辑状态
// dgalwaysShowEditor, //是否一直处于编辑模式
dgTitles, //是否显示网格的上标题
dgIndicator, //是否显示网格的左侧标题
dgColumnResize, //网格列宽是否可以改变
dgColLines, //网格列竖线是否显示
dgRowLines, //网格横线是否显示
dgTabs, //是否可以使用TAB键
// dgRowsSelect, //是否可以整行选定
dgConfirmDelete, //是否确认确除
dgCancelOnExit //是否退出取消操作
// dgMultiSelect //是否可以复选_与dgrowSelect同时使用生效
];
end;

destructor TMyDBGrid.Destroy;
begin
FBmpTrue.Free;
FBmpFalse.Free;
FBmpEmpty.Free;
inherited;
end;

end.

//另外 anchor属性只需要在设计时指定一次,不需要在每次formresize的时候改。
//他的功能就是当formresize的时候自动跟着改变大小。
 
奇怪,中文变乱码。你给个E-Mail,我给你直接发.pas文件去。
 
good .ztaif@163.com
 
谢谢哥哥,我在湖北,十堰,有空过来武当山玩说一声,我手机13339860785

邮件: ztaif@163.com

MSN: ztaif@hotmail.com
 
我收邮件拉,来了没,嘿嘿~~~
 
接受答案了.
 
后退
顶部