几天无人问律的问题,想问问各位高手,这题难吗?还是各位看到分数少?如果是因为分少的话,我可以开另外一个贴子送分,只求各位说句话。(在线等待) ( 积分: 40

  • 主题发起人 主题发起人 twquac
  • 开始时间 开始时间
T

twquac

Unregistered / Unconfirmed
GUEST, unregistred user!
几天无人问律的问题,想问问各位高手,这题难吗?还是各位看到分数少?如果是因为分少的话,我可以开另外一个贴子送分,只求各位说句话。(在线等待) ( 积分: 40 )<br />function Createdxdbgdcol(aApp:TApplication;DllScr:TScreen;Mydataset:TDataSet;
Mydxdbgd:TdxDBGrid):boolean;stdcall;
var
i,n:integer;
Newbands:TdxTreeListBand;
begin
CoInitialize(Nil);
Application:=aApp;
Screen:=DllScr;
for i:=0 to Mydxdbgd.ColumnCount-1 do
Mydxdbgd.Columns[0].Destroy ;
//建立两个band,一个为显示锁定列,另一个为显示非锁定列
for i:=0 to Mydxdbgd.Bands.Count-1 do
Mydxdbgd.Bands[0].Destroy;
Newbands:=Mydxdbgd.Bands.Add;
Newbands.MinWidth :=0;
Newbands.Width :=0;
Newbands.Fixed :=bfLeft;
Newbands:=Mydxdbgd.Bands.Add;
n:=0;
for i:=0 to Mydataset.FieldCount-1 do
begin
if MydataSet.Fields.Visible =False then
Continue
else
begin
//建立列
[red]Mydxdbgd.CreateColumn(TdxDBGridColumn);[/red] //设置列
Mydxdbgd.Columns[n].BandIndex :=1;
Mydxdbgd.Columns[n].FieldName :=Mydataset.Fields.FieldName;
Mydxdbgd.Columns[n].Caption :=Mydataset.Fields.DisplayLabel ;
Inc(n);
end;
end;
end;
我把创建dxdbgrid控件列的代码写入DLL中,可每次调用时一执行到Mydxdbgd.CreateColumn(TdxDBGridColumn)就出错,错误提示为:invalid class typecast,这是为什么?
 
function Createdxdbgdcol(aApp:TApplication;DllScr:TScreen;Mydataset:TDataSet;
Mydxdbgd:TdxDBGrid):boolean;stdcall;
var
i,n:integer;
Newbands:TdxTreeListBand;
begin
CoInitialize(Nil);
Application:=aApp;
Screen:=DllScr;
for i:=0 to Mydxdbgd.ColumnCount-1 do
Mydxdbgd.Columns[0].Destroy ;
//建立两个band,一个为显示锁定列,另一个为显示非锁定列
for i:=0 to Mydxdbgd.Bands.Count-1 do
Mydxdbgd.Bands[0].Destroy;
Newbands:=Mydxdbgd.Bands.Add;
Newbands.MinWidth :=0;
Newbands.Width :=0;
Newbands.Fixed :=bfLeft;
Newbands:=Mydxdbgd.Bands.Add;
n:=0;
for i:=0 to Mydataset.FieldCount-1 do
begin
if MydataSet.Fields.Visible =False then
Continue
else
begin
//建立列
[red]Mydxdbgd.CreateColumn(TdxDBGridColumn);[/red] //设置列
Mydxdbgd.Columns[n].BandIndex :=1;
Mydxdbgd.Columns[n].FieldName :=Mydataset.Fields.FieldName;
Mydxdbgd.Columns[n].Caption :=Mydataset.Fields.DisplayLabel ;
Inc(n);
end;
end;
end;
我把创建dxdbgrid控件列的代码写入DLL中,可每次调用时一执行到Mydxdbgd.CreateColumn(TdxDBGridColumn)就出错,错误提示为:invalid class typecast,这是为什么?
 
好象在dll中的不能直接创建吧,需要放在其他的地方吧!
 
由于我把所有子窗体都放在DLL中,所以这个函数只好想办法也放在一个DLL中,其它所有DLL子窗体都调用该DLL来创建列。
 
为什么发现这段时间提出稍难一点的问题就没有人回答,大富翁的高手都到哪去了?
 
我得承认,我不算高手:)
 
终于有人说句话了,谢谢dyfh,虽然你不是高手,能留句话也算帮我了!
 
不好意思,有点孤陋寡闻,TdxDBGrid是啥控件?
 
to wangergulei
你可以不管是啥控件,你可以用DBGrid控件来测试也应该一样。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3289121
 
CreateColumn是干啥的?创建一行?
那能不能和listview似的,用column.add呢?
 
Tdxdbgrid控件只能用CreateColumn来建立列,与listview等控件不同。
 
那是不是TdxDBGridColumn需要一个单独的引用呢?
我记的tidudp就是这样的。
不过那样的话,应该是编译的时候就报错,而不是等到运行时。
 
为什么要把该控件传进来后又删掉每一行呢?
你试试看在函数里动态创建该控件,然后全部成功了之后把传进来的那个控件的指针指向自己创建的那个呢?
 
to wangergulei
是这样的,因为的mdi child窗体都做成DLL,由主程序调用,而每个MDI CHILD子窗体都有可能用到上面这个函数来动态创建列,而FORM打开后,由于用户的设置改变(如显示或隐藏某列),也需要刷新列显示,所以在函数开始需要删除列信息,再重新创建列。
 
期待中。
 
在DLL中调用CreateColumn确实有问题,不知道是哪里设置没对,还是该控件的BUG。
你可以用CreateDefaultColumns来替代CreateColumn,一次性创建dataset对应的列,然后再个别进行调整
 
呵呵,这样改也行
Mydxdbgd.CreateColumn(Mydxdbgd.GetDefaultColumnClass); //设置列
 
后退
顶部