描述:通过DBgrid ->datasource,ADOQuery->数据库
需求:通过DBgrid可以任意的添加字段到数据库中(添加是可以了,而且可以成功地显示在Dbgrid中,问题是:当关掉程序再次运行的时候DBgrid显示的是静态绑定的字段,而我动态创建的字段和动态加在DBgrid中的title则没有显示出来(当然我没有从数据库取出字段和保存之前的title,后来尝试去做了碰到了难点,特来讨教:如何取出数据库中动态创建的字段【好像不能根据位置来取,如果是这样的话删掉一个其中就会乱了】)),同时也可以通过Dbgrid删除数据库中的字段(除了主键),目前还是添加字段功能无解,各路大神,显显灵,膜拜了
code:
通过小窗体动态添加:
procedure TFrmADField.Button1Click(Sender: TObject);
var
i,k:integer;
vcol:TColumn;
sys:Tinifile;
MyField:string;
MyCaption:string;
lstr:Tstrings;
Const
str='Alter Table T_Total Add %s char(30)';
begin
k:=0;
With FrmMain.ADOwait do
begin
Close;
SQL.Add(Format(str,[Edit2.text]));
ExecSQL;
Close;
SQL.Clear;
SQL.Add('select * From T_ToTal where tag=''w''');
Open;
end; vcol:=FrmMain.DBgrdWait.Columns.add;
for i:=0 to FrmMain.DBgrdWait.Columns.count-1 do
begin
if FrmMain.DBgrdWait.Columns[i].FieldName='' then
FrmMain.DBgrdWait.Columns[i].FieldName:=Trim(Edit2.text);
MyField:=Trim(Edit2.text);
if Vcol.Title.Caption= '' then
begin
Vcol.Title.Caption:=Trim(Edit1.text);
vcol.Width:=130;
MyCaption:=Trim(Edit1.text);
end;
end;
try
lstr:=TStringlist.create;
lstr.Add(MyCaption);
lstr.SaveToFile(extractfilepath(paramstr(0))+'sys\my.txt');主窗体oncreate:
读取并添加到DBgrid:
procedure TFrmMain.FormCreate(Sender: TObject);
var
i,j:integer;
vcol:Tcolumn;
MyField:string;
MyCaption:string;
str:Tstrings;
mStream:Tmemorystream;
begin
mStream:=TMemorystream.create;
mStream.loadfromfile(extractfilepath(paramstr(0))+'sys\my.txt');//取之前创建的DBgrid title
vcol:=DBgrdWait.Columns.add;
for i:=0 to DBgrdWait.Columns.count-1 do
begin
for j:=0 to adowait.Fieldcount-1 do
begin
if DBgrdWait.Columns[i].Title.Caption='' then//这个条件的想法是DBgrid title动态创建字段的排在静态已经绑定字段的后面
begin
DBgrdWait.Columns[i].FieldName:=adowait.Fields[j].FieldName; //现在难点是如何取出这些字段,按位置取好像不对,如果我删掉一个字段的话位置不是全乱了?
vcol.Title.Caption:=MyCaption; //这个取DBgrid title先不管
vcol.Width:=130;
end;
end; end;
麻烦帮看看
需求:通过DBgrid可以任意的添加字段到数据库中(添加是可以了,而且可以成功地显示在Dbgrid中,问题是:当关掉程序再次运行的时候DBgrid显示的是静态绑定的字段,而我动态创建的字段和动态加在DBgrid中的title则没有显示出来(当然我没有从数据库取出字段和保存之前的title,后来尝试去做了碰到了难点,特来讨教:如何取出数据库中动态创建的字段【好像不能根据位置来取,如果是这样的话删掉一个其中就会乱了】)),同时也可以通过Dbgrid删除数据库中的字段(除了主键),目前还是添加字段功能无解,各路大神,显显灵,膜拜了
code:
通过小窗体动态添加:
procedure TFrmADField.Button1Click(Sender: TObject);
var
i,k:integer;
vcol:TColumn;
sys:Tinifile;
MyField:string;
MyCaption:string;
lstr:Tstrings;
Const
str='Alter Table T_Total Add %s char(30)';
begin
k:=0;
With FrmMain.ADOwait do
begin
Close;
SQL.Add(Format(str,[Edit2.text]));
ExecSQL;
Close;
SQL.Clear;
SQL.Add('select * From T_ToTal where tag=''w''');
Open;
end; vcol:=FrmMain.DBgrdWait.Columns.add;
for i:=0 to FrmMain.DBgrdWait.Columns.count-1 do
begin
if FrmMain.DBgrdWait.Columns[i].FieldName='' then
FrmMain.DBgrdWait.Columns[i].FieldName:=Trim(Edit2.text);
MyField:=Trim(Edit2.text);
if Vcol.Title.Caption= '' then
begin
Vcol.Title.Caption:=Trim(Edit1.text);
vcol.Width:=130;
MyCaption:=Trim(Edit1.text);
end;
end;
try
lstr:=TStringlist.create;
lstr.Add(MyCaption);
lstr.SaveToFile(extractfilepath(paramstr(0))+'sys\my.txt');主窗体oncreate:
读取并添加到DBgrid:
procedure TFrmMain.FormCreate(Sender: TObject);
var
i,j:integer;
vcol:Tcolumn;
MyField:string;
MyCaption:string;
str:Tstrings;
mStream:Tmemorystream;
begin
mStream:=TMemorystream.create;
mStream.loadfromfile(extractfilepath(paramstr(0))+'sys\my.txt');//取之前创建的DBgrid title
vcol:=DBgrdWait.Columns.add;
for i:=0 to DBgrdWait.Columns.count-1 do
begin
for j:=0 to adowait.Fieldcount-1 do
begin
if DBgrdWait.Columns[i].Title.Caption='' then//这个条件的想法是DBgrid title动态创建字段的排在静态已经绑定字段的后面
begin
DBgrdWait.Columns[i].FieldName:=adowait.Fields[j].FieldName; //现在难点是如何取出这些字段,按位置取好像不对,如果我删掉一个字段的话位置不是全乱了?
vcol.Title.Caption:=MyCaption; //这个取DBgrid title先不管
vcol.Width:=130;
end;
end; end;
麻烦帮看看
解决方案 »
- 继续问DCOM问题
- 如何打開word文件
- 这样的语句可以在窗口中调用吗?
- 请问Delphi自带的控件TIdFTP的传输占用带宽是多少?
- 讨论:当前不同规模企业信息管理系统开发架构主要分为哪几种?
- "Interface not Supported"!!! ---- 一个关于环境设置的问题
- 怎么使adodataset只返回最近更新的记录,高手请指教,谢谢
- 调查一下,北京和上海的delphi程序员工资。
- ●●●★★△用DEPHI做一个MIS程序的启动画面■★★●●●
- 有谁会写IE编码的源代码,我写了一个,但是说什么参数无效。。。UP有分
- 正在写的Delphi组件开发教程指南
- 战斗机游戏+ [源码] + [原创]
DBGrid的字段建议不要静态绑定,不需要显示的列用visible来控制比较好。
取字段,最好根据字段名来取,而不是根据排列序号。
遍历DBGrid的列名和数据源的列名,那是嵌套循环。