![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AnsiToOem, CharToOem
programmer90 © (2009-03-09 21:38:00)Здравствуйте!
В Связи с апгдейдом проекта на Delphi 2009 возникли некоторые проблемы, как известно это дельфя поддерживает юникод.
Использую функцию AnsiToOem итам ошибка E2010 мол типы не совпадают (в параметрах функции).т.е AnsiString и String не одно и то же.
На сайте поискал нашел то что надо, но для старых версии дельфи.
В немного подправил , компиль идет, правильного резалта нет(((
function ConvertAnsiToOem(const S : string) : string;
{$IFNDEF WIN32}
var
Source, Dest : array[0..255] of Char;
{$ENDIF}
begin
{$IFDEF WIN32}
SetLength(Result, Length(S));
if Length(Result) > 0 then
//CharToOem (PChar(S), PChar(Result));
CharToOem (PChar(S), PAnsiChar(Result));
{$ELSE}
if Length(Result) > 0 then
begin
CharToOem(StrPCopy(Source, S), Dest);
Result := StrPas(Dest);
end;
{$ENDIF}
end; { ConvertAnsiToOem }
function ConvertOemToAnsi(const S : string) : string;
{$IFNDEF WIN32}
var
Source, Dest : array[0..255] of Char;
{$ENDIF}
begin
{$IFDEF WIN32}
SetLength(Result, Length(S));
Utf8ToAnsi(s);
if Length(Result) > 0 then
//OemToChar(PChar(S), PChar(Result));
OemToChar(PAnsiChar(S), PChar(Result));
{$ELSE}
if Length(Result) > 0 then
begin
OemToChar(StrPCopy(Source, S), Dest);
Result := StrPas(Dest);
end;
{$ENDIF}
end;
{ ConvertOemToAnsi }
Да и ещё, вызов такой:
ConvertAnsiToOem( Memo[AdvPageControl1.ActivePageIndex].Lines.Text);
Пробовал CharToOem
Расчитываю на помощь мастеров!
programmer90 (2009-03-10 23:43:00) [1]
> Вот пусть код тебе пишет тот, кто заставил тебя перейти
> на Д2009.А ещё лучше будет, если сам во всём этом разберёшься.
>
никто не засталял меня перейти, не получится хрен сним, вернусь обратно в 2007 -ой...
Там элементарно типы меняешь и всё, есть какой-то нюанс кот я не могу найти, просто я хочу на двести процентов уверен, чтобы искать этот нюанс
Думаю вот это правильно:
function WinToDos(str: ansistring): ansistring;
begin
Result := str;
CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
end;
в 4-ех местах надо поменять и вот тебе апгрейд , разве не так?
programmer90 (2009-03-10 23:36:00) [2]за ссыль спасибо, очень интересно, но всё правильно сделал только не работает(((
Eraser (2009-03-10 01:32:00) [3]> Source, Dest : array[0..255] of Char;
вот это почитай
http://edn.embarcadero.com/article/38446
http://edn.embarcadero.com/article/38582
http://edn.embarcadero.com/article/38703
Германн (2009-03-10 01:05:00) [4]
> programmer90 (10.03.09 01:00) [3]
>
> Код напишите плизззз
Вот пусть код тебе пишет тот, кто заставил тебя перейти на Д2009.
А ещё лучше будет, если сам во всём этом разберёшься.
programmer90 (2009-03-10 01:00:00) [5]Код напишите плизззз
programmer90 (2009-03-10 00:28:00) [6]Вот так писал бы на пред версиях:
function WinToDos(str: string): string;
begin
Result := str;
CharToOemA(PChar(Result), PChar(Result));
end;
я nfr понимаю что надо просто вместо String -AnsiString;
PChar -PAnsiChar?
а вот так на новой :
function WinToDos(str: ansistring): ansistring;
begin
Result := str;
CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
end;
Сложность в том всё равно кракозябры выводит...
Eraser (2009-03-09 23:37:00) [7]>
>
> [0] programmer90 (09.03.09 21:38)
> Использую функцию AnsiToOem
а в чем сложности? поведение у функций стандартное. CharToOem теперь работает с юникодовой строкой, если нужно анси - используйте CharToOemA.