![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Русский текст в консольном приложении. [D7, XP]
Б © (2009-09-17 11:16:00)Как в консольном приложении (New -> Other -> Consolle Application)
Writeln'ом вывести русский текст?
Вячеслав.К (2009-09-17 18:37:00) [1]
> Б (17.09.09 11:16)
{
Модуль “русификации“ консольных приложений
(c) Eugene Kasnerik, 1999
e-mail: eugene1975@mail.ru
}
unit RuConsole;
interface
implementation
uses
Windows;
{
Описание структуры приведено здесь с единственной целью –
не подключать SysUtils и, соответственно, код инициализации
этого модуля. Консольные приложения обычно малы и 25К кода
обработки исключений – несколько высокая плата за описание
единственной структуры.
}
type
TTextRec = record
Handle: Integer;
Mode: Integer;
BufSize: Cardinal;
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
name: array[0..259] of Char;
Buffer: array[0..127] of Char;
end;
function ConOutFunc(var Text: TTextRec): Integer;
var
Dummy: Cardinal;
SavePos: Integer;
begin
SavePos := Text.BufPos;
if SavePos > 0 then
begin
Text.BufPos := 0;
CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos);
if WriteFile(Text.Handle, Text.BufPtr^, SavePos, Dummy, nil) then
Result := 0
else
Result := GetLastError;
end
else
Result := 0;
end;
initialization
Rewrite(Output); // Проводим инициализацию файла
{ И подменяем обработчики. Есть в этом что-то от
хака, но цель оправдывает средства }
TTextRec(Output).InOutFunc := @ConOutFunc;
TTextRec(Output).FlushFunc := @ConOutFunc;
end.
Б (2009-09-17 16:16:00) [2]Ладно. Вопрос закрыт.
КИрей (2009-09-17 16:10:00) [3]cmd /a?
sniknik (2009-09-17 16:01:00) [4]> или шрифт в редакторе смени.
+1
для "доса" и писать нужно в "досе".
Inovet (2009-09-17 15:00:00) [5]> [10] Inovet © (17.09.09 14:18)
Ещё строки с cp866 можно например в FAR редактировать не закрывая файл в IDE.
Anatoly Podgoretsky (2009-09-17 14:42:00) [6]> Сергей М. (17.09.2009 14:14:09) [9]
Не надо в лоб, как ты будешь в лоб решать n:w:d и подобное.
Inovet (2009-09-17 14:18:00) [7]> [7] Б (17.09.09 13:59)
Исходник отконвертируй 1251->866 или плагин какой, чтоб перед компиляцией конвертировал, или шрифт в редакторе смени.
Сергей М. (2009-09-17 14:14:00) [8]
> Как описать непонятно
А никак.
Это compiler magic)
Но можно "в лоб", примерно так:
WritelnEx(Values: array of Const);
var
i: Integer;
begin
for i := 0 to Length(Values) - 1 do
Write(Values[i]);
WriteLn;
end;
Игорь Шевченко (2009-09-17 14:09:00) [9]
> А как же описать в обёртке параметры идущие за текстом,
> как в Write/Writeln?
а никак
Б (2009-09-17 13:59:00) [10]Реши написать под неё обёртку, чтобы какждый раз не транслировать текст:
Procedure WritelnEx(const Str: string);
begin
Writeln(StrToRus(Str));
End;
Procedure WritelnEx2(const Str: string, (* ??? *)); // ???
begin
Writeln(StrToRus(Str), 3);
End;
А как же описать в обёртке параметры идущие за текстом, как в Write/Writeln?
procedure WriteLn([ var F: Text; ] P1 [, P2, ...,Pn ] ); - Как описать непонятно.
Б (2009-09-17 13:49:00) [11]{RASkov}
Спасибо!
{RASkov} (2009-09-17 13:28:00) [12]
program Project1;
{$APPTYPE CONSOLE}
uses Windows;
function StrToRus(const AStr: String): String;
begin
Result:='';
if Length(AStr)>0 then begin
SetLength(Result, Length(AStr));
CharToOem(PChar(AStr), PChar(Result));
end;
end;
begin
Writeln(StrToRus('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧЩШЫЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчщшъ ыьэюя'));
Readln;
end.
Anatoly Podgoretsky (2009-09-17 12:31:00) [13]> Б (17.09.2009 11:16:00) [0]
CHCP
jack128_ (2009-09-17 11:30:00) [14]AnsiToOem + F1
Б (2009-09-17 11:29:00) [15]Не понял.
Медвежонок Пятачок (2009-09-17 11:23:00) [16]для консоли русский это cp866