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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2008, 20:00   #1
a1ias
 
Регистрация: 13.11.2008
Сообщений: 9
По умолчанию Проблема при использовании модальной формы

Есть 2 формы с кнопокой на каждой форме. При нажатии на кнопку на первой форме - всплывает модальная форма.
При нажатии на кнопку на модальной форме - форма закрывается, происходит обработка информации(цикл с предусловием, с глобальной переменной u)
и при необходимом условии должна опять возникнуть модальная форма
после нажатия кнопки на ней -должна опять выполняется та же процедура, но уже с текущего значения u.

Проблема в следующем... цикл отрабатывается, модальная форма по идее закрыта, но первая форма никаким образом не активна.
a1ias вне форума Ответить с цитированием
Старый 13.11.2008, 21:37   #2
creator32
Пользователь
 
Регистрация: 13.11.2008
Сообщений: 18
По умолчанию

Насколько я понял. Проблема в том, что вы модальную форму не закрываете методом Close, а скрываете методом Hide либо Visible:=false; Так вот, надо пользоваться методом Close, что бы управление возвращалось "главной" форме.
creator32 вне форума Ответить с цитированием
Старый 13.11.2008, 23:06   #3
MalexG
Форумчанин
 
Регистрация: 06.11.2008
Сообщений: 100
По умолчанию

У модальной формы есть такое свойство, как ModalResult=(mrNone, mrOk, mrCancel и др.). Это же свойство имеется у любой кнопки, расположенной на модальной форме. По умолчанию оно равно mrNone (т.е. 0). Если кнопке присвоить любое значение, отличное от mrNone, форма будет закрываться автоматически (и не нужно писать Close). Теперь при щелчке на кнопке вы можете выполнять какие-либо действия. Если по условию вам требуется оставить форму открытой, установите свойство ModalResult := mrNone. Тем самым вы запрещаете форме закрываться, а ваша переменная цикла сохранит свое значение.
MalexG вне форума Ответить с цитированием
Старый 13.11.2008, 23:29   #4
a1ias
 
Регистрация: 13.11.2008
Сообщений: 9
По умолчанию

Использовал различные способы закрытия модальной формы -
form2.close или form2.free
В первом случае главная форма в итоге имеет фокус, но, если перетаскивать формы - то происходит, как бы, дублирование форм.

Во втором случае у главной формы нет фокуса.

Может плохо отследил за созданием модальной формы.

В следующем посте выкладываю код на обзор и указание мест ошибок.

Есть некая величина к(начальное значение,k=10, на нулевой период). Есть 5 периодов. каждый период из k вычитается некая величина A[j], где j - номер периода.
И если к<3,то должно создаться модальное окно и при нажатии на кнопку в этом окне оно должно закрыться,к k должно прибавиться k:=k+10. и цикл дожен продолжиться.


Вот такая суть.
a1ias вне форума Ответить с цитированием
Старый 13.11.2008, 23:31   #5
a1ias
 
Регистрация: 13.11.2008
Сообщений: 9
По умолчанию

а вот и код:
(пока не особо разбираюсь в этикете форума, поэтому высылаю в посте. если надо будет -выложу тхт-файлом)

Код:
 
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
var u,n,k:integer;
A:array of integer;

implementation

uses Unit2;



{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    form2:=Tform2.Create(Application);
    form2.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    u:=1;
    n:=5;
    k:=0;
    setLength(A,n);
    A[0]:=3;
    A[1]:=5;
    A[2]:=8;
    A[3]:=9;
    A[4]:=1;
end;

end.
Код:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;
{$R *.dfm}


procedure proschet();
begin
    while u<n+1 do
    begin
        form1.Button1.Caption:=form1.Button1.Caption+inttostr(k)+' ; ';
        k:=k-A[u-1];
        u:=u+1;

        if (k<3) and (u<n) then
        begin
            form2:=TForm2.Create(Application);
            form2.ShowModal;
        end;

    end;
end;



procedure TForm2.Button1Click(Sender: TObject);
begin
    k:=k+10;
    {form2.ModalResult:=mrOk;
    form2.Close;  }
    form2.Free;
    proschet();
end;

end.

Заранее спасибо за комментарии
a1ias вне форума Ответить с цитированием
Старый 13.11.2008, 23:40   #6
a1ias
 
Регистрация: 13.11.2008
Сообщений: 9
По умолчанию

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

Вот скрин:
Изображения
Тип файла: jpg dubl.jpg (12.7 Кб, 126 просмотров)
a1ias вне форума Ответить с цитированием
Старый 14.11.2008, 01:00   #7
MalexG
Форумчанин
 
Регистрация: 06.11.2008
Сообщений: 100
По умолчанию

Ваша проблема в том, что вы дважды создаете экземпляр формы TForm2 (один раз из основной формы, а второй из самой формы Form2). Такое решение может вызвать бесполезный расход памяти, поскольку при каждом создании экземпляра формы перекрывается текущее значение указателя Form2. В результате неоднократного выполнения этого кода вы получите формы, не связанные ни с какими переменными.
MalexG вне форума Ответить с цитированием
Старый 14.11.2008, 01:06   #8
MalexG
Форумчанин
 
Регистрация: 06.11.2008
Сообщений: 100
По умолчанию

Код:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;
{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  Button1.ModalResult := mrOk;
end;

procedure proschet();
begin
    while u<n+1 do
    begin
        form1.Button1.Caption:=form1.Button1.Caption+inttostr(k)+' ; ';
        k:=k-A[u-1];
        u:=u+1;

        if (k<3) and (u<n) then
        begin
            //form2:=TForm2.Create(Application);
            //form2.ShowModal;
            ModalResult := mrNone;
        end;

    end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
    k:=k+10;
    proschet();
end;

end.
MalexG вне форума Ответить с цитированием
Старый 14.11.2008, 12:18   #9
a1ias
 
Регистрация: 13.11.2008
Сообщений: 9
По умолчанию

to MalexG
В ваших исправлениях дублирование пропадает, но также пропадает обработка команд из TForm2.Button1Click, в те моменты, когда (k<3) and (u<n).

PS. я так понимаю вы имели ввиду под ModalResult := mrNone; эту строку:form2.Button1.ModalResult:= mrNone;
a1ias вне форума Ответить с цитированием
Старый 14.11.2008, 14:45   #10
MalexG
Форумчанин
 
Регистрация: 06.11.2008
Сообщений: 100
По умолчанию

Что касается ModalResult, то я имел ввиду Form2.ModalResult := mrNone.
Поймите у модальной формы при обработке клика на кнопке, она (кнопка) присваивает свое значение ModalResult форме.

Но речь не об этом. Я более внимателным образом поковырялся в вашей программе и вот что накопал:
1. Не следует использовать глобальные переменные из Form1 в Form2;
2. Значения переменных следует передавать в функцию реализации модальной формы (см. прикрепленный проект);
3. Необходимые вычисления нужно производить в Form1, т.е. необходимо процедуру proschet() переместить в этот модуль.
Итог всего сказанного в прикрепленном проекте.
Вложения
Тип файла: zip P_ModalForm.zip (9.1 Кб, 13 просмотров)
MalexG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баллонная подсказка при использовании Shell_NotifyIcon Fantom Win Api 1 28.09.2008 00:41
Виснет приложение при использовании winsock TR1PL3X Работа с сетью в Delphi 1 31.03.2008 09:14
Как при использовании FileWrite перейти на новую строку? Artem Win Api 4 03.09.2007 17:02