2011-01-09 4 views
4

저는 현재 Delphi 2010에서 파일 해시를 생성하는 프로그램을 만들고 있습니다.이 작업의 일부로 사용자 사전 설정을 만들 수있는 옵션이 있습니다. 사용자가 생성/저장/삭제할 수있는 미리 정의 된 해싱 알고리즘. 생성 및로드 코드가 정상적으로 작동합니다.Delphi - 파일을 StringList로 읽은 다음 파일을 삭제하고 다시 쓰십시오.

PresetName
PresetCode (해시와 일하지 않는 0을 사용하여 12 자리 문자열 - : 그것은이 파일의 형식으로 저장된 사용자 사전 설정입니다 내부 파일에서 "fhpre.ini"콤보 상자로드를 사용 for do)

응용 프로그램로드시이 파일의 데이터가 ComboBox에로드되고 ComboBox의 ItemIndex가 해당 올바른 문자열 인 0과 1과 일치합니다.

이제 사용자가 목록에서 사전 설정을 삭제하도록하는 기능을 구현해야합니다. 다음과 같이 지금까지 내 코드는이 실행되는 경우에는 WriteLn이라는 섹션에 도달 할 때

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 오류가있다. 나는 코드가 훌륭하지 않다는 것을 알고있다. 예를 들어 같은 이름을 가진 프리셋에 대한 검사가 없다는 것을 알고있다.하지만 기본 코드가 먼저 작동하게하고 추가 검사를 추가하고 조정할 수있다.

도움을 주시면 감사하겠습니다.

+0

모든 유니 코드 버전의 Delphi (D2009 +)에서 읽기/쓰기 (Ln)를 사용할 때주의하십시오. 이 함수는 유니 코드를 지원하지 않습니다. –

답변

12

TStringList에 LoadFromFile 및 SaveToFile 메서드가 있다는 것을 알고 있습니다.

그리고 어떤 이유로 이러한 방법을 사용할 수 없다면 스트림을 사용하여 읽기는하지만 WriteLn을 쓰는 이유는 무엇입니까? 그것은 (당신의 Windows 응용 프로그램에서 아마 가능하지 않은) 콘솔에 쓰려고 인수없이

WriteLn(fil, Contents[i]); 

:이다 WriteLn를 사용하여 파일에 쓸 수

, 당신은 첫 번째 인수로 파일을 지정해야합니다 . 오류 105 "파일을 열 수 없습니다"출력입니다.

+0

나는 잘 모르지만 지금이다. 하루 종일 그 코드를 만지작 거렸다. 그리고 그것은 전체의 때 얼굴에서 나를 명백하게 응시하고 있었다. 이제 완벽하게 작동합니다. 도움을 주셔서 감사합니다 래리 루스 티그 – jskrwyk

+0

다행히 도울 수있었습니다. 긴 하루 동안 미안 해요! –

+2

유니 코드 버전의 Delphi (D2009 +)에서는 읽기/쓰기 (Ln)를 사용할 때주의하십시오. 이 함수는 유니 코드를 지원하지 않습니다. (질문을 읽지 않고 답변으로 곧장 뛰어 오는 사람들을 위해이 코멘트를 반복하십시오.) –

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; 
관련 문제