Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Русский текст в консольном приложении. [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо