Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2010, 16:53
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию Создание консольных приложений для начинающих

Когда-то изучал Pascal, сейчас решил освоить Delphi. Использую рабочую среду Delphi 7 Enterprice Lite Edition.
В первую очередь решил освоить написание консольных приложений, а потом уже начать разбираться с формами.
Возникли два вопроса (пока что два). Первый: как очищать экран? Второй: как сделать так, чтобы русский текст выводился не крякозябрами? Поискал в нете - нашёл несколько статей, говорящих о том. что в Delphi нет модуля, подобного паскалевскому Crt и поэтому нужно в каждой консольной программе писать процедуры, реализующие вышеперечисленные функции. Текст процедур в каждой статье разный, правда у меня они не компилируются.
Вопрос: как решить перечисленные проблемы наиболее простым способом?
Ответить с цитированием
  #2  
Старый 27.11.2010, 16:59
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

По поводу очистки консоли: легче всего просто поставлять пробелы. Вот пример:
Код:
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  
Старый 27.11.2010, 22:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А что SetConsoleCP(1251) и SetConsoleOutputCP(1251) реальные пацаны уже не используют?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 27.11.2010 в 22:29.
Ответить с цитированием
  #4  
Старый 28.11.2010, 01:08
Аватар для SerginhoLD
SerginhoLD SerginhoLD вне форума
Новичок
 
Регистрация: 19.11.2009
Сообщения: 73
Репутация: 12
По умолчанию

Страдалецъ, хоть убей, но у меня это не работает(последний delphi xe), по этому русские буквы я делаю так:
Код:
function Rus(const S: AnsiString): AnsiString;  // StrAnsiToOem
  begin
    SetLength(Result, Length(S));
    AnsiToOemBuff(@S[1], @Result[1], Length(S));
  end;
__________________
знаете почему внизу эскалатора бабка в будке сидит?
она там педальки крутит и лесенка едет!
Ответить с цитированием
  #5  
Старый 28.11.2010, 04:52
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

v1s2222, по поводу очистки экрана, приведённая вами процедура вроде работает. По поводу русских букв я так и не понял что из этого модуля надо использовать.
Ответить с цитированием
  #6  
Старый 28.11.2010, 10:00
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Создай на компе в папке Делфи/Lib файл с именем "rus.pas".
После этого открой тот файл текстовым редактором, скопируй весь модуль туда (в файл), сохрани.
После этого когда делаешь проект добавь в uses запись этого модуля так:
Код:
...
uses
  SysUtils, rus;
...
И после этого все русские символы будут выводиться правильно.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #7  
Старый 28.11.2010, 15:27
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Всё равно не понимаю. Не понимаю, к чьему совету мне прислушаться. К SerginhoLD, который предлагает функцию всего из двух строк (я так понимаю мне тогда нужно будет вместо WriteLN(STRING1) писать WriteLN(Rus(STRING1)) или к v1s2222, который предлагает нагородить длиннющий модуль с пустой секцией interface, который я вообще не могу разобрать как он работает. И ещё какие-то SetConsoleCP(1251) и SetConsoleOutputCP(1251) тут упомянались.
Ответить с цитированием
  #8  
Старый 28.11.2010, 15:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для начала попробуйте выполнить вот такой код:

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows;

begin
 SetConsoleOutputCP(1251);
 WriteLn('Привет');
 ReadLn;
end.
Если в консольке вывод будет по русски, то вам и этого хватит.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 28.11.2010, 16:04
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Крякозябры, однако
Ответить с цитированием
  #10  
Старый 28.11.2010, 16:45
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Нашел тут статейку. Попробовал - работает.
Вот текст модуля. Его надо скомпилить и подключать к проекту. В коде вашего проекта ничего дополнительно менять не требуется.
Код:
{
Модуль ”русификации” консольных приложений
(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  
Старый 28.11.2010, 16:50
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Каким образом это работает если в коде вашего проекта ничего дополнительно менять не требуется? Если WriteLN так и остаётся WriteLN.
Ответить с цитированием
  #12  
Старый 28.11.2010, 17:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Iskatel_S
Каким образом это работает если в коде вашего проекта ничего дополнительно менять не требуется? Если WriteLN так и остаётся WriteLN.
Там происходит подмена текста который выводится в консоль текстом пропущенным через функцию CharToOEM. А WriteLn не напрямую пишет в консоль, а делает это через специальную структуру с которой собственно этот модуль и работает.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 28.11.2010, 17:03
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Мне не получается сохранить эту штуку в Delphi7\Lib.
Говорит: "Error in module Unit1: Declaration of class TDataModule1 is missing or incorrect."
Ответить с цитированием
  #14  
Старый 28.11.2010, 17:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Это у вас на что-то другое ругается. Перезапустите дельфи и создайте новый юнит. Туда скопируйте весь текст и сохраните модуль с именем EsConsole.
Теперь уже можете загрузить свой проект и добавить в секцию uses имя модуля EsConsole
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 28.11.2010, 17:19
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Я не чего против не имею конечно. Но СтрадальцЪ код модуля, который вы дали это и есть тот код, что описывал сначала
__________________
Помогаю за Спасибо
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025