Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
10-1153589543
Andrey Kad.
2006-07-22 21:32
2009.04.05
Границы ячейки в Excel


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


10-1153825601
AlexeyMir
2006-07-25 15:06
2009.04.05
Регистрация ActX библиотеки из своей программы


15-1233732052
KSergey
2009-02-04 10:20
2009.04.05
Изменения в законе об авторском праве


15-1234046172
Student
2009-02-08 01:36
2009.04.05
С чего начать? Или HellowWorld по серьёзному





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский