Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Как перекодировать String в DOS-кодировку ?   Найти похожие ветки 

 
_Вован   (2005-06-15 13:09) [0]

Привет, Мастера! Такая проблема: пишу в открытый текстовый файл продедурой WriteLn, которая требует переменной типа String.
Как сделать так, чтобы в файл попал текст в DOS-кодировке?


 
Anatoly Podgoretsky ©   (2005-06-15 13:24) [1]

CharToOem


 
_Вован   (2005-06-15 15:13) [2]

Anatoly Podgoretsky ©

Если бы это было так просто, армянское радио.... :)

Вот есть такой способ:
http://www.books.ru/library/delphi_secrets/10.htm

Но он хорош для ОДНОРАЗОВОГО применения. Т.е. когда такую функцию юзаешь в цикле, она виснет на случайном проходе - каждый раз на разном. Exception получается EInvalidPointer with message "Invalid pointer operation".


 
Anatoly Podgoretsky ©   (2005-06-15 15:17) [3]

У тебя ошибка в программе.


 
_Вован   (2005-06-15 15:32) [4]

Anatoly Podgoretsky ©

Не может быть! :)

На основе вышеприведенной ссылки сделал такую функцию:

function TForm.WinToDOS(S: String): String;
var
 Src, Str: PChar;
begin
 Memo1.Lines.Text:=S;
 GetMem(Str, Length(Memo1.Lines.Text));
 Src := Memo1.Lines.GetText;
 CharToOem(Src, Str);
 Memo2.Lines.SetText(Str);
 FreeMem(Str);
 Result:=Memo2.Lines.Text;
end;

Т.е. функция берет строковую переменную в Win-кодировке и возвращает в DOS-кодировке.
Прикол в том, что если в строчку текстового файла на диск писать как часть ОДНУ такую полученную функцией WinToDOS переменную, то всё работет нормально на любом количестве циклов.

var
 c: String;

...
while ... do begin
 c:=<что-то>+WinToDOS(stroka)+<что-то_ещё>;
 WriteLn(Kfile,c);
end;

тогда всё ок. Но если сделать так:

...
c:=<что-то>+WinToDOS(stroka1)+<что-то_ещё>+WinToDOS(stroka2)+<...>;
WriteLn(Kfile,c);
...

тогда "Invalid pointer operation".

Как думаешь, в чём здесь ошибка??


 
Alexander Panov ©   (2005-06-15 16:00) [5]

_Вован   (15.06.05 15:32) [4]

Даже разбираться не хочется.

function Win2Dos(const aStr: String): String;
begin
  Result := aStr;
  if Result="" then Exit;
  CharToOem(PChar(Result),PChar(Result));
end;


 
Anatoly Podgoretsky ©   (2005-06-15 16:03) [6]

Ну точно ошибка, зачем же пытаться конвертировать пустые строки, чтобы получить ошибку наверно.

Alexander Panov ©   (15.06.05 16:00) [5]
Надо бы поправить, чтобы не было побочных эффектов.



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
9-1114071044
Xenon
2005-04-21 12:10
2005.08.14
Алгоритм в текстовых квестах


4-1118339471
Spectre_s
2005-06-09 21:51
2005.08.14
Создание пользователя Windows через Delphi


14-1122232341
Начинающий админ
2005-07-24 23:12
2005.08.14
Вот поступило мне предложение...


1-1121885796
Cryptopsy
2005-07-20 22:56
2005.08.14
Обновление программных модулей через сеть


3-1116008648
Fatal
2005-05-13 22:24
2005.08.14
Прямой коннект к БД Oracle.