Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2023, 13:58   #1
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию Почему не работет функуция CharToOem

Embarcadero 11 под Windows 10.
Нужно преобразовать строки ANSI в OEM. Мой код:

Код:
procedure TM_Form.CheckToOemExecute(Sender: TObject);
var
  AStr: PAnsiChar;
  WStr: PWideChar;
begin
  WStr:= Memo1.Lines.GetText;
  showmessage(WStr); // исходный текст
  if CharToOem(WStr,AStr) then showmessage(WStr); // если функция выполнилась успешно, снова исходный текст
  showmessage(AStr); // преобразованный текст
end;
В Delphi 7 под Windows XP всё прокатывало. Сей час же функция возвращает ошибку . Господа, не подскажете в чём засада?
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 06.10.2023, 14:13   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

У GetText нет скобок, под AStr невыделено памяти, WStr не удален
p51x вне форума Ответить с цитированием
Старый 09.10.2023, 07:05   #3
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

p51x, Спасибо. Частично разобрался, но, похоже, я не с того начал.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 11.10.2023, 17:36   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Andrei Посмотреть сообщение
Embarcadero 11 под Windows 10.
Код:
type
  OemString = AnsiString(CP_OEMCP);

procedure TM_Form.CheckToOemExecute(Sender: TObject);
var
  OStr: OemString;
begin
  OStr:= Memo1.Lines.AsString;
end;
Vapaamies вне форума Ответить с цитированием
Старый 24.10.2023, 13:44   #5
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Vapaamies, Большое спасибо за подсказку.

Результат моих изысканий:
Работа с 866 кодовой страницей в Embarcadero. Может кому пригодится.

Загрузка файла с 866 кодовой страницей в TMemo:

Код:
procedure TForm1.FileOpen1Accept(Sender: TObject);
var
  StrStream: TStringStream;
  str: string;
begin
  StrStream := TStringStream.Create(str,866);
  StrStream.LoadFromFile(FileOpen1.Dialog.FileName);
  str:=StrStream.ReadString(StrStream.Size);
  Memo1.Lines.Text:=str;
  StrStream.Free;
end;
Сохранение 866 кодовой страницы из TMemo в файл:

Код:
type
 OemString = type AnsiString(866);

procedure TForm1.FileSaveAs1Accept(Sender: TObject);
var
  Str866: OemString;
  StrStream: TStringStream;
  str: string;
begin
  Str866:=Memo1.Lines.Text;
  for var Ch: AnsiChar in Str866 do
    str := str+Ch;
  //ShowMessage(str);
  StrStream := TStringStream.Create(str);
  StrStream.SaveToFile(FileSaveAs1.Dialog.FileName);
  StrStream.Free;
end;
Сделал, наверняка, криво, косо и неправильно, однако оно работает.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 24.10.2023 в 13:50.
Andrei вне форума Ответить с цитированием
Старый 24.10.2023, 17:12   #6
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

У вас же версия Alexandria или старше, используйте TEncoding из sysutils. Например сохранить произвольный текст в кодировке 866(или любой другой):
Код:
var
  buff:TBytes;
  str:TStringStream;
  s:string;
begin
 s:=Memo1.Lines.Text;
 buff:=TEncoding.Convert(TEncoding.Default,TEncoding.GetEncoding(866),
                         TEncoding.Default.GetBytes(s));
 str:=TStringStream.Create('',TEncoding.GetEncoding(866));
 str.Write(buff,Length(buff));
 str.SaveToFile('test.txt');
 str.free;
Загрузить текст из файла в кодировке 866 и конвертировать в кодировку DefaultEncoding (ANSI для windows или UTF8 для других платформ):
Код:
var
   str:TBytesStream;
   s:string;
begin
  str:=TBytesStream.Create();
  str.LoadFromFile('outtxt.txt');
  str.Seek(0,0);
  s:=TEncoding.Default.GetString(TEncoding.Convert(TEncoding.GetEncoding(866),
                                 TEncoding.Default,str.Bytes));
  str.free;
  Memo1.Lines.Text:=s;
Тот-же memo например умеет загружать текст в определённой кодировке:
Код:
 Memo1.Lines.LoadFromFile(FileName,TEncoding.GetEncoding(866));
и также сохранять:
Код:
  //сохранить в cp866
  Memo1.Lines.SaveToFile(FileName,TEncoding.GetEncoding(866));
  //или в utf8
  Memo1.Lines.SaveToFile(FileName,TEncoding.UTF8);
И не только memo, но пракитически всё где есть поля или переменные, основанные на TStrings, конечно если там не переопределены процедуры.
DIONISKA вне форума Ответить с цитированием
Старый 25.10.2023, 16:36   #7
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

DIONISKA, Спасибо. Это именно то, чего мне не хватало.

Вот чувствовал, что не поучилось мне добиться от Embarcadero, перефразируя Остапа Бендера, "того, чего добился Коля Остенбакен от польской красавицы Инги Зайонц. Он добился от неё любви." У меня же вышла не любовь, а какое-то изнасилование в извращённой форме. Программу установил только пару-тройку недель назад, теперь ковыряюсь в свободное от основной работы время. В принципе, для своих нужд меня устроят и последние три строчки из предложенного Вами кода. Подвешу менюшку с выбором кодировки на загрузку и сохранение файла - и вперёд.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работет метод shouldOverrideUrlLoading Trulala2020 Java Мобильная разработка (Android) 0 10.03.2020 12:30
Не работет звук в динамиках на ноутбуке S0RR0W Компьютерное железо 8 28.05.2012 10:49
CharToOem С++ LancX Помощь студентам 4 01.05.2012 19:29
Проблемы с функцией CharToOem((( koutinho Общие вопросы C/C++ 3 12.01.2012 19:47
CharToOem ??? Revenholm Общие вопросы C/C++ 1 09.05.2009 13:32