2015-07-22 7 views
-2

В каком-то ZIP-файле у меня есть файл head.txt. Я хочу скопировать текст из этого файла в TMemo в мою форму. Вот мой код:Delphi - Текст из файла в ZIP на памятку

procedure TformMain.LoadProject(InputFileName: string); 
var 
    MS: TMemoryStream; 
    zip: TZipForge; 
    txt: string; 
begin 
    MS := TMemoryStream.Create; 
    try 
    zip := TZipForge.Create(nil); 
    try 
     with zip do begin 
     FileName := InputFileName; 
     OpenArchive(fmOpenReadWrite); 
     ExtractToStream('head.txt', MS); 
     CloseArchive; 
     end; 
    finally 
     zip.Free; 
    end; 
    MS.Seek(0, soFromBeginning); 
    SetLength(txt, MS.Size); 
    MS.Write(txt[1], MS.Size); 
    finally 
    MS.Free; 
    end; 
    if Length(txt) > 0 then Memo1.Lines.Text := txt; 
end; 

Но это не сработает. В head.txt в моем ZIP файле:

123456 
abcdef 
xxxx 

и результат в Memo является:

auto-suggest dropdow 

Спасибо за помощь!

+1

Почему вы пишете содержимое переменной текстовый в ваш поток памяти? Разве вам не нужно читать содержимое из потока памяти в переменную txt? – SilverWarior

+0

@SilverWarior: Хороший улов. – MartynA

+1

Просто используйте метод ['ExtractToString'] (http://www.componentace.com/help/zf_guide/extracttostring.htm). – TLama

ответ

2

Попробуйте заменить этот код:

MS.Seek(0, soFromBeginning); 
SetLength(txt, MS.Size); 
MS.Write(txt[1], MS.Size); 

с вызовом SetString

SetString(txt, PAnsiChar(MS.Memory), MS.Size); 

как в this question

+0

Спасибо, приятель! – core4096

4

Проблема заключается в том, что вместо чтения данных из памяти потока в переменную текстовый используя метод Read, вы фактически записываете данные из своей переменной txt в свой поток памяти.

Так что ваш код должен выглядеть как этот

procedure TformMain.LoadProject(InputFileName: string); 
var 
    MS: TMemoryStream; 
    zip: TZipForge; 
    txt: string; 
begin 
    MS := TMemoryStream.Create; 
    try 
    zip := TZipForge.Create(nil); 
    try 
     with zip do begin 
     FileName := InputFileName; 
     OpenArchive(fmOpenReadWrite); 
     ExtractToStream('head.txt', MS); 
     CloseArchive; 
     end; 
    finally 
     zip.Free; 
    end; 
    MS.Seek(0, soFromBeginning); 
    SetLength(txt, MS.Size); 
    MS.Read(txt, MS.Size); 
    finally 
    MS.Free; 
    end; 
    if Length(txt) > 0 then Memo1.Lines.Text := txt; 
end; 

Я не проверял это.

Но так как вы хотите, чтобы загрузить текст из этого файла в Memo можно упростить, удалив переменный текстовую и всю суету необходимого с ним и загрузить текст в памятку непосредственно из потока памяти, как это:

Memo1.Lines.LoadFromStream(MS); 

Так что ваш окончательный код должен выглядеть следующим образом:

procedure TformMain.LoadProject(InputFileName: string); 
var 
    MS: TMemoryStream; 
    zip: TZipForge; 
begin 
    MS := TMemoryStream.Create; 
    try 
    zip := TZipForge.Create(nil); 
    try 
     with zip do begin 
     FileName := InputFileName; 
     OpenArchive(fmOpenReadWrite); 
     ExtractToStream('head.txt', MS); 
     CloseArchive; 
     end; 
    finally 
     zip.Free; 
    end; 
    MS.Seek(0, soFromBeginning); 
    Memo1.Lines.LoadFromStream(MS); 
    finally 
    MS.Free; 
    end; 
end; 
+0

Эти способы не работают для меня. Выход в Memo - это несколько китайских символов. – core4096

+5

@core Естественно, мы предположили, что вы использовали ANSI Delphi, так как код в вашем вопросе подразумевает это.Это ответ, который вы должны принять. После того, как вы дали TLama возможность адаптироваться к откровению, которое вы используете Unicode Delphi. Это расстраивает, когда мы пытаемся помочь людям понять и узнать, но все, что они, похоже, хотят сделать, это вставить код без необходимости тратить время или проблемы на изучение. Спросите себя, что вы узнали из этого вопроса? –

 Смежные вопросы

  • Нет связанных вопросов^_^