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

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

Console


Gu ©   (2011-08-28 20:26:00) 

По умолчанию в прогах {$APPTYPE} равно GUI и значение не отображается в *.dpr (для консольных {$APPTYPE CONSOLE}). Вопрос: как узнать в конструкции {$IFDEF...$ENDIF} что тип приложения консольный?

Т.е.

{$IFDEF CONSOLE}
..
{$ENDIF}
не отрабатывает.

Есть глобальная IsConsole но это не то, надо чтобы условие отрабатывало на этапе добавления модулей в uses.


DVM   (2011-08-29 17:31:00) [1]


> Gu   (29.08.11 11:05) [12]
>
> > Медвежонок Пятачок
> спрашивал: как в модулях проекта узнать, что в проекте объявлено
> {$APPTYPE CONSOLE}

Заведи свою директиву в своем inc файле и вставь его в нужные модули. Самое правильное.
Во время работы же наличие консоли можно проверить.


Юрий Зотов   (2011-08-29 17:12:00) [2]

Кстати, IsConsole еще тоже ни о чем не говорит. Например, в приведенной выше программе она дает False, хотя консоль есть.


Inovet   (2011-08-29 12:55:00) [3]

> [17] Anatoly Podgoretsky ©   (29.08.11 12:47)
> Сомневаюсь однако, что он пишет эксперта

Видимо, "на этапе добавления модулей в uses" следует читать "Во время компиляции".:)


Anatoly Podgoretsky   (2011-08-29 12:47:00) [4]


> Inovet ©   (29.08.11 12:19) [16]

А

Сомневаюсь однако, что он пишет эксперта


Inovet   (2011-08-29 12:19:00) [5]

> [15] Anatoly Podgoretsky ©   (29.08.11 12:03)
> IsConsole variable


> [0] Gu   (28.08.11 20:26)
> Есть глобальная IsConsole но это не то, надо чтобы условие
> отрабатывало на этапе добавления модулей в uses.


Anatoly Podgoretsky   (2011-08-29 12:03:00) [6]

> Gu  (29.08.2011 11:05:12)  [12]

Что же ты не умеешь пользоваться справкой

IsConsole variable


Юрий Зотов   (2011-08-29 11:18:00) [7]


> Gu   (29.08.11 11:05) [12]

Я писал все это, чтобы показать, что наличие (как и отстутствие) директивы {$APPTYPE CONSOLE} еще ни о чем не говорит. Поэтому ориентироваться на нее нельзя.

А раз ориентироваться на нее все равно нельзя, то проще и надежнее объявить свою директиву.


Медвежонок Пятачок   (2011-08-29 11:12:00) [8]

какая разница?
в трех модулях апптайп консоль.
в других трех гуи.

какой будет правильный ответ?


Gu   (2011-08-29 11:05:00) [9]


> Медвежонок Пятачок

нет, это только ваши догадки. интересует только то, о чем спрашивал: как в модулях проекта узнать, что в проекте объявлено {$APPTYPE CONSOLE}


Медвежонок Пятачок   (2011-08-29 09:19:00) [10]

походу его не то интересует, о чем он говорит.
у него при writeln временами недопустимая операция вылетает, хотя приложение выглядит как консольное.


Юрий Зотов   (2011-08-29 05:42:00) [11]

Вот, например, программа, в которой есть и форма, и консоль (причем без всяких директив).

К какому типу она относится? А шут ее знает.

program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

------------------------------------------------------------------------------

unit Unit1;

interface

uses
 Windows, Classes, Controls, Forms, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Button2: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FormStyle := fsStayOnTop;
 AllocConsole
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeConsole
end;

procedure TForm1.Button1Click(Sender: TObject); // Чтение с консоли
var
 S: string;
begin
 Write('>> Type something and press Enter: ');
 ReadLn(S);
 Edit1.Text := S
end;

procedure TForm1.Button2Click(Sender: TObject); // Вывод на консоль
begin
 WriteLn(Edit1.Text)
end;

end.


Юрий Зотов   (2011-08-29 05:16:00) [12]

Дополнение:
4. Консоль можно создать и показать без всяких директив.


Юрий Зотов   (2011-08-29 05:13:00) [13]


> Gu   (29.08.11 02:08) [7]

Только учтите, вот что:

1. Программа может быть и не GUI, и не консольная. Например:
project project1;
 // В проекте НЕТ директивы {$APPTYPE CONSOLE}
uses
 Windows;
begin
 // Здесь делаем что-то "невидимое" (например, копируем файл)
end.


2. И в консольной программе никто не мешает создавать и показывать формы.

3. И в GUI программе никто не мешает создать и показать консоль.

=============================

Поэтому деление программ на GUI и консольные довольно-таки условное.


Gu   (2011-08-29 02:08:00) [14]

ясно


Германн   (2011-08-29 00:23:00) [15]


> Gu   (29.08.11 00:14) [5]
>
> это я уже открыл.

Этого более чем достаточно.


Gu   (2011-08-29 00:14:00) [16]

это я уже открыл. я к тому что может что то по умолчанию еще при этом объявляется (при {$APPTYPE CONSOLE})


Игорь Шевченко   (2011-08-28 22:21:00) [17]

Откройте для себя Conditional defines в опиях проекта


Gu   (2011-08-28 21:32:00) [18]

смысл какой - есть модуль, где в зависимости от типа приложения используется разный набор модулей. Подключается он в файле dpr первым в uses. При консольном приложение дельфя автоматом добавляет в начало dpr {$APPTYPE CONSOLE}, вот как, чтобы не объявлять самому больше ничего типа {$DEFINE CONSOLE} и не лазия в модуль - определять, консоль или гуи сейчас компилится и соответствено в модуле подключать то что нужно.  

т.е. объявляется ли после объявления {$APPTYPE CONSOLE} какая нибудь глоальная XXX

чтобы отрабатывало

Uses
Module1,Module2,
{$DEFINE XXX}
Module3,
{$ENDIF}
ModuleN;


Gu   (2011-08-28 21:20:00) [19]

не, это мы заранее объявляем DEFINE CONSOLE. а нет ли какойто дерективы глобальной, чтобы при консольном приложении она уже была объявлена после применения {$APPTYPE CONSOLE} ?

т.е. {$IFDEF CONSOLE} это я для примера написал, на самом деле оно не работает, потому что CONSOLE не объявлен.


QAZ   (2011-08-28 21:05:00) [20]

{$DEFINE CONSOLE}
...
{$IFDEF CONSOLE}
{$APPTYPE CONSOLE}
{$ENDIF}
...
{$IFDEF CONSOLE}
...
{$ENDIF}


Наверх

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