DELPHI的DBGRID有两个难点
DELPHI的DBGRID有兩個難點:
一,每行都是一個BUTTON,且CAPTION不同
二,每行不同行高,且由用戶拖動而不同高的
這兩點我用CXGRID全做到了
一,
procedure TForm1.cxGrid1DBTableView1Column1CustomDrawCell(
? Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
? AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
? www: tbutton;
? i, j: integer;
begin
www:=nil;
? try
?
? for i := AViewInfo.GridView.Site.ComponentCount - 1 downto 0? do
? begin
??? if AViewInfo.GridView.Site.Components[i] is tbutton then
??? begin
??????? tbutton(AViewInfo.GridView.Site.Components[i]).Tag := -1;
??????? if tbutton(AViewInfo.GridView.Site.Components[i]).Caption =
????????? TcxGridDataCellViewInfo(AViewInfo).DisplayValue then
??????? begin
????????? www := tbutton(AViewInfo.GridView.Site.Components[i]);
??????? end;
????? end;
?
??? end;
??? if TcxGridDataCellViewInfo(AViewInfo).Item.Caption = 'NAME' then
??? begin
????? if www = nil then
????? begin
??????? www := tbutton.Create(AViewInfo.GridView.Site);
??????? www.Visible:=false;
??????? www.Parent := AViewInfo.GridView.Site;
??????? www.Caption := TcxGridDataCellViewInfo(AViewInfo).DisplayValue; //inttostr(iii);
??????? www.Tag := 1;
????? end;
????? www.SetBounds(AViewInfo.ClientBounds.Left, AViewInfo.ClientBounds.Top,
??????? AViewInfo.ClientBounds.Right - AViewInfo.ClientBounds.Left, AViewInfo.ClientBounds.Bottom
????????? -
??????? AViewInfo.ClientBounds.Top);
??????? www.Visible:=true;
??? end;
?? except
?? on e:exception do
?? begin
?? end
?? end;
end;
?
procedure TForm1.cxGrid1DBTableView1TopRecordIndexChanged(Sender: TObject);
var
i,j:integer;
begin
try
? for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0? do
? begin
??? if cxgrid1.ActiveView.Site.Components[i] is tbutton then
??? begin
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;
????????????? for j := 0 to TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.VisibleCount do
?????????????? begin
????????? if tbutton(cxgrid1.ActiveView.Site.Components[i]).Caption =
??????????? TcxGridDataRowViewInfo(TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.Items[j]).CellViewInfos[0].DisplayValue then
??????????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := 1;
??????? end;
??????? if? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Free;
??? end;
??? end;
??? except
??? end;
end;
?
procedure TForm1.cxGrid1DBTableView1ColumnSizeChanged(
? Sender: TcxGridTableView; AColumn: TcxGridColumn);
var
i,j:integer;
begin
try
? for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0? do
? begin
??? if cxgrid1.ActiveView.Site.Components[i] is tbutton then
??? begin
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;
??????? end;
???? if? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Free;
??? end;
??? except
??? end;
end;
?
二,
CXGRID中,只要GetCellHeight事件不為NIL,且optionsview中columnautowidth設(shè)為FALSE,即可以實現(xiàn)自動每行行高不同也。
如果要手工用戶拖動而每行行高不同,可用下面代碼
//
procedure TcxGridRowSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
var
www:tstringlist;
i,j:integer;
begin
? inherited;
? FRow := TcxCustomGridRow((AParams as TcxGridRowSizingEdgeHitTest).GridRecord);
if?? AParams.ViewInfo? is? tcxgridindicatorrowitemviewinfo?? then
begin
?? www:= tstringlist(tcxgridindicatorrowitemviewinfo(??? AParams.ViewInfo).GridView.Site.Tag);
if (www<>nil) then
begin
? j:=0;
? for i:=0 to www.Count-1 do
? begin
???? if integer(www.Objects[i])=FRow.RecordIndex then
???? begin
???? www[i]:='-1';
???? j:=1;
???? break;
???? end;
? end;
? if j=0 then
? www.AddObject('-1',pointer(FRow.RecordIndex));
? end;
end;
end;
//
procedure TForm1.Button1Click(Sender: TObject);
var
www:tstringlist;
begin
? adotable1.active := true;
? www:=tstringlist.Create;
? cxgrid1.ActiveView.Site.Tag:=integer(pointer(www));
end;
//
procedure TForm1.cxGrid1DBTableView1GetCellHeight(
? Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
? AItem: TcxCustomGridTableItem;
? ACellViewInfo: TcxGridTableDataCellViewInfo; var AHeight: Integer);
var
www:tstringlist;
i,j:integer;
begin
www:=tstringlist(cxgrid1.activeview.site.tag);
if ((www<>nil) and (www.Count>0)) then
begin
? j:=0;
? for i:=0 to www.Count-1 do
? begin
???? if integer(www.Objects[i])=arecord.RecordIndex then
???? begin
???? j:=strtoint(www[i]);
???? break;
???? end;
? end;
if j<>0 then
begin
?
if j=-1 then
www[i]:=inttostr(cxGrid1DBTableView1.OptionsView.DataRowHeight);
?
j:=strtoint(www[i]);
aheight:=j;
///
?cxGrid1DBTableView1ColumnSizeChanged(nil,nil);
?end;
end;
?
end;
///
procedure TForm1.cxGrid1DBTableView1ColumnSizeChanged(
? Sender: TcxGridTableView; AColumn: TcxGridColumn);
var
i,j:integer;
begin
try
? for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0? do
? begin
??? if cxgrid1.ActiveView.Site.Components[i] is tbutton then
??? begin
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;
??????? end;
???? if ?tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then
??????? tbutton(cxgrid1.ActiveView.Site.Components[i]).Free;
??? end;
?? except
??? end;
end;
總結(jié)
以上是生活随笔為你收集整理的DELPHI的DBGRID有两个难点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webdynpro GOS BDS 文档
- 下一篇: 对于ACCESS跨库的一些研究