Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

русский шрифт в консоли - как ? [D7, WinXP]


Фёдор Мегатронов ©   (2004-12-17 00:25:00) 

Вот использую функцию FormatMessage чтобы узнать описание ошибки, и вывожу обычным WriteLnом ... он конечноже пишет белеберду .. потому что описания ошибок (у меня) есть только на русском языке .

Что сделать чтобы у всех там был именно PYCCKUE 6YKBbI ?


DiamondShark   (2004-12-17 13:16:00) [1]

unit conio;

interface

implementation

uses
 Windows;

const
 fmClosed = $D7B0;
 fmInput  = $D7B1;
 fmOutput = $D7B2;
 fmInOut  = $D7B3;

type
 PTextBuf = ^TTextBuf;
 TTextBuf = array[0..127] of Char;
 TTextRec = packed record
   Handle: Integer;
   Mode: Integer;
   BufSize: Cardinal;
   BufPos: Cardinal;
   BufEnd: Cardinal;
   BufPtr: PChar;
   OpenFunc: Pointer;
   InOutFunc: Pointer;
   FlushFunc: Pointer;
   CloseFunc: Pointer;
   case integer of
     0: (OldOpenFunc, OldInOutFunc, OldFlushFunc, OldCloseFunc: Pointer);
     1: (
       UserData: array[1..32] of Byte;
       Name: array[0..259] of Char;
       Buffer: TTextBuf);
 end;

 TTextFunc = function(var F: TTextRec): Integer;

function InOutFunc(var F: TTextRec): Integer;
begin
 case F.Mode of
   fmOutput: begin
     AnsiToOemBuff(F.BufPtr, F.BufPtr, F.BufPos);
     Result := TTextFunc(F.OldInOutFunc)(F);
   end;
   fmInput: begin
     Result := TTextFunc(F.OldInOutFunc)(F);
     if F.BufEnd > 0 then
       OemToAnsiBuff(F.BufPtr, F.BufPtr, F.BufEnd);
   end;
 else
   Result := TTextFunc(F.OldFlushFunc)(F);
 end;
end;

function FlushFunc(var F: TTextRec): Integer;
begin
 case F.Mode of
   fmOutput: begin
     AnsiToOemBuff(F.BufPtr, F.BufPtr, F.BufPos);
     Result := TTextFunc(F.OldFlushFunc)(F);
   end;
 else
   Result := TTextFunc(F.OldFlushFunc)(F);
 end;
end;

function OpenFunc(var F: TTextRec): Integer;
begin
 Result := TTextFunc(F.OldOpenFunc)(F);
 with F do
   begin
     OldInOutFunc := InOutFunc;
     OldFlushFunc := FlushFunc;
     OldCloseFunc := CloseFunc;
     InOutFunc := @conio.InOutFunc;
     FlushFunc := @conio.FlushFunc;
   end;
end;

procedure InitConsoleIO;
begin
 with TTextRec(Output) do
   begin
     OldOpenFunc := OpenFunc;
     OpenFunc := @conio.OpenFunc;
   end;
 with TTextRec(Input) do
   begin
     OldOpenFunc := OpenFunc;
     OpenFunc := @conio.OpenFunc;
   end;
end;

initialization
 InitConsoleIO;

end.

Подключить к проекту и наслаждаться.


Amoeba   (2004-12-17 13:10:00) [2]

На эту тему есть статья:
http://www.delphiplus.org/articles/rus_console.html


Piter   (2004-12-17 01:18:00) [3]

Вопрос: как перекодировать строку из кодировки OEM (DOS) в кодировку ANSI (Windows) и обратно?

Ответ: воспользоваться функциями CharToOem и OemToChar. Пример:

function Win2Dos(const aStr: String): String;
begin
 Result := aStr;
 if Result <> '' then
   CharToOem(PChar(Result),PChar(Result));
end;

function Dos2Win(const aStr: String): String;
begin
 Result := aStr;
 if Result <> '' then
   OemToChar(PChar(Result),PChar(Result));
end;

Отвечал: Panov


Anatoly Podgoretsky   (2004-12-17 00:27:00) [4]

CharToOem


Наверх

Титульная страница Поиск, карта сайта Написать письмо