Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Смена кодировки 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]


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо