Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Вопрос по ShowModal  (Прочитано 36357 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rockerok
Гость
« : 22-02-2008 07:40 » 

Вопрос такого плана:

Имеем 3 формы: главную, форму для выбора даты и рабочую форму!

Из главной формы вызываем форму с датой через "ShowModal"
После выбора месяца и года  - через опять через "ShowModal" вызываем Рабочую форму
После обработки данных на Рабочей форме или же при неверно выбранной дате - необходимо вернуться на форму с датой

Посоветуйте пожалуйста - как грамотно это сделать!!!

Может нужно открывать формы как-то иначе??? Работа идёт через SQL-запросы, активация которых происходит перед открытием определённой формы и деактивация посел отработки "ShowModal".

При вызове опять же формы с датой через "ShowModal" выскакивает ошибка!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 22-02-2008 07:56 » 

а вот так не подходит:

в главной форме
{
   форма_с_датой.ShowModal()

   рабочая_форма.ShowModal()

...

}

?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 22-02-2008 09:26 » 

Rockerok, сперва нужно создать объекты форм.
Предполагаю, что все формы у тебя в проекте занесены в список автоматически создаваемых. Только, если объект формы удалить, то он заново сам не создастся.
Короче - код в студию!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rockerok
Гость
« Ответ #3 : 25-02-2008 06:23 » 

Из главной формы вызываем по клику форму с датой!

procedure TF_bz_glav.N24Click(Sender: TObject);     
begin
Fm_dataMG.ShowModal ();
end;

ЗАТЕМ ИЗ ДАТЫ ВЫЗЫВАЕМ ЕЩЁ ОКНО!

procedure TFm_dataMG.BitBtn1Click(Sender: TObject);
begin
IF (Fm_dataMG.Tag=10) THEN             
 BEGIN
    DM_BZ.T_Sprav_benz.Active:=true;             // РАБОТА С ДАТА_МОДУЛЕМ активация таблицы
    Fm_Spravka.DBG_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;    // АКТИВАЦИЯ  ТАБЛИЦЫ  "DBGrid"
    Fm_Spravka.DBN_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;    // АКТИВАЦИЯ  ТАБЛИЦЫ  "DBNavigator"
    Fm_Spravka.ShowModal();
    DM_BZ.T_Sprav_benz.Active:=false;            // ДЕ-активация таблицы
  END;
END;

Теперь имеем окно  Fm_Spravka и из него нужно вызвать опять окно Fm_dataMG ??
при вызове из формы  Fm_Spravka следующего кода = выскакивает ошибка!


Fm_dataMG.ShowModal ();       // ОШИБКА = Cannot make a visible window modal.

если применить следующий код, окно появляется, но не активно!!! а мне надо выбрать на нём дату и плясать дальше от даты!!!

FM_DataMG.Show(); 

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 25-02-2008 10:51 » 

Дык... Вызов ShowModal блокирует окно до возврата. А ты пытаешься вызвать его еще раз.
По этому поводу прочти мой предыдущий пост! Надо создать новый объект!


Немного ликбеза...
В модуле формы ты описываешь класс. Там же редактор автоматически (в момент создания модуля) объявляет переменную-указатель с типом этого класса и заносит ее в проекте в список автоматически создаваемых форм. Т.е. при запуске приложения скрыто от тебя происходит создание объекта данного класса и присвоение указателя на него этой переменной. Вызывая ShowModal (или другим способом) ты просто делаешь окно, созданное этим объектом, видимым.
Тебе нужно в твоей форме с таблицей объявить еще один указатель нужного класса, а когда тебе понадобится вызвать этот диалог, тебе надо проделать след. процедуру: создать объект и присвоить указатель на него твоей переменной; вызвать ShowModal через этот указатель; по возвращении удалить объект.
« Последнее редактирование: 25-02-2008 13:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 25-02-2008 12:28 » 

Я считаю, что ты неверно построил логику программы. По крайней мере, так, как я ее понял по твоему описанию.

У меня для этого есть такое вот решение. Только оно на С++ для BuilderC++ 6.0 написано. При желании это легко конвертировать в Delphi.

Фрагмент файла Main.cpp (главная форма)
Код: (C++)
#include "DateSelect.h"

bool __fastcall TfrmMain::changeDate(TComponent *Owner, TDate &date)
{
    frmDateSelect = new TfrmDateSelect(Owner, date, true, false);
    frmDateSelect->ShowModal();
    if (frmDateSelect->bChanged)
    {
        date = frmDateSelect->date;
        delete frmDateSelect;
        return true;
    }
    delete frmDateSelect;
    return false;
}

Эту функцию я вызываю из любого места программы (естественно, сперва подключаю заголовок Main.h - в Delphi аналог - use), когда мне нужно вызвать деалог выбора/изменения даты, времени или обоих.


Файл DateSelect.h
Код: (C++)
//---------------------------------------------------------------------------

#ifndef DateSelectH
#define DateSelectH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>

#include "constants.h"

//---------------------------------------------------------------------------
class TfrmDateSelect : public TForm
{
__published:    // IDE-managed Components
    TDateTimePicker *DateTimePicker1;
    TDateTimePicker *DateTimePicker2;
    TButton *Button1;
    TButton *Button2;
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
public:         // User declarations
    bool bChanged;
    TDate date;
    TTime time;
    __fastcall TfrmDateSelect(TComponent* Owner, TDateTime datetime, bool bUseDate, bool bUseTime);
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmDateSelect *frmDateSelect;
//---------------------------------------------------------------------------
#endif

По этому файлу видно (хотя я не привел файл с формой), какие компоненты я использовал: два TDateTimePicker (один для даты, другой для времени) и две кнопки (OK и отмена).


Файл DateSelect.cpp
Код: (C++)
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "DateSelect.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmDateSelect *frmDateSelect;
//---------------------------------------------------------------------------
__fastcall TfrmDateSelect::TfrmDateSelect(TComponent* Owner, TDateTime datetime, bool bUseDate = true, bool bUseTime = false) : TForm(Owner)
{
    if (!bUseDate)
    {
        DateTimePicker1->Enabled = false;
        DateTimePicker1->Color = COLOR_DISABLED;
    }
    else
    {
        DateTimePicker1->DateTime = (datetime.Val == 0) ? TDateTime::CurrentDate() : floor(datetime);
    }

    if (!bUseTime)
    {
        DateTimePicker2->Enabled = false;
        DateTimePicker2->Color = COLOR_DISABLED;
    }
    else
    {
        DateTimePicker2->DateTime = (datetime.Val == 0) ? TDateTime::CurrentTime() : fmod(datetime, 1);
    }

    bChanged = false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmDateSelect::Button2Click(TObject *Sender)
{
    bChanged = false;
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmDateSelect::Button1Click(TObject *Sender)
{
    date = floor(DateTimePicker1->DateTime);
    time = fmod(DateTimePicker2->DateTime, 1);
    bChanged = true;
    Close();
}
//---------------------------------------------------------------------------

Тут описывать нечего - смотри код - он примитивен.


Файл constants.h
Код: (C++)
#define COLOR_ENABLED           clWindow
#define COLOR_DISABLED          clBtnFace

Этот файл чисто для удобства.

Кстати, обрати внимание: TfrmDateSelect *frmDateSelect; - это та самая переменная, которую создал редактор. У меня в проекте я не держу в списке автоматически создаваеммых форм (закладка Forms) никаких других, кроме главной, и создаю объекты динамически, когда они нужны.
« Последнее редактирование: 25-02-2008 12:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rockerok
Гость
« Ответ #6 : 26-02-2008 04:55 » 

RXL,
Хорошо, а как это отражается на производительности???
Не будет ли программа потом тормозить на довольно-таки слабых компах???

Кстати, а по поводу объектов, я не знал... просто нас так учили... Спасибо - буду разбираться!!!
Записан
Rockerok
Гость
« Ответ #7 : 26-02-2008 09:39 » 

RXL

Так... посидел, разобрался... Довольно грамотно, но не решает моих проблем!!!

Два TDateTimePicker (один для даты, другой для времени)  === это конечно хорошо и классно  Класс! , но!!! Мне нет нужды строго выбирать число - достаточно месяца, + в отдельных случаях необходимо выбирать только год.

Видимо, я не полностью привёл код и из-за этого возникли недоразумения.

форма даты у меня содержит следующий код (Delphi 7)
Paskal
Код:
unit U_dataMG;

interface

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

type
  TFm_dataMG = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
                // возможно парочка переменных лишняя - но разработка пока не закончена
var
  Fm_dataMG: TFm_dataMG;
  rab_god,rab_mes : Integer;
  DateTime : TDate;
  month,year,day : Word;
implementation

uses DateUtils, U_DM_BZ, U_Spravka, U_Putevka;

{$R *.dfm}

procedure TFm_dataMG.BitBtn1Click(Sender: TObject);       // кнопка ОК
begin
IF (Fm_dataMG.Tag=10) THEN             
  BEGIN
    Fm_dataMG.Tag:=2;
    DM_BZ.T_Sprav_benz.Active:=true;
                                              { активация через датамодуль  навигатора и таблицы для работы в [u]следующей[/u] форме!!! }
    Fm_Spravka.DBG_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;
    Fm_Spravka.DBN_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;
    DM_BZ.T_Sprav_benz.Active:=false;
    Fm_Spravka.ShowModal();
END;
    Fm_dataMG.Tag:=0;
end;

procedure TFm_dataMG.FormShow(Sender: TObject);                // событие на открытие формы
begin
DateTime :=Date;  // присвоение переменной тек.даты
DecodeDate(DateTime,year,month,day);
ComboBox2.Itemindex:=Year-2005;
ComboBox2.Text:=IntToStr(year);
if (Fm_dataMG.Tag=10) then Fm_dataMG.ComboBox1.Enabled:=false
else Fm_dataMG.ComboBox1.Enabled:=true;

end;

procedure TFm_dataMG.BitBtn2Click(Sender: TObject);                  // кнопка "отмена"
begin
Fm_dataMG.Tag:=0;
Fm_dataMG.Close;
end;

procedure TFm_dataMG.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);                                                          // а это отработка "горячей" клавиши
begin
if Shift = [] then begin
  case Key of
  VK_escape: Close();
  end;
end;
end;

end.

На "дочерней"  форме я уже анализирую выбор на формочке даты

Код:

procedure TFm_Putevka.Button1Click(Sender: TObject);
var
god_bz,kod_mes: String;
mes_bz1,mes_bz2: TDateTime;
kod_mash,kod_mash2,kod_mash3: String;
begin
    kod_mash:=Q_Putevka['km'];
    god_bz:='';
    god_bz:=Fm_dataMG.ComboBox2.Text;
    if (Fm_dataMG.ComboBox1.ItemIndex<10) then        // проверка на дату и год
      begin kod_mes:=('0'+IntToStr(Fm_dataMG.ComboBox1.ItemIndex+1));end
        else kod_mes:=IntToStr(Fm_dataMG.ComboBox1.ItemIndex+1);
    mes_bz1:=StrToDate('01.'+kod_mes+'.'+Fm_dataMG.ComboBox2.Text);
    if (Fm_dataMG.ComboBox1.ItemIndex=1) then
      begin
        if ((StrToInt(Fm_dataMG.ComboBox2.Text)mod 4)>0) then begin
            mes_bz2:=StrToDate('28.'+kod_mes+'.'+Fm_dataMG.ComboBox2.Text); end
        else mes_bz2:=StrToDate('29.'+kod_mes+'.'+Fm_dataMG.ComboBox2.Text);
      end
    else begin
          if (Fm_dataMG.ComboBox1.ItemIndex=(3 or 5 or 8 or 10)) then begin
              mes_bz2:=StrToDate('30.'+kod_mes+'.'+Fm_dataMG.ComboBox2.Text);
              end
            else mes_bz2:=StrToDate('31.'+kod_mes+'.'+Fm_dataMG.ComboBox2.Text);
         end;


Знаю, что запутанно и много лишнего, но пока что это всё что я умею - подскажите если что - как лучше!!!

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

а все формы у меня создаются сразу в проекте (причём автоматически...) и если форма даты используется по 1000 раз за день = зачем создавать её каждый раз???


Код:
program P_BZ;

uses
  Forms,
  U_bz_glav in 'U_bz_glav.pas' {F_bz_glav},
  U_pass in 'U_pass.pas' {PasswordDlg},
  U_Spravka in 'U_Spravka.pas' {Fm_Spravka},
  U_DM_BZ in 'U_DM_BZ.pas' {DM_BZ: TDataModule},
  U_dataMG in 'U_dataMG.pas' {Fm_dataMG},
  U_Putevka in 'U_Putevka.pas' {Fm_Putevka},
  U_Kalend in 'U_Kalend.pas' {Fm_Kalend},
  U_Qreport_wiz in 'U_Qreport_wiz.pas' {Fm_Qreport_wiz};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TPasswordDlg, PasswordDlg);
  Application.CreateForm(TF_bz_glav, F_bz_glav);
  Application.CreateForm(TFm_Spravka, Fm_Spravka);
  Application.CreateForm(TDM_BZ, DM_BZ);
  Application.CreateForm(TFm_dataMG, Fm_dataMG);
  Application.CreateForm(TFm_Putevka, Fm_Putevka);
  Application.CreateForm(TFm_Kalend, Fm_Kalend);
  Application.CreateForm(TFm_Qreport_wiz, Fm_Qreport_wiz);
  Application.Run;
end.


И всё-таки - как мне переключаться между формами... Не понял?

Дело в том, что я переделываю ДОСовское приложение, написанное на Clipper и не хотелось бы сильно шокировать пользователей. Поэтому подхожу окольными путями, стараясь перенести способы и методы работы и обработки данных без глобальных нововведений!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 26-02-2008 09:47 » 

Rockerok, модально выводимые диалоги не имеет смысла создавать заранее и 1000 раз потом использовать, создаётся объект модального диалога непосредственно перед открытием, потому что:
1)на скорости это не скажется, ибо модальный диалог предполагает ответ пользователя, поэтому заминка в микросекунду тут не заметна.
2) строить модальный диалог надо так, чтобы он не нёс в себе важной информации, он - всего лишь инструмент для диалога с пользователем. Туда можно передать копию изменяемых данных (лучше) или указатель на них (хуже) . В диалоге данные меняются, а после закрытия диалога программа решает, заменить исходные данные на введённые только что или нет. Всё, сам диалог - лишь окно с кнопками/окошками.


