![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Я не чего против не имею конечно. Но СтрадальцЪ код модуля, который вы дали это и есть тот код, что описывал сначала
![]() Помогаю за Спасибо ![]() |