我遇到了一段自动生成列号和宽度的代码问题。
我用这部分代码完成了所有工作,只有困扰我的是我的网格不是100%使用的;有一小块网格未使用,这使得报告变得疯狂。
这是完成工作的代码的一部分。
procedure TForm1.NoScrollDBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
i: Integer;
brkol: integer;
sirina : Integer;
width1: Integer;
begin
width1 := 1;
brkol:=-4;
for i := 0 to NoScrollDBGrid1.Columns.Count - 1 do
begin
width1 := width1 + NoScrollDBGrid1.Columns[i].Width + 1;
if NoScrollDBGrid1.Columns[i].Visible then
brkol:=brkol +1;
end;
sirina:=(80 div brkol);
if width1 < NoScrollDBGrid1.ClientWidth - 8 then
begin
NoScrollDBGrid1.Columns[0].Width:=(NoScrollDBGrid1.ClientWidth-11)*2 div 100;
NoScrollDBGrid1.Columns[1].Width:=(NoScrollDBGrid1.ClientWidth-11)*5 div 100;
NoScrollDBGrid1.Columns[2].Width:=(NoScrollDBGrid1.ClientWidth-11)*10 div 100;
NoScrollDBGrid1.Columns[3].Width:=(NoScrollDBGrid1.ClientWidth-11)*3 div 100;
NoScrollDBGrid1.Columns[4].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[5].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[6].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[7].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[8].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[9].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[10].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[11].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[12].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[13].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[14].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[15].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[16].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[17].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
答案 0 :(得分:0)
以下内容并非完全回答您的问题,但应该足以让您继续。
CreateForm
事件会创建一个TNoScrollDBGrid
,其最右边的列会停止
网格客户区的右边界。
Button1点击处理程序调用{{1}},显示如何检索网格的GetDrawInfo
(请参阅DrawInfo
中的TGridDrawInfo
)并使用它将右侧列重新调整为
到达网格客户区的RHS。
Grids.Pas
还会显示如何查找可见数据列的数量 - 请参阅GetDrawInfo
,允许左侧可能存在指标列。调整最右列的宽度还会考虑是否存在指标列。
顺便说一下,网格的DrawCell事件可能不是一个改变网格布局的好地方,如评论中所指出的那样。
VisibleDataColumns
[...]
type
TNoScrollDBGrid = Class(TDBGrid) // Per Peter Below of TeamB
private
Procedure WMNCCalcSize( Var msg: TMessage );
message WM_NCCALCSIZE;
end;
TForm1 = class(TForm)
CDS1: TClientDataSet;
DataSource1: TDataSource;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure GetDrawInfo;
protected
public
NoScrollDBGrid1 : TNoScrollDBGrid;
end;
答案 1 :(得分:0)
正如@GuidoG建议香港专业教育学院试图给其中一列提供剩余宽度而且它有效。似乎noscrolldbgrid中的列必须是整数,这就是网格未填充100%的原因。无论如何都需要很多帮助。