если у тебя запарки с использованием модальных диалогов, значит где то неправильная структура программы имеется...
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 26-02-2008 09:48 » 

а что имеется в виду - переключаться между формами ?
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 26-02-2008 09:53 » 

Я так понимаю, нужны немодальные диалоги? Улыбаюсь Rockerok, тебе ведь фокус ввода нужно переносить с одной формы на другую для чего-то? Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 26-02-2008 10:40 » 

Rockerok, если нужно иметь несколько окон и переключаться между ними, то смотри в сторону MDI - это хороший выход. Усложнение только в контроле, сколько окон одного типа может быть открыто, чтоб не запутаться в них.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #12 : 26-02-2008 10:55 » 

1.
Код:
begin
  Application.Initialize;
  Application.CreateForm(TPasswordDlg, PasswordDlg);
  Application.Run;
end.
2. Формы вызывай:
Код:
Fm_dataMG:=TFm_dataMG.Create(Application);
 Fm_dataMG.ShowModal;

 Fm_Spravka:=TFm_Spravka.Create(Application);
 Fm_Spravka.Show;
При вызове Fm_dataMG модально, а из Fm_dataMG Fm_Spravka немодально аолучишь возможность переключаться между формами, причем обе они будут работать модально относительно главной формы.
Записан
Rockerok
Гость
« Ответ #13 : 26-02-2008 10:58 » 

Rockerok, если нужно иметь несколько окон и переключаться между ними, то смотри в сторону MDI - это хороший выход. Усложнение только в контроле, сколько окон одного типа может быть открыто, чтоб не запутаться в них.

MDI = Это что?? Как..?? (будь любезен - подскажи где это и как использовать??))


zubr


Спасибо!!!
кстати... а после использования формы уничтожать? если так, то какой командой???
« Последнее редактирование: 26-02-2008 11:03 от Rockerok » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 26-02-2008 11:05 » 

MDI  это многодокументный интерфейс (каждый документ - в своём окне, все окна документов - дочерние для главного окна)
Записан

Rockerok
Гость
« Ответ #15 : 26-02-2008 12:08 » 

блин... работает, но не так как надо!

Дело в том, что  модальный вызов форм был вызван в связи с использованием запросов TQuery, которые перед командой Showmodal активизировались, а после её выполнения шла команда на их Деактивировались... терь нужно менять код...

 А может есть ещё способ?? Ведь по команде Show отрабатывается полностью весь код до конца блока...

Но всё-равно - СПАСИБО всем.
Кстати - всё-таки как уничтожать формы после их создания???
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 26-02-2008 13:40 » 

Rockerok, формы уничтожаются двумя способами: удалением объекта или в методе OnClose() установить аргумент Action в значение caFree.
Почитай эту тему: https://forum.shelek.ru/index.php/topic,12701.0.html

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #17 : 26-02-2008 18:01 » 

Можно так обмануть:
Код:
procedure TFm_dataMG.BitBtn1Click(Sender: TObject);       // кнопка ОК
begin
IF (Fm_dataMG.Tag=10) THEN             
  BEGIN
    Fm_dataMG.Tag:=2;
    DM_BZ.T_Sprav_benz.Active:=true;
                                              { активация через датамодуль  навигатора и таблицы для работы в [u]следующей[/u] форме!!! }
    Fm_Spravka.DBG_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;
    Fm_Spravka.DBN_Spravka.DataSource:=DM_BZ.DS_Sprav_benz;
    DM_BZ.T_Sprav_benz.Active:=false;
    Fm_Spravka.Show();
    While Fm_Spravka.Tag<>1 do
    Application.ProcessMessages;
END;
    Fm_dataMG.Tag:=0;
end;
Для формы Fm_Spravka в OnCreate ставишь Fm_Spravka.Tag:=0, а в OnClose Fm_Spravka.Tag:=1
Записан
Rockerok
Гость
« Ответ #18 : 28-02-2008 12:49 » 

Для формы Fm_Spravka в OnCreate ставишь Fm_Spravka.Tag:=0, а в OnClose Fm_Spravka.Tag:=1

Поправка...

При выставлении Для формы Fm_Spravka в OnCreate ставишь Fm_Spravka.Tag:=0 выскакивает ошибка

Project P_BZ.exe raised exception class EAccessViolation with message 'Access violation at address 004EFDC3 in module 'P_BZ.exe'. Write of address 0000000C. Process stopped. Use Step or Run to continue.


При отсутствии или же при выставлении  в OnShow - работает...

Я понял лишь что это нужно для условия
Код:
While Fm_Spravka.Tag<>1 do Application.ProcessMessages;

Строчка работает, но что она делает конкретно??
и надо ли вообще устанавливать  Fm_Spravka.Tag:=0 ??

RXL,

Rockerok, формы уничтожаются двумя способами: удалением объекта или в методе OnClose() установить аргумент Action в значение caFree.

Подумай о создании своего конструктора для формы - в него можно будет передать все, что тебе надо. Внутри формы выполнить запрос и по закрытию уничтожить чт надо.

Конструктор -  Хоть приблизительно - Как это??
« Последнее редактирование: 28-02-2008 13:54 от Rockerok » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #19 : 28-02-2008 17:20 » 

Rockerok, не знаю почему у тебя вылетает ошибка, похоже ты Fm_Spravka.Tag:=0 делаешь не в OnCreate формы TFm_Spravka , а в OnCreate другой формы, которая еще не создана. В моем примере установка Tag используется только для проверки условия пока форма открыта программа стоит на цикле, при этом Application.ProcessMessages позволяет форме пропускать сообщения Windows от других контролов. То есть с одной стороны мы как бы останавливаем выполнение процедуры аналогично модальной форме (пока модальная форма не закроется, процедура из которой она вызывается не завершится), а с другой стороны мы можем работать с формой из процедуры которой была вызвана "псевдомодальная" форма.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 28-02-2008 18:37 » 

Конструктор -  Хоть приблизительно - Как это??

Опа... А язык то ты знаешь?
В Delphi, как я понимаю, конструктор называется Create.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rockerok
Гость
« Ответ #21 : 29-02-2008 06:00 » 

RXL,

Знаю... вроде бы... Улыбаюсь

zubr,
Спасибо!
Записан
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 25-03-2008 13:14 » 

1.
Конструктор -  Хоть приблизительно - Как это??

Опа... А язык то ты знаешь?
В Delphi, как я понимаю, конструктор называется Create.

Мы можем или переопределить конструктор Create или описать новый конструктор с любым именем, добавив перед ним ключевое слово constructor (Марк Кэнту).
Матчасть надо учить, товарищ RXL.

2. Блин, Rockerok, почитай чегонибудь на досуге штоли (MSDN там, или вот есть такой Марк Кэнту, например, очень толково пишет, и видно что он делает это не только на дельфе).

3. Из личных наблюдений.
Такое длинное обсуждение мелкой проблемы происходит только среди дельфи-программистов, ибо они чаще всего не знают не только как устроена операционка, под которую они пишут, но и не знают особенности языка дельфи и реализации классов в нем. А также это от нежелания ЧИТАТЬ ЛИТЕРАТУРУ.

Это не наезд. Я сам иногда тоже пишу на дельфе. Но уже просто невозможно читать на дельфи-форумах вопросы про круглые кнопки и прочие мигающие надписи. Программеры на MSVS таких вопросов просто не задают, т.к. язык заставляет их знать устройство операционки, а литературой служит MSDN.
Записан

Good user - dead user
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 25-03-2008 15:31 » 

DrGluck, я не дельфист - я сишник-билдерист Ага Среда у них одна, т.ч. подсказываю по мере сил.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 26-03-2008 08:04 » 

RXL
Ну извини, но билдер это тоже дельфи, тока в профиль.

Все это не освобождает рокерка от необходимости читать документацию.
Записан

Good user - dead user
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #25 : 26-03-2008 15:46 » 

Такое длинное обсуждение мелкой проблемы происходит только среди дельфи-программистов, ибо они чаще всего не знают не только как устроена операционка, под которую они пишут, но и не знают особенности языка дельфи и реализации классов в нем. А также это от нежелания ЧИТАТЬ ЛИТЕРАТУРУ.

Это не наезд. Я сам иногда тоже пишу на дельфе. Но уже просто невозможно читать на дельфи-форумах вопросы про круглые кнопки и прочие мигающие надписи. Программеры на MSVS таких вопросов просто не задают, т.к. язык заставляет их знать устройство операционки, а литературой служит MSDN.
DrGluck, не согласен с тобой и MSVS-программисты задают подобные вопросы - все зависит от уровня. Просто чаще изучение программированию начинают с Delphi, поэтому колличество новичков дельфистов больше чем MS.
Записан
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 27-03-2008 05:24 » 

А вот сходи на форум MSVS и найди там какой-нибудь тупой вопрос.
Да, они там тоже встречаются, но НАСКОЛЬКО их меньше!

Просто любой пацан, которому преподают дельфи в учебном заведении после 5-го занятия начинает считать себя программером.
Потом он хочет "сделать крутой интерфейс", а как не - знает. Он сразу лезет на форум и начинает задавать вопросы. А там еще таких 513 собралось. И понеслась... "Как сделать овальную кнопку", "Мигающий Label" и т.д. А вопросы то элементарные. Даже в дельфовой справке есть. Но лень.

Disclaimer: Я щас не имел в виду товарища Rockerok. Просто задолбали уже...

А по вопросу, заданному Rockerok вроде все понятно.
Там же не 3 равноправных окна, а вложенность ГЛАВНОЕ ОКНО->ФОРМА ВЫБОРА ДАТЫ->РАБОЧАЯ ФОРМА. Если я правильно понял вопрос.
Так и надо сделать афтакриэйтом MainForm, а остальные создавать в рантайме. Форму с датой из под главного, а рабочую форму из под формы с датой. И вызывать всё через ShowModal. Там вроде ошибиться даже негде.

« Последнее редактирование: 27-03-2008 05:33 от DrGluck » Записан

Good user - dead user
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #27 : 27-03-2008 08:55 » 

Цитата
Из главной формы вызываем форму с датой через "ShowModal"
После выбора месяца и года  - через опять через "ShowModal" вызываем Рабочую форму
После обработки данных на Рабочей форме или же при неверно выбранной дате - необходимо вернуться на форму с датой
Почитай внимательно вопрос, особенно выделенную строчку, то есть человеку надо чтобы как бы 2 формы работали модально и при этом могли воспринимать сообщения. Другой вопрос, что задумку (обработка входных данных с использованием нескольких форм) можно реализовать другими способами. А теперь ответь как это сделать по сабжу, если:
Цитата
Форму с датой из под главного, а рабочую форму из под формы с датой. И вызывать всё через ShowModal
Записан
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 27-03-2008 12:31 » 

Вот еще раз перечитал вопрос. Может я чего не понимаю, но в том виде как он сформулирован, на рабочую форму мы всегда попадаем после выбора даты.
Значит есть два варианта:
1. В главной форме в одной процедуре последовательно создавать/вызывать/уничтожать сначала форму с датой, а затем рабочую форму.
2. В процедуре главной формы создавать форму с датой. А в процедуре формы с датой создавать рабочую форму.

Имхо, так. Я бы выбрал 1 вариант. Хотя в зависимости от задачи.

Или он хочет, чтобы было два окна, модальные по отношению к главному окну, с возможностью переключатся между ними? Только зачем это при такой постановке задачи  А черт его знает...

З.Ы.
О, подумалось, правильнее вызывать рабочее окно, а при его открытии создавать модальный диалог выбора даты. Тогда пусть рабочее окно само управляет данными и вызывает выбор даты повторно в случае неправильного ввода. Это зависит от структуры приложения.
Записан

Good user - dead user
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 27-03-2008 13:30 » 

DrGluck, тут задача изначально поставлена неверно. Я товарищу объяснял это и давал вариант решения. Если у тебя есть другой вариант - опиши его подробнее, пожалуйста.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rockerok
Гость
« Ответ #30 : 27-03-2008 14:23 » 

З.Ы.
О, подумалось, правильнее вызывать рабочее окно, а при его открытии создавать модальный диалог выбора даты. Тогда пусть рабочее окно само управляет данными и вызывает выбор даты повторно в случае неправильного ввода. Это зависит от структуры приложения.
Кстати, Это идея... Ага
Записан
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 28-03-2008 07:29 » 

2 RXL
Слу, может ты мне переформулируешь его задачу, а то я все посты прочитал, но нифига не понял чего надо сделать.
Имхо, два равноправных окна (рабочее и дата) там точно не нужны. Выбор даты - однозначно маленькое модальное окно, которое вызывается (создается) в другом окне (главном или рабочем). Там вроде и проблемы нет.
А если ему надо много документов одновременно открывать, то тогда MDI или нет. Это уже решать в зависимости от удобства.
Но, повторяю, при всех условиях, окно с датой должно создаваться только на время выбора даты.

Я бы сделал примерно так:

Код:
unit u_MyDateForm;

interface

юзес
  Вындовз, Классес, Мессагес, СысУтилз и чо там еще  :)

type
  TMyDate = record  // вот тока не надо спрашивать, нахрена я создал свою структуру, описывающую дату, просто так нагляднее
    Year: BYTE;
    Month: BYTE;
    Day: BYTE;
  end;

  TMyDateForm = class(TForm)  // Класс формы с выбором даты
     бла бла бла контролы
    ......
  public
    procedure SetDate(Date: TMyDate); // Процедура будет разбираться с переданой на форму датой и инициализировать контролы
    // в соответствии с этим
    function GetDate: TMyDate;  // Функция будет возвращать дату, выбранную пользователем
  end;

  // А вот это самое главное: из других форм будем вызывать только эту функцию
  // Делать это можно из разных форм
  // Параметры:
  // Date - дата для инициализации
  // OwnerForm - форма-родитель
  // Функция возвращает выбранную дату
  function ChooseDateTime(Date: TMyDate; OwnerForm: TForm): TMyDate;


implementation

{$R *.DFM}

function ChooseDateTime(Date: TMyDate; OwnerForm: TForm): TMyDate;
var
  _Form: TMyDateForm;
begin
  _Form := TMyDateForm.Create(OwnerForm);
  if not(Assigned(_Form)) then х.з. чо делать, форма не создалась
  try
    _Form.SetDate(Date);  // Процедура разбирается в структуре Date и инициализирует контролы на форме
    _Form.ShowModal;  // Показываем форму
    Result := _Form.GetDate;  // Вызываем процедуру, которая собирает данные с контролов обратно в структуру
  finally
    _Form.Free;  // не забыть почистить за собой
  end;
end;

Вот примерно так. Это только форма с датой.
По поводу проверки на создание формы. Ну не знаю, я ни разу не сталкивался с тем, что простая форма не создалась. Но проверка на не nil перед употреблением является хорошим тоном.
Больно за код не бейте, писал в текстовом редакторе. Может чо не так. Но идея понятна.
Записан

Good user - dead user
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 28-03-2008 20:11 » 

DrGluck, я так понимаю, что выбор даты вторичен, а первична рабочая форма. Соотв., я посчитал, что модальный вызов диалога выбора даты будет оптимальным. Тем более, что такую задачу я уже решал. Я привел рабочий код, который можно вызывать из разных окон по многу раз.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 31-03-2008 04:22 » 

Ну дык и я об этом. Примерно так.
Ну, пусть выбирает. Ему всё показали и рассказали.

З.Ы. А чо, у меня непонятно что то написано? Я ему пытался показать как можно модальные окна выводить. А разбор даты я вообще вопросом не считаю. Там вроде проблем нету.
« Последнее редактирование: 31-03-2008 04:48 от DrGluck » Записан

Good user - dead user
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 31-03-2008 11:43 » 

DrGluck, все путем Улыбаюсь Будут у него вопросы - тогда и будем репы чесать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 01-04-2008 04:48 » 

mrOk  Да-да
« Последнее редактирование: 01-04-2008 04:52 от DrGluck » Записан

Good user - dead user
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines