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

Вниз

Вывод текста в консольном приложении   Найти похожие ветки 

 
BJValentine   (2005-08-15 13:14) [0]

Как вывести русский текст на консоль чтобы он выглядел нормально, а не абракадаброй? Спасибо.


 
alex_***   (2005-08-15 13:35) [1]

OemToChar или CharToOem


 
BJValentine   (2005-08-15 14:08) [2]

А так чтобы не использовать эти фунуции, там не знаю, ну ключ какой-то во WriteLn есть?


 
alex_***   (2005-08-15 14:10) [3]

есть секреная комбинация клавиш.... вышлю за 5$


 
GLFox ©   (2005-08-15 14:11) [4]

Смотри функцию SetConsoleOutputCP


 
GLFox ©   (2005-08-15 14:17) [5]

А чтобы работало не только под Win NT, то ситуацию надо изменить в свою пользу.
Известно, что Write/WriteLn без указания файла осуществляет вывод в файл Output. Output имеет тип TextFile, он же TTextRec, содержимое которого описано в SysUtils.pas. Есть там и поля, содержащие адреса процедур, в которые приходит на обработку поток выводимых приложением данных (в случае вывода). Не вдаваясь в подробности (посмотреть устройство механизмов вывода можно в исходниках RTL), посмотрим, что происходит в процедуре,
отвечающей за вывод (TTextRec.InOutFunc):
{ Реконструкция TextOut из Assign.asm }
function TextOut(var Text: TTextRec): Integer;
var
 Dummy: Cardinal;
 SavePos: Integer;
begin
 SavePos := Text.BufPos;
 if SavePos > 0 then begin
   Text.BufPos := 0;
   if WriteFile(Text.Handle, Text.BufPtr^, SavePos, Dummy, nil) then
     Result := 0
   else Result := GetLastError;
 end else Result := 0;
end;

Теперь видно, что нужно сделать для вывода символов в нужной кодовой таблице - перед выводом в файл средствами ОС модифицировать данные в выходном буфере структуры Text, вписав следующую строку:
CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos);
Модифицировать буфер можно, т.к. после операции записи в файл содержимое буфера фактически сбрасывается (когда в Text.BufPos записывается 0 - именно столько актуальных данных остается в буфере). Если не завязываться на эту особенность реализации, можно распределить буфер и модифицировать данные уже в нем. Впрочем, решение в любом случае достаточно сильно опирается на
особенности реализации, поэтому проверить его пригодность при смене версии Delphi рекомендуется в любом случае. С другой стороны, вероятность отхода Borland от наработанного решения крайне мала.

Эту инфу я нашел где-то, по-моему, в статье Евгения Каснерика.
P.S. STFW


 
Leonid Troyanovsky ©   (2005-08-15 14:28) [6]


> GLFox ©   (15.08.05 14:17) [5]

> CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos);


Зачем все эти приседания:


 CharToOem(Pointer(s), Pointer(s));
 writeln(s);


--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
4-1121454024
TDionis
2005-07-15 23:00
2005.09.04
wm_destroy VS "Черви"


2-1123225744
Гость22
2005-08-05 11:09
2005.09.04
Простой вопрос.


14-1123830712
Hawk2
2005-08-12 11:11
2005.09.04
ATI RADEON 9550


6-1116419110
Hereticsoul
2005-05-18 16:25
2005.09.04
Tidtcpclient и пример из Indy


14-1123507028
lookin
2005-08-08 17:17
2005.09.04
Неприятная история с пропажей монитора