![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Смена кодировки Win -> DOS для string [D7, WinXP]
abhtr © (2009-02-16 15:31:00)Изначально было нужно сформировать справку в текстовый файл для 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.
abhtr (2009-02-16 16:15:00) [1]
> clickmaker
Большое спасибо.
clickmaker (2009-02-16 16:10:00) [2]> [4] abhtr (16.02.09 16:01)
в первом тоже можно обеспечить освобождение памяти - StrDispose
просто нет смысла переливать из string в pchar, потом обратно. Это все можно возложить на управляемый тип - string. Менеджер памяти сам выделит и освободит память при возврате из функции
abhtr (2009-02-16 16:01:00) [3]Я правильно понял?
Предлагается два варианта решения.
Первый вариант.
//Функция преобразования строки из 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 15:47:00) [4]Result := strWin;
CharToOem(PChar(Result), PChar(Result));
если даже пользоваться динамическим буфером, то StrAlloc(Length(strWin) + 1);, 1 байт на нуль-терминатор. Иначе как CharToOem определит конец строки?
han_malign (2009-02-16 15:45:00) [5]
> //выделяем память OemToChar
1. - не хватает +1 - для терминируюшего нуля. если длинна строки кратна 4-м - убивается куча(если не кратна - спасает дополнение до DWORD-выравнивания)...
2. - не хватает//освобождаем память
3.Result:= strWin; CharToOem(PChar(Result),PChar(Result));
Плохиш (2009-02-16 15:38:00) [6]
> то "вылетает"
А ей летать, а ей летать охота...