Показать сообщение отдельно
  #19  
Старый 17.12.2013, 22:48
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Freeman
Вот это очень и очень странно, поскольку на XP и 2003 GetACP возвращала именно кодировку региональных настроек, а не локализации.
На XP я и проверял. По поводу локализации это я на вскидку сказал, возможно и не от локализации (просто не знаю от чего уж тогда), но уж точно не от региональных настроек.
Вот для примера на русскоязычной WinXP установил языковый стандарт "Итальянский (Италия)", расположение "Танзания" и язык ввода по-умолчанию "Английский (США) - (США)". Запускаю такой код:
Код:
type
  _cpinfoExA = record
    MaxCharSize: UINT;                       { max length (bytes) of a char }
    DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; { default character }
    LeadByte: array[0..MAX_LEADBYTES - 1] of Byte;      { lead byte ranges }
    UnicodeDefaultChar: WideChar;
    Codepage: UINT;
    CodePageName: array[0..MAX_PATH -1] of AnsiChar;
  end;

  TCPInfoExA = _cpinfoExA;
  TCPInfoEx = TCPInfoExA;  

function GetCPInfoEx(CodePage: UINT; dwFlags: DWORD; var lpCPInfoEx: TCPInfoEx): BOOL; stdcall;
  external kernel32 name 'GetCPInfoExA';

procedure TForm1.Button1Click(Sender: TObject);
var
  LCPInfo: TCPInfoEx;
begin
  if GetCPInfoEx(GetACP, 0, LCPInfo) then
  begin
    ShowMessageFmt('$%4x (%d) => "%s"', [LCPInfo.Codepage, LCPInfo.Codepage, LCPInfo.CodePageName]);
  end;
end;
Который в результате тем не менее выдаёт: $ 4E3 (1251) => "1251 (ANSI - кириллица)":


Цитата:
Сообщение от hilaryon
хех, сразу возник вопрос, что делать с элементами которые не имеют DefaultEncoding свойства? -)
Можно ещё загружать через RawByteString:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  s: RawByteString;
begin
  fs := TFileStream.Create('ИмяФайла', fmOpenRead);
  try
    SetLength(s, fs.Size);
    fs.Read(Pointer(s)^, fs.Size);
    SetMultiByteConversionCodePage(1251); // Это достаточно сделать однажды, например в FormCreate
    Edit1.Text := s;
  finally
    fs.Free;
  end;
end;
Цитата:
Сообщение от hilaryon
русификация у меня грузится через TIniFile.. придется видимо от него отказаться ( кодировки он не поддерживает
Обычный TIniFile лучше вообще не использовать. В том же модуле есть TMemIniFile полностью реализующий функциональность TIniFile и даже чуть больше.

Цитата:
Сообщение от hilaryon
реально жаль что нельзя установить в приложении кодировку и чтобы он не брал настройки с винды (
Я экспериментировал с DelphiXE2. Возможно в XE5 это исправили.
Ответить с цитированием