我目前正在开发一个程序来生成Delphi 2010中的文件哈希。作为其中的一部分,我可以选择创建用户预设,例如预定义的哈希算法选择,用户可以创建/保存/删除。我有创建和加载代码正常工作。它使用ComboBox并从文件“fhpre.ini”加载,在此文件中是以以下格式存储的用户预设: -
PresetName
PresetCode(一个12位数的字符串,0表示不散列,1表示do)
在应用程序加载时,它会将此文件中的数据加载到ComboBox和一个数组中,其中ComboBox的ItemIndex与数组中0和1的相应正确字符串相匹配。
现在我需要实现一项功能,让用户从列表中删除预设。到目前为止,我的代码如下,
procedure TForm1.Panel23Click(Sender : TObject);
var
fil : textfile;
contents : TStringList;
x,i : integer;
filline : ansistring;
filestream : TFileStream;
begin //Start Procedure
//Load data into StringList
contents := TStringList.Create;
fileStream := TFileStream.Create((GetAppData+'\RFA\fhpre.ini'), fmShareDenyNone);
Contents.LoadFromStream(fileStream);
fileStream.Destroy();
//Search for relevant Preset
i := 0;
if ComboBox4.Text <> Contents[i] then
begin
Repeat
i := i + 1;
Until ComboBox4.Text = Contents[i];
end;
contents.Delete(i); //Delete Relevant Preset Name
contents.Delete(i); //Delete Preset Digit String
//Write StringList back to file.
AssignFile(fil,(GetAppData+'\RFA\fhpre.ini'));
ReWrite(fil);
for i := 0 to Contents.Count -1 do
WriteLn(Contents[i]);
CloseFile(fil);
Contents.Free;
end;
但是,如果运行此命令,则在到达WriteLn部分时会出现105错误。我知道代码不是很好,例如没有检查具有相同名称的预设,但是会出现这种情况,我希望首先使用基本代码然后调整并添加额外的检查等。
任何帮助将不胜感激。
答案 0 :(得分:12)
我希望您知道TStringList有LoadFromFile和SaveToFile方法吗?
如果由于某些原因你不能使用这些方法,为什么要使用流来读取而写入WriteLn呢?
要使用WriteLn写入文件,必须将文件指定为第一个参数:
WriteLn(fil, Contents[i]);
没有参数,它试图写入控制台(可能在Windows应用程序中不可用)。错误105是“文件未打开输出”。
答案 1 :(得分:6)
由于您正在处理.ini文件,因此您应该使用TIniFile
类来根据需要操作其内容。这将使您的配置和代码更容易维护。
答案 2 :(得分:0)
这是在实现TStringlist.LoadFromFile和TStringList.SaveToFile之后的最终代码。它可能仍然可以从一些优化中受益,但这将及时到来。
Procedure TForm1.Panel23Click(Sender : TObject);
var
contents : TStringList;
i : integer;
begin //Start Procedure
//Load data into StringList
Contents := TStringList.Create;
Contents.LoadFromFile((GetAppData+'\RFA\fhpre.ini'));
//Search for relevant Preset
i := 0;
if ComboBox4.Text <> Contents[i] then
begin
Repeat
i := i + 1;
Until ComboBox4.Text = Contents[i];
end;
contents.Delete(i); //Delete Relevant Preset Name
contents.Delete(i); //Delete Preset Digit String
Contents.SaveToFile((GetAppData+'\RFA\fhpre.ini'));
AddPresetCombo(GetAppData+'\RFA\fhpre.ini'); //Populate Comobo With Presets From File
Form1.ComboBox4.ItemIndex := 0;
Contents.Free;
end;