2011-01-09 33 views
4

我目前正在製作一個程序來生成Delphi 2010中的文件散列。作爲這一部分,我可以選擇創建用戶預設,例如,用戶可以創建/保存/刪除的哈希算法的預定義選擇。我有創建和加載代碼工作正常。它採用了組合框和從文件中裝載「fhpre.ini」,這裏面的文件是存儲在格式用戶預設: -德爾福 - 讀取文件到StringList,然後刪除並回寫到文件

PresetName
PresetCode(用0表示不散列和1個12位數的字串for do)

在應用程序加載時,它將該文件中的數據加載到ComboBox和一個Array中,ItemIndex與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; 

但是,如果這是跑,我得到一個105錯誤,當它到達WriteLn部分。我知道代碼不是很好,例如沒有檢查具有相同名稱的預設,但是會出現,我想讓基本代碼先工作然後可以調整並添加額外的檢查等。

任何幫助,將不勝感激。

+0

在任何Unicode版本的Delphi(D2009 +)中,請小心使用讀/寫(Ln)。這些函數不支持Unicode。 – 2011-01-09 09:45:45

回答

12

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

如果因爲某些原因不能使用這些方法,爲什麼要使用流讀取,但WriteLn寫入?

要寫入使用WriteLn一個文件,你必須指定文件作爲第一個參數:

WriteLn(fil, Contents[i]); 

沒有它試圖寫入控制檯(這大概是不是在你的Windows應用程序可用)的說法。錯誤105是「文件未打開輸出」。

+0

我不知道,但現在。整整一天擺弄這段代碼,顯然整個時間都在盯着我。現在工作完美無瑕。感謝您的幫助Larry Lustig – jskrwyk 2011-01-09 02:57:35

+0

很高興我能夠提供幫助。對不起,漫長的一天! – 2011-01-09 02:59:01

6

由於您正在處理.ini文件,因此您應該使用TIniFile類來根據需要操作其內容。這將使您的配置和代碼更容易維護。

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;