Главная страница
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.046 c
1-1103056989
Kolan
2004-12-14 23:43
2004.12.26
Чё то я забыл как из типизированного файла считать.


1-1102524115
Костя
2004-12-08 19:41
2004.12.26
чтение файла


1-1102871992
Илья
2004-12-12 20:19
2004.12.26
Как записать N-нное кол-во нулевых байт в файл


4-1100180548
sirsergio
2004-11-11 16:42
2004.12.26
OnKeyPress и сообщения


14-1102332804
Чеширский Кот из Гондураса
2004-12-06 14:33
2004.12.26
Песни, посвященные Новому Году