Главная страница
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.046 c
14-1123583153
root
2005-08-09 14:25
2005.09.04
УРА У меня сеня праздник!!!!


2-1063442253
Максимка
2003-09-13 12:37
2005.09.04
С чего начать, мастера, дайте совет!!!


1-1123968257
Конф
2005-08-14 01:24
2005.09.04
Как рисовать белым на прозначном TImage ?


4-1121604685
FRick
2005-07-17 16:51
2005.09.04
GUID видеокарты


6-1116526379
radium
2005-05-19 22:12
2005.09.04
Одновременное записывание/считывание данных в сокет