莫名奇妙的问题,高手请进(100分)

  • 主题发起人 主题发起人 娃娃
  • 开始时间 开始时间

娃娃

Unregistered / Unconfirmed
GUEST, unregistred user!
同样的代码
=============================================这样写就是正确的
myIni := TIniFile.Create(IniFileName);
lst_ColWidthList := TStringList.Create
<============就这一句。
with myIni do
try
for li_Count := 0 to Self.ComponentCount -1 do
begin
//处理TDBGridEh
if Self.Components[li_Count] is TDBGridEh then
begin
dbgTemp := Self.Components[li_Count] as TDBGridEh;

ls_WidthInfo := Trim(ReadString(Self.Name, dbgTemp.Name, ''));
if ls_WidthInfo <> '' then
begin
lst_ColWidthList.Clear;
lst_ColWidthList.Delimiter := ',';
lst_ColWidthList.DelimitedText := ls_WidthInfo;

for li_Col := 0 to dbgTemp.Columns.Count - 1 do
if lst_ColWidthList.Count - 1 > li_Col then
begin
li_Width := StrToInt(lst_ColWidthList.Strings[li_Col]);

if li_Width > 0 then dbgTemp.Columns.Items[li_Col].Width := li_Width;
end;
end;
end;

//处理TDBLookupComboBoxEh
if Self.Components[li_Count] is TDBLookupComboBoxEh then
begin
clbTemp := Self.Components[li_Count] as TDBLookupComboBoxEh;
clbTemp.DropDownBox.Sizable := True;
clbTemp.DropDownBox.Width := ReadInteger(Self.Name, (Self.Components[li_Count] as TDBLookupComboBoxEh).Name, 20);
end;

end
//end for
finally
myIni.Free;
lst_ColWidthList.Free;
end;


=============================================这样写就是错误的
这样写会导致继续于这个单元的一个单元中的的所有控件变成nil(跟踪时查到的)
myIni := TIniFile.Create(IniFileName);

with myIni do
try
for li_Count := 0 to Self.ComponentCount -1 do
begin

//处理TDBGridEh
if Self.Components[li_Count] is TDBGridEh then
begin
lst_ColWidthList := TStringList.Create
<============只是换了一下位置
dbgTemp := Self.Components[li_Count] as TDBGridEh;

ls_WidthInfo := Trim(ReadString(Self.Name, dbgTemp.Name, ''));
if ls_WidthInfo <> '' then
begin
lst_ColWidthList.Clear;
lst_ColWidthList.Delimiter := ',';
lst_ColWidthList.DelimitedText := ls_WidthInfo;

for li_Col := 0 to dbgTemp.Columns.Count - 1 do
if lst_ColWidthList.Count - 1 > li_Col then
begin
li_Width := StrToInt(lst_ColWidthList.Strings[li_Col]);

if li_Width > 0 then dbgTemp.Columns.Items[li_Col].Width := li_Width;
end;
end;
end;

//处理TDBLookupComboBoxEh
if Self.Components[li_Count] is TDBLookupComboBoxEh then
begin
clbTemp := Self.Components[li_Count] as TDBLookupComboBoxEh;
clbTemp.DropDownBox.Sizable := True;
clbTemp.DropDownBox.Width := ReadInteger(Self.Name, (Self.Components[li_Count] as TDBLookupComboBoxEh).Name, 20);
end;

end
//end for
finally
myIni.Free;
lst_ColWidthList.Free;
end;
 
代码太乱
看了伤神。
 
之所以结果不同,是因为第二个方案中,没有在循环外对变量lst_ColWidthList进行初始
化,导致如果循环没有运行到 lst_ColWidthList := TStringList.Create
这一行,实际
上该变量就是不可预知的值,而你的代码使用的try finally结构又导致无论循环执行的如
何,都会对lst_ColWidthList进行Free。
要解决该问题,只要在try之前加上 lst_ColWidthList:=nil
即可。(相信Delphi编译
器已经给出了 lst_ColWidthList might not be initializied 警告,只是楼主没在意)
 
我也注意到了这个问题,只是不明白,为什么释放了一下未赋值的TStrings变量,就会导致一个子窗口的所有控件为nil值?不太明白。

另外,creation-zy兄可否将mail地址告知,还有个让我困惑了许久的问题想你帮手看看。
(因为问题比较复杂,在论坛上难以讲清楚。)
 
creation_zy

sina.com
 

Similar threads

S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
A
回复
2
查看
542
后退
顶部