Форум: "Начинающим";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];
ВнизСмена кодировки 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c