2011-01-09 10 views
4

私は現在、Delphi 2010でファイルのハッシュを生成するプログラムを開発中です。これの一部として、ユーザープリセットを作成するオプションがあります。ユーザーが作成/保存/削除できるハッシュアルゴリズムの事前定義された選択。私は作成とロードコードが正常に動作しています。それは、ファイル「fhpre.ini」からコンボボックスや負荷を使用して、このファイル内のフォーマットで保存されたユーザープリセットである: -Delphi - ファイルをStringListに読み込んだ後、削除してファイルに書き戻します

PresetName
PresetCode(0を使用して12桁の文字列がハッシュと1はありませんfor 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

すべてのUnicodeバージョンのDelphi(D2009 +)では、読み書き(Ln)を使用するように注意してください。これらの関数はUnicodeをサポートしていません。 –

答えて

12

あなたはTStringListにLoadFromFileとSaveToFileメソッドがあることを知っていますか?

何らかの理由でこれらのメソッドを使用できない場合、読み込み用にストリームを使用するのはなぜですか?書き込み用にWriteLnを使用する理由は何ですか?それは(あなたのWindowsアプリケーションではおそらく利用できない)コンソールに書き込もうと引数なし

WriteLn(fil, Contents[i]); 

:のwritelnを使用してファイルに書き込むに

は、あなたが最初の引数としてファイルを指定する必要があります。 。エラー105は「ファイルが出力用に開かれていません」です。

+0

私は気づいていませんでしたが、今です。一日中、そのコードを操作して、それは明らかに全面的に私を見つめていた。今は完璧に動作します。助けてくれてありがとうLarry Lustig – jskrwyk

+0

私は助けてくれたことをうれしく思います。長い一日に申し訳ありません! –

+2

Unicode版のDelphi(D2009 +)では、読み取り/書き込み(Ln)を使用するように注意してください。これらの関数はUnicodeをサポートしていません。 (質問を読んでいないが、答えにまっすぐに飛ぶ人のために、このコメントを繰り返してください)。 –

6

.iniファイルを扱っているので、必要に応じて内容を操作するにはTIniFileクラスを使用する必要があります。これにより、設定やコードの管理が簡単になります。

+0

TIniFileクラスはまだ正しく動作していますか?前回私が使ったのは、Windows PrivateProfile API呼び出しに基づいており、間違いを犯しました。私は正しく動作するTMemIniFileの使用に頼っていました。 –

+0

@Davidちょうど好奇心から、何が間違っているのですか? – johnny

+0

@johnnyそれはずっと前に私は今覚えていない!私は、私が手元に正確な詳細を持っていなければ、このようなことを本当に批判すべきではないと思います。私の思い出は、特定のフォームでは、PrivateProfile APIがTMemIniFileとは異なる動作をしていて、TMemIniFileが正しいと感じました。 –

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; 
関連する問題