Главная страница
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.08 c
6-1116403255
yk
2005-05-18 12:00
2005.09.04
Сколько пингов можно запустить одновременнно ?


3-1122058027
serguncho
2005-07-22 22:47
2005.09.04
SQL-запрос для выборки данных


8-1114267723
COOLer
2005-04-23 18:48
2005.09.04
Ох уж этот TImage


1-1123825926
Strelets
2005-08-12 09:52
2005.09.04
Анализ символьной строки


9-1114880042
Comrade
2005-04-30 20:54
2005.09.04
Про тему "Забабахать игру"