Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2011, 03:30   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию Консоль + форма

Создаю ConsoleApplication. Далее File->New->Form.
код dpr файла:
Код:
program Project1;

{$APPTYPE CONSOLE}

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

var
 Str_source:string;
 i:integer;

begin
 SetConsoleTitle(PChar('Base Data'));
 repeat
 readln(Str_source);
 if pos('open',str_source)<>0 then
 begin

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
 end;
 until str_source='quit';
end.
код Unit1.pas файла:
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Free;
Application.Terminate;
end;
Действия:
1)В консоль прописываем: open.
2)Открывается форма.
3)Закрываем форму.
4)В консоль прописываем: open.
5)Открывается зависшая форма!!! (т.к. Application.terminated=True; )
Если идти через отладчик, то при 4 пункте открывается форма, но мы можем дальше продолжать движение по коду dpr файла, из-за terminated=true и Application.Terminated:=false не катит, даже если в модуле Forms на 1291 строке изменить это
Код:
property Terminated: Boolean read FTerminate;
на это:
Код:
property Terminated: Boolean read FTerminate write FTerminate;
.
Как быть, т.к. нужно будет открывать и закрывать форму по 10 раз.
Cоздавать форму динамически тоже не вариант, потому что на форме будет несколько компонентов, настройку которых осуществлять долго и муторно.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 23.02.2011 в 03:55.
Rin вне форума Ответить с цитированием
Старый 23.02.2011, 08:08   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

крутой изврат. Можно так:


Код:
program
  Project1;

{$APPTYPE CONSOLE}

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

type
  {*
    Pervert realization
  }
  myConsole = class(TPervert)
  protected
    function closeQuery(): boolean; override;
  end;

{ myConsole }

// --  --
function myConsole.closeQuery(): boolean;
var
  cmd: string;
begin
  Write('Form was closed, terminate application? [y/n]:');
  ReadLn(cmd);
  //
  if (1 = pos('y', LowerCase(cmd))) then
    //
    // application will be terminated
    //
    result := true
  else
    //
    // do what you need to do with console
    // when you exit from this routine with result = false, form will be shown again
    //
    result := false;
end;


// -- main --

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Form1.pervert := myConsole.create();
  Application.Run;
end.
Ну и сама форма:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  {*
    Pure pervert class
  }
  TPervert = class
  protected
    function closeQuery(): boolean; virtual; abstract;
  end;

  {*
    Doomed form
  }
  TForm1 = class(TForm)
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
    pervert: TPervert;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// --  --
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if (nil <> pervert) then begin
    //
    Hide();
    CanClose := pervert.closeQuery();
  end;
  //
  if (not canClose) then
    show();
end;

end.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.02.2011, 20:23   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Всё бы хорошо, только вот при закрытии формы, закрывается весь проект ((((
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 23.02.2011, 20:33   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

так и задумано

Или выходим из myConsole.closeQuery() c result = true, тогда закрывается форма и проект. Или выходим с result = false, тогда форма опять показывается на экране.

Вобще задача какая? Если нужно параллельно ещё что-то в консоле делать, можно поток запустить и делать себе потихоньку, пока форма висит на экране или ждёт решения своей судьбы внутри myConsole.closeQuery().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.02.2011, 21:24   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

задача такова. Открывается консоль и все задачи решаются в консоли:
поиск, отчёты и тд(работа с БД). При вводе "open" в консоли открывается\( показывается) форма , чтобы редактировать БД.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консоль Voliume Общие вопросы C/C++ 2 12.02.2010 19:48
Консоль Win Noor Свободное общение 5 20.12.2008 19:05
Консоль MAcK Общие вопросы Delphi 4 19.12.2007 19:05