5

私は現在、Delphi 2010で、ファイルのハッシュを生成するプログラムに取り組んでいます。この一環として、ユーザーが作成/保存/削除できるハッシュアルゴリズムの事前定義された選択など、ユーザープリセットを作成するオプションがあります。コードの作成と読み込みは正常に機能しています。これはComboBoxを使用し、ファイル「fhpre.ini」からロードします。このファイル内には、次の形式で保存されたユーザープリセットがあります。-

ResetNameプリセット
コード(ハッシュしない場合は0、ハッシュする場合は1を使用する12桁の文字列)

アプリケーションをロードすると、このファイルからComboBoxと、配列内の対応する正しい0と1の文字列に一致するComboBoxのItemIndexを持つ配列にデータがロードされます。

次に、ユーザーにリストからプリセットを削除させる機能を実装する必要があります。これまでのところ、私のコードは次のとおりです。

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 に答える