Главная страница
    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.005 c
15-1233818505
Slider007
2009-02-05 10:21
2009.04.05
С днем рождения ! 31 января 2009 суббота


15-1233588085
Кто б сомневался
2009-02-02 18:21
2009.04.05
Нарисовать коробку к ПО


8-1192654893
Pavia
2007-10-18 01:01
2009.04.05
Проблемы с DSTrackBar


15-1234034595
blackman
2009-02-07 22:23
2009.04.05
Что-то тормозить стало


15-1233817174
Slider007
2009-02-05 09:59
2009.04.05
С днем рождения ! 4 февраля 2009 среда





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский