![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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}