关于Dbgrid的问题(100分)

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

zjmg

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:我是个初学者,照着《Delphi高级开发指南》一书中的一个行高度
不同的DBGrid组件的例子,在Delphi5中输入源代码,但却不能编译通过,我的
数据库设置无误,究竟是什么原因?
附:代码如下:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables;

type
TDhDbgrid = class(TDbgrid)

DataSource1: TDataSource;
Table1: TTable;
DDhDBGrid: TDBGrid;
private
{ Private declarations }
flinesperrow:integer;
procedure setlinesperrow(value:integer);
protected
procedure drawcolumncell(const rect:trect;datacol:integer;column:tcolumn;state:tgriddrawstate);override;
procedure layoutchanged;override;
public
{ Public declarations }
constructor create(aowner:tcomponent);override;
published
property linesperrow:integer
read flinesperrow write setlinesperrow
default 1;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
constructor tddhdbgrid.create(aowner:tcomponent);
begin
inherited create(aowner);
flinesperrow:=1;
end;

procedure tddhdbgrid.setlinesperrow(value:integer);
begin
if value<>flinesperrow then
begin
flinesperrow:=value;
layoutchanged;
end;
end;

procedure tddhgrid.layoutchanged;
var
pixelsperrow,pixelstitle,i:integer;
begin
inherited layoutchanged;
canvas.font:=font;
pixelsperrow:=canvas.textheight('wg')+3;
if dgrowlines in options then
inc(pixelsperrow,gridlinewidth);
canvas.font:=titlefont;
pixelstitle:=canvas.textheight('wg')+4;
if dgrowlines in options then
inc(pixelstitle,gridlinewidth);
rowcount:=1+(height-pixelstitle) div (pixelsperrow*flinesperrow);
defaultrowheight:=pixelsperrow*flinesperrow;
rowheights[0]:=pixelstitle;
for i:=1 to rowcount-1 do
rowheights:=pixelsperrow*flinesperrow;
end;

procedure tddhdbgrid.drawcolumncell(const rect:trect;datacol:integer;column:tcolumn;state:tgriddrawstate);
var
bmp:tbitmap;
outrect:trect;
begin
if flinesperrow=1 then
inherited drawcolumncell(rect,datacol,column,state)
else
begin
canvas.fillrect(rect);
outrect:=rect;
inflaterect(outrect,-2,-2);
if column.Field is tgraphicfield then
begin
bmp:=tbitmap.create;
try
bmp.assign(column.field);
canvas.stretchdraw(outrect,bmp)
finally
bmp.free;
end;
end
else if column.field is tmemofield then
begin
drawtext(canvas.handle,pchar(column.field.asstring),
length(column.field.asstring),
outrect,dt_wordbreak or dt_noprefix)
end
else
drawtext(canvas.handle,pchar(column.field.displaytext),length(column.field.displaytext),
outrect,dt_vcenter or dt_singleline or dt_noprefix);
end;
end;

end;
end.
 
这样就没编译问题了。
可是新类没有起作用。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DDhDBGrid: TDBGrid;
private
{ Private declarations }
public
{ Public declarations }
end;
TDdhDbgrid = class(TDbgrid)
private
{ Private declarations }
flinesperrow: integer;
procedure setlinesperrow(value: integer);
protected
procedure drawcolumncell(const rect: trect; datacol: integer; column: tcolumn; state: tgriddrawstate); override;
procedure layoutchanged; override;
public
{ Public declarations }
constructor create(aowner: tcomponent); override;
published
property linesperrow: integer
read flinesperrow write setlinesperrow
default 1;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

constructor tddhdbgrid.create(aowner: tcomponent);
begin
inherited create(aowner);
flinesperrow := 1;
end;

procedure tddhdbgrid.setlinesperrow(value: integer);
begin
if value <> flinesperrow then
begin
flinesperrow := value;
layoutchanged;
end;
end;

procedure TDdhDBgrid.layoutchanged;
var
pixelsperrow, pixelstitle, i: integer;
begin
inherited layoutchanged;
canvas.font := font;
pixelsperrow := canvas.textheight('wg') + 3;
if dgrowlines in options then
inc(pixelsperrow, gridlinewidth);
canvas.font := titlefont;
pixelstitle := canvas.textheight('wg') + 4;
if dgrowlines in options then
inc(pixelstitle, gridlinewidth);
rowcount := 1 + (height - pixelstitle) div (pixelsperrow * flinesperrow);
defaultrowheight := pixelsperrow * flinesperrow;
rowheights[0] := pixelstitle;
for i := 1 to rowcount - 1 do
rowheights := pixelsperrow * flinesperrow;
end;

procedure tddhdbgrid.drawcolumncell(const rect: trect; datacol: integer; column: tcolumn; state: tgriddrawstate);
var
bmp: tbitmap;
outrect: trect;
begin
if flinesperrow = 1 then
inherited drawcolumncell(rect, datacol, column, state)
else
begin
canvas.fillrect(rect);
outrect := rect;
inflaterect(outrect, -2, -2);
if column.Field is tgraphicfield then
begin
bmp := tbitmap.create;
try
bmp.assign(column.field);
canvas.stretchdraw(outrect, bmp)
finally
bmp.free;
end;
end
else if column.field is tmemofield then
begin
drawtext(canvas.handle, pchar(column.field.asstring),
length(column.field.asstring),
outrect, dt_wordbreak or dt_noprefix)
end
else
drawtext(canvas.handle, pchar(column.field.displaytext), length(column.field.displaytext),
outrect, dt_vcenter or dt_singleline or dt_noprefix);
end;
end;
end.
 
试试:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, DBGrids;

type
TDdhDbgrid = class(TDbgrid)
private
{ Private declarations }
flinesperrow: integer;
procedure setlinesperrow(value: integer);
protected
procedure drawcolumncell(const rect: trect; datacol: integer; column: tcolumn; state: tgriddrawstate); override;
procedure layoutchanged; override;
public
{ Public declarations }
constructor create(aowner: tcomponent); override;
published
property linesperrow: integer
read flinesperrow write setlinesperrow
default 1;
end;
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
DDhDBGrid: TDdhDbgrid;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

constructor tddhdbgrid.create(aowner: tcomponent);
begin
inherited create(aowner);
flinesperrow := 1;
end;

procedure tddhdbgrid.setlinesperrow(value: integer);
begin
if value <> flinesperrow then
begin
flinesperrow := value;
layoutchanged;
end;
end;

procedure TDdhDBgrid.layoutchanged;
var
pixelsperrow, pixelstitle, i: integer;
begin
inherited layoutchanged;
canvas.font := font;
pixelsperrow := canvas.textheight('wg') + 3;
if dgrowlines in options then
inc(pixelsperrow, gridlinewidth);
canvas.font := titlefont;
pixelstitle := canvas.textheight('wg') + 4;
if dgrowlines in options then
inc(pixelstitle, gridlinewidth);
rowcount := 1 + (height - pixelstitle) div (pixelsperrow * flinesperrow);
defaultrowheight := pixelsperrow * flinesperrow;
rowheights[0] := pixelstitle;
for i := 1 to rowcount - 1 do
rowheights := pixelsperrow * flinesperrow;
end;

procedure tddhdbgrid.drawcolumncell(const rect: trect; datacol: integer; column: tcolumn; state: tgriddrawstate);
var
bmp: tbitmap;
outrect: trect;
begin
if flinesperrow = 1 then
inherited drawcolumncell(rect, datacol, column, state)
else
begin
canvas.fillrect(rect);
outrect := rect;
inflaterect(outrect, -2, -2);
if column.Field is tgraphicfield then
begin
bmp := tbitmap.create;
try
bmp.assign(column.field);
canvas.stretchdraw(outrect, bmp)
finally
bmp.free;
end;
end
else if column.field is tmemofield then
begin
drawtext(canvas.handle, pchar(column.field.asstring),
length(column.field.asstring),
outrect, dt_wordbreak or dt_noprefix)
end
else
drawtext(canvas.handle, pchar(column.field.displaytext), length(column.field.displaytext),
outrect, dt_vcenter or dt_singleline or dt_noprefix);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DDhDBGrid:=TDdhDbgrid.create(self);
DDhDBGrid.Parent:=Form1;
DDhDBGrid.Align:=alClient;
DDhDBGrid.DataSource:=DataSource1;
DDhDBGrid.linesperrow:=5;
end;

end.

 
呵呵,两个ID?
简要说明:

一、例子的使用
1、新建一个Form,不改名,就叫Form1
2、丢上一个Table,一个DataSource,连好数据库,Table.Active:=true;不加DBGrid!!!
3、把上面的贴子Ctrl+C
4、到Delphi中Ctrl+V
5、Run

二、问题的原因:
1、 类型说明的位置不对,这种情况的类型说明TDDhDBGrid应在Form的前面,先说明
TDDhDBGrid是个什么东东。
type
TDdhDbgrid = class(TDbgrid)
...
TForm1 = class(TForm)
...

2、变量申明不对,因为TDDhDBGrid还未在Delphi系统中注册所以不能直接在Published段
中说明,而且在Private或Public中说明。
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
DDhDBGrid: TDdhDbgrid;//申明在这儿
public
{ Public declarations }
end;

3、同上面的原因,所以在Form1的OnCreate事件中手工创建DDhDBGrid1
procedure TForm1.FormCreate(Sender: TObject);
begin
DDhDBGrid:=TDdhDbgrid.create(self);
...
end

BTW:
你的《Delphi高级开发指南》是电子工业出版社的,Marco Cantu写的吗?
羡慕啊!我想买很久了一直都没买到 [:(]
 
接受答案了。
特别感谢杜宝的详细解答,我的《Delphi高级开发指南》是电子工业出版社的,
Marco Cantu写的,可惜好书落在了笨鸟手里,惭愧啊。
 
后退
顶部