Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Радикальное решение.   Найти похожие ветки 

 
DiamondShark ©   (2004-12-09 14:09) [0]

Субж вопросов типа: "А почему у меня в консоли кракозябры и как с ними бороться".


unit conio;

interface

implementation

uses
 Windows;

// To avoid importing SysUtils
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.


Для побеждения кракозябров просто прописать первым в uses проекта.


 
}|{yk ©   (2004-12-09 15:38) [1]

А CP866-U это сработает?


 
DiamondShark ©   (2004-12-09 16:04) [2]


> }|{yk ©   (09.12.04 15:38) [1]
> А CP866-U это сработает?

Если именно она в твоей ОС страница OEM, то да.


 
jack128 ©   (2004-12-09 17:02) [3]

не мог ты прояснить, чем отличаются TTextRec.BufPos от BufEnd? У меня получалось, что они всегда равны


 
DiamondShark ©   (2004-12-09 17:24) [4]


> jack128 ©   (09.12.04 17:02) [3]

BufPos -- текущая позиция в буфере внутри write/writeln.
BufEnd -- текущая позиция буфере внутри драйвера.
Т.е. BufPos -- входной параметр драйвера, BufEnd -- выходной.

А то, что они равны -- побочный эффект внутренней реализации write/read и нас не трогает.



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-1102416695
vajo
2004-12-07 13:51
2004.12.26
12 декабря - Праздник? Т.Е. 13 декабря - Выходной?


1-1102737612
Dema-X
2004-12-11 07:00
2004.12.26
XPManifest как применить свою тему?


8-1096175195
Mitay
2004-09-26 09:06
2004.12.26
Как определить частоту?


14-1101230112
alex145
2004-11-23 20:15
2004.12.26
Visual Studio


3-1101366224
DuchmanSoft
2004-11-25 10:03
2004.12.26
Групировка в DBChart