5

我目前正在开发一个在 Delphi 2010 中生成文件哈希的程序。作为其中的一部分,我可以选择创建用户预设,例如用户可以创建/保存/删除的哈希算法的预定义选择。我的创建和加载代码工作正常。它使用 ComboBox 并从文件“fhpre.ini”加载,在此文件内是以以下格式存储的用户预设:-

PresetName
PresetCode(一个 12 位字符串,使用 0 表示不散列,1 表示做)

在应用程序加载时,它会将此文件中的数据加载到 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 错误。我知道代码不是很好,例如没有检查具有相同名称的预设,但这会发生,我想先让基本代码工作,然后可以调整并添加额外的检查等。

任何帮助,将不胜感激。

4

3 回答 3

13

我希望你知道 TStringList 有 LoadFromFile 和 SaveToFile 方法吗?

如果由于某种原因您不能使用这些方法,为什么要使用流进行读取而使用 WriteLn 进行写入?

要使用 WriteLn 写入文件,必须将文件指定为第一个参数:

 WriteLn(fil, Contents[i]);

如果没有参数,它会尝试写入控制台(这可能在您的 Windows 应用程序中不可用)。错误 105 是“文件未打开以进行输出”。

于 2011-01-09T02:48:29.953 回答
6

由于您正在处理 .ini 文件,因此您应该根据需要使用TIniFile该类来操作其内容。这将使您的配置和代码更易于维护。

于 2011-01-09T08:43:40.017 回答
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;   
于 2011-01-11T02:28:07.887 回答