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

Вниз

Смена кодировки Win -> DOS для string   Найти похожие ветки 

 
abhtr   (2009-02-16 15:31) [0]

Изначально было нужно сформировать справку в текстовый файл для DOS-ских машин.
Был написан следующих код:

    AssignFile(MyTextFile,sDirMailOur+"\Spravka.rpt");
    Rewrite(MyTextFile);
    nList := 1;   // Нумерация листов.

    sss := "                                      Лист "+IntToStr(nList);
    sss := WinToDos(sss);
    WriteLn(MyTextFile,sss);
    WriteLn(MyTextFile," ");
!!!!!!!! Место сбоя
    sMonthYY := fStr_RecMMYY(frmWork.edtMMYY.Text);
    sss := "Справка о передачи сортировочных таблиц на "+ sMonthYY;
    sss := WinToDos(sss);
    WriteLn(MyTextFile,sss);
...



//Функция преобразования строки из Win кодировки в Dos кодировку.
function WinToDos(strWin: string): string;
var
Buf : PChar;
begin
Buf:=StrAlloc(Length(strWin)); //выделяем память     OemToChar
StrCopy(Buf,pChar(strWin));//копируем
CharToOem(Buf,Buf);
WinToDos := string(Buf);
end;  //function WinToDos(strWin: string): string;

Все работало, а теперь... не понятно, что.
То работает, особенно если прохожу с Debug-ером, то не работает. Если прохожу из Delphi с Debug-ером, то "вылетает" в отладчик ASM, если запускаю exe-файл, то вылетает из задачи.
Подскажите, где написано "не аккуратно", не строго и еще как-нибудь, что может приводить к неустойчивой работе.
Есть еще слабая оговорка. На фирме строго проводят, чуть не каждый день, обновление Windows.


 
Плохиш ©   (2009-02-16 15:38) [1]


> то "вылетает"

А ей летать, а ей летать охота...


 
han_malign ©   (2009-02-16 15:45) [2]


> //выделяем память     OemToChar

1. - не хватает +1 - для терминируюшего нуля. если длинна строки кратна 4-м - убивается куча(если не кратна - спасает дополнение до DWORD-выравнивания)...
2. - не хватает //освобождаем память
3. Result:= strWin; CharToOem(PChar(Result),PChar(Result));


 
clickmaker ©   (2009-02-16 15:47) [3]

Result := strWin;
CharToOem(PChar(Result), PChar(Result));

если даже пользоваться динамическим буфером, то StrAlloc(Length(strWin) + 1);, 1 байт на нуль-терминатор. Иначе как CharToOem определит конец строки?


 
abhtr   (2009-02-16 16:01) [4]

Я правильно понял?
Предлагается два варианта решения.
Первый вариант.

//Функция преобразования строки из Win кодировки в Dos кодировку.
function WinToDos(strWin: string): string;
var
Buf : PChar;
begin
Buf:=StrAlloc(Length(strWin)+1); //выделяем память     OemToChar
StrCopy(Buf,pChar(strWin));//копируем
CharToOem(Buf,Buf);
WinToDos := string(Buf);
end;  //function WinToDos(strWin: string): string;


Второй вариант.

//Функция преобразования строки из Win кодировки в Dos кодировку.
function WinToDos(strWin: string): string;
begin
Result := strWin;
CharToOem(PChar(Result), PChar(Result));
end;  //function WinToDos(strWin: string): string;

и второй вариант обеспечивает освобождение памяти?


 
clickmaker ©   (2009-02-16 16:10) [5]

> [4] abhtr   (16.02.09 16:01)

в первом тоже можно обеспечить освобождение памяти - StrDispose

просто нет смысла переливать из string в pchar, потом обратно. Это все можно возложить на управляемый тип - string. Менеджер памяти сам выделит и освободит память при возврате из функции


 
abhtr   (2009-02-16 16:15) [6]


> clickmaker

Большое спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
6-1201616960
Yurij-7
2008-01-29 17:29
2009.04.05
Кодировка темы сообщения и поля " Отправитель"


2-1234501240
dark_volk
2009-02-13 08:00
2009.04.05
Копирование таблиц


2-1234349665
harisma
2009-02-11 13:54
2009.04.05
ListView и позиционирование.


2-1234283158
Dr. Genius
2009-02-10 19:25
2009.04.05
Подводные камни при автоматическом выключении компьютера


2-1234775951
Scot Storch
2009-02-16 12:19
2009.04.05
организация сортировки по нескольким полям