如何用程序改变DBGRIDEH的TITLE.CAPTION后,将该属性储存起来?为什么手工改就可以?(100分)

  • 主题发起人 主题发起人 xzh2000
  • 开始时间 开始时间
X

xzh2000

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Tfrmehlib.FormCreate(Sender: TObject);
var
ls_sql, ls_name, ls_value: String;
li_l, li_f,li_w: Integer;
begin
ls_name := LowerCase(ADOQuery1.SQL.Text);
li_f := pos('from', ls_name);
li_w := pos('where', ls_name);
if li_w > 0 then
ls_name := trim(midstr(ls_name, li_f + 5, li_w - li_f))
else
ls_name := trim(midstr(ls_name, li_f + 5, length(ls_name)));

ls_sql := 'select pbc_cnam, pbc_hdr from pbcatcol where pbc_tnam = ' + QuotedStr(ls_name);
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(ls_SQL);
ADOQuery2.Open;
li_f := ADOQuery2.RecordCount - 1;
for li_w := 0 to li_f do
begin
ls_name := Trim(ADOQuery2.Fields[0].Value);
for li_l := 0 to li_f do
if DBGridEh1.Columns[li_l].FieldName = ls_name then
begin
ls_value := Trim(ADOQuery2.Fields[1].Value);
DBGridEh1.Columns[li_l].Title.Caption := ls_value; //我必须每次都写而不能保存下来。
//DBGridEh1.ColumnDefValues.title := ls_value;
end;
ADOQuery2.Next;
end;
ADOQuery2.Close;
end;
 
難道很難嗎?最高本人出一千分?
 
如何用程序改变DBGRIDEH的TITLE.CAPTION后,
将该属性储存起来?
为什么我們手工改COLUMN.TITLE.CAPTION值就可以儲存下來?
 
当然得每次写,设计期的属性包含在.dfm文件中,编译成可执行文件后就不能改了(除非你用非常规方法),可以用EXeScope之类的工具看DELPHI编译成的EXE,几乎所有.dfm的内容都可以看到(你的设计透明了,呵呵)

如果要改,最简单的方法是读写.dfm,把内容替换掉再重新编译
不过~里面的中文是以#23478这样的形式保存的:(
 
动态的就是这样,但你不一定就要存到数据库里,你可以修改一次过后或者程序退出时将它存入本地的一个INI或者注册表中,这样程序启动时装载比数据库来得更快。
 
“为什么手工改就可以?”,当然手工可以,因为它作为代码编辑的一部分保存起来了,
编译后就无法改动了(debug工具除外)。动态修改,可以使用数据表或ini文件或系统
注册表来保存和恢复。
 
因為我是用PD建模的,字段的漢字信息存儲在數據庫的系統表中,
我在想,DBGRID本身就有這個功能,只不過它的函數是私有的,如
何放開呢?
 
不能改??试试这些看看:
DBGridEh1.Columns.SaveToFile('AFile');
DBGridEh1.Columns.SaveToStream(AStream);
DBGridEh1.Columns.LoadFromFile('AFile');
DBGridEh1.Columns.LoadFromStream(AStream);
 
to thx1180:
你的答案接近我的要求啦,現在的問題是:我每次都要savetofile()及loadfromfile(),
是不是有點麻煩,能不能這樣做呢,我在窗口的create事件中判斷當前是否在IDE環境中,如果
在開發狀態,就每次savetofile及loadfromfile,當程序已經發布給客戶時,就每次只執行
loadfromfile就可以啦.

to all:
其實最簡單的解決方案就是如何在執行
DBGridEh1.Columns[li_l].Title.Caption := 'xxx'時,
能夠將xxx保存到*.dfm中,請大家再想想辦法?多謝啦.
 
  To:xzh200
其实我以前也这么想过! 控件的属性就是用流来保存的
读取的时候也是从流中得到!
1.把控件保存到流中
var
MFStream: TFileStream;
I: Integer;
S: String;
begin
MFStream := TFileStream.Create('FEdit.dat',fmCreate);
try
for I := 0 to Self.ComponentCount -1 do
begin
if (Self.Components is TEdit) then
MFStream.WriteComponent(TEdit(Self.Components));
If (Self.Components is TComboBox) then
begin
S := TComboBox(Self.Components).Text;
TComboBox(Self.Components).Items.Add(S);
MFStream.WriteComponent(TComboBox(Self.Components));
end;
end;
finally
MFStream.Free;
end;
end;
2.从流中读取控件 
var
New: TComponent;
MFStream: TFileStream;
ReadM: TReader;
begin
MFStream := TFileStream.Create('FEdit.dat',fmOpenRead);

while MFStream.Position < MFStream.Size do
begin
ReadM := TReader.Create(MFStream,4096);
ReadM.Parent := Self;
New := ReadM.ReadRootComponent(nil);
Self.InsertComponent(New);
ReadM.Free;
end;
MFStream.Free;
 
去看看这里就知道了!
http://www.cndelphi.com/bbs/dispbbs.asp?boardID=56&ID=109&skin=0
 
to kk2000
谢谢你,可是我有很多窗口啊,那么需要产生很多的流文件件,
还有如何判断程序已经发布给客户,而不是在DELPHI的IDE中运行?
 
to kk2000
我也太笨了,照你這段代碼,我只把DBGRIDEH保存到*.dfm中應該就可以啦.
 
to KK2000
我將DBGRID保存到*.dat后,讀取時報找不到dbgrid對象,如何處理?
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if Boolean(DebugHook) then
ShowMessage('Running in IDE');
end;
 
請thx1180,kk2000到這里拿分.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2339219
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2339233
 
待我問題全部解決,再開貼送分,只要參于,至少可以拿80分,謝謝.

to kk2000,我在執行下面這段時報找不到DBGRID類信息!
var
New: TComponent;
MFStream: TFileStream;
ReadM: TReader;
begin
MFStream := TFileStream.Create('FEdit.dat',fmOpenRead);

while MFStream.Position < MFStream.Size do
begin
ReadM := TReader.Create(MFStream,4096);
ReadM.Parent := Self;
New := ReadM.ReadRootComponent(nil);
Self.InsertComponent(New);
ReadM.Free;
end;
MFStream.Free;

 
看看这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2113735
如果只是读一个属性,可以参考这个帖子改改:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1945333
 
to thx1180:
如何在運行時將FORM中的DBGRID.COLUMN.TITLE.CAPTION
用程序保存到該FORM的*.dfm中?如果能實現我的本意就達到啦.
 
我有点晕,看楼主的分比我还多啊[:D]
我的理解:在程序运行时是不存在所谓的*.dfm文件的,他们在编译之后已经变成了可执行文件的资源的一部分,如果你是想改可执行文件中的资源那可比较麻烦啦。
 
后退
顶部