Текущий архив: 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.45 MB
Время: 0.011 c