Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
25th
Окт
Почему не работает функция CharToOem
Posted by obzor under Delphi
Embarcadero 11 под Windows 10.
Нужно преобразовать строки ANSI в OEM.
В Delphi 7 под Windows XP всё прокатывало. Сей час же функция возвращает ошибку . Господа, не подскажете в чём засада?
Результат моих изысканий:
Работа с 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;
Сделал, наверняка, криво, косо и неправильно, однако оно работает.
У вас же версия 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, конечно если там не переопределены процедуры.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)