![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Когда-то изучал Pascal, сейчас решил освоить Delphi. Использую рабочую среду Delphi 7 Enterprice Lite Edition.
В первую очередь решил освоить написание консольных приложений, а потом уже начать разбираться с формами. Возникли два вопроса (пока что два). Первый: как очищать экран? Второй: как сделать так, чтобы русский текст выводился не крякозябрами? Поискал в нете - нашёл несколько статей, говорящих о том. что в Delphi нет модуля, подобного паскалевскому Crt и поэтому нужно в каждой консольной программе писать процедуры, реализующие вышеперечисленные функции. Текст процедур в каждой статье разный, правда у меня они не компилируются. Вопрос: как решить перечисленные проблемы наиболее простым способом? |
|
#2
|
||||
|
||||
|
По поводу очистки консоли: легче всего просто поставлять пробелы. Вот пример:
Код:
uses Windows; procedure ClearConsoleWindow; var ConsoleHandle:THandle; ConsoleInfo: TConsoleScreenBufferInfo; Coord:TCoord; WrittenChars:DWORD; begin FillChar(ConsoleInfo,SizeOf(TConsoleScreenBufferInfo),0); FillChar(Coord,SizeOf(TCoord),0); ConsoleHandle:=GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(ConsoleHandle, ConsoleInfo); FillConsoleOutputCharacter(ConsoleHandle,' ', ConsoleInfo.dwSize.X * ConsoleInfo.dwSize.Y, Coord, WrittenChars); SetConsoleCursorPosition(ConsoleHandle,ConsoleInfo.dwCursorPosition) end; Код:
unit RUS;
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. |
|
#3
|
||||
|
||||
|
А что SetConsoleCP(1251) и SetConsoleOutputCP(1251) реальные пацаны уже не используют?
Последний раз редактировалось Страдалецъ, 27.11.2010 в 22:29. |
|
#4
|
||||
|
||||
|
Страдалецъ, хоть убей, но у меня это не работает(последний delphi xe), по этому русские буквы я делаю так:
Код:
function Rus(const S: AnsiString): AnsiString; // StrAnsiToOem
begin
SetLength(Result, Length(S));
AnsiToOemBuff(@S[1], @Result[1], Length(S));
end; |
|
#5
|
|||
|
|||
|
v1s2222, по поводу очистки экрана, приведённая вами процедура вроде работает. По поводу русских букв я так и не понял что из этого модуля надо использовать.
|
|
#6
|
||||
|
||||
|
Создай на компе в папке Делфи/Lib файл с именем "rus.pas".
После этого открой тот файл текстовым редактором, скопируй весь модуль туда (в файл), сохрани. После этого когда делаешь проект добавь в uses запись этого модуля так: Код:
... uses SysUtils, rus; ... |
|
#7
|
|||
|
|||
|
Всё равно не понимаю. Не понимаю, к чьему совету мне прислушаться. К SerginhoLD, который предлагает функцию всего из двух строк (я так понимаю мне тогда нужно будет вместо WriteLN(STRING1) писать WriteLN(Rus(STRING1)) или к v1s2222, который предлагает нагородить длиннющий модуль с пустой секцией interface, который я вообще не могу разобрать как он работает. И ещё какие-то SetConsoleCP(1251) и SetConsoleOutputCP(1251) тут упомянались.
|
|
#8
|
||||
|
||||
|
Для начала попробуйте выполнить вот такой код:
Код:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,Windows;
begin
SetConsoleOutputCP(1251);
WriteLn('Привет');
ReadLn;
end. |
|
#9
|
|||
|
|||
|
Крякозябры, однако
|
|
#10
|
||||
|
||||
|
Нашел тут статейку. Попробовал - работает.
Вот текст модуля. Его надо скомпилить и подключать к проекту. В коде вашего проекта ничего дополнительно менять не требуется. Код:
{
Модуль ”русификации” консольных приложений
(c) Eugene Kasnerik, 1999
e-mail: eugene1975@mail.ru
}
unit EsConsole;
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. |
|
#11
|
|||
|
|||
|
Каким образом это работает если в коде вашего проекта ничего дополнительно менять не требуется? Если WriteLN так и остаётся WriteLN.
|
|
#12
|
||||
|
||||
|
Цитата:
|
|
#13
|
|||
|
|||
|
Мне не получается сохранить эту штуку в Delphi7\Lib.
Говорит: "Error in module Unit1: Declaration of class TDataModule1 is missing or incorrect." |
|
#14
|
||||
|
||||
|
Это у вас на что-то другое ругается. Перезапустите дельфи и создайте новый юнит. Туда скопируйте весь текст и сохраните модуль с именем EsConsole.
Теперь уже можете загрузить свой проект и добавить в секцию uses имя модуля EsConsole |
|
#15
|
||||
|
||||
|
Я не чего против не имею конечно. Но СтрадальцЪ код модуля, который вы дали это и есть тот код, что описывал сначала
![]() |