Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Правельно закрыть форму


Автор: Potia 29.8.2005, 20:28
Есть такая задача. Открыть форму авторизации, ввести два параметра, сравнить, загрузить главную форму и передать туда эти значения.

Так все начинается.
Код

begin
  Application.Initialize;
  Application.Title := 'Ïóíêò îáìåíà âàëþòû 1.0V';
  Application.CreateForm(TForm2, Form2); //Форма авторизации
  Form2.ShowModal;
  Application.Run;
  end.


Код

procedure TForm2.Button1Click(Sender: TObject);
begin
if EditPass.Text = IntToStr(123)
  then
  Application.CreateForm(TForm1, Form1)
  //И здесь нужно закрыть форму2 и передать  EditPass.Text в форму1
  else
  EditPass.Text := '';
end;


Как это можно сделать

Автор: Pakshin A. S. 29.8.2005, 21:39
Заведи в моуле с Form1 переменную в секции var раздела innitialization

Код

var
 Form1: TForm1;
 Pass: string;


Теперь закрываем форму вот так:
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
if EditPass.Text = IntToStr(123)
  then
  Application.CreateForm(TForm1, Form1)
  Pass:=EditPass.Text;
  Form1.ShowModal;
  Form1.Free;
  else
  EditPass.Text := '';
end;


Для проверки сделаем обработчик OnShow дял формы Form1:
Код

procedure TForm1...;
begin
 ShowMessage(Pass);


Подойдет? Можно и лучше сделать, если опишите что конкретно прога делает (на словах и по пунктам)

Автор: Alex 30.8.2005, 00:36
Код проекта:
Код

program Project1;

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

{$R *.res}

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


Главная форма приложения:
Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

uses
  unit2
;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TForm2.Create(Application) do try
    ShowModal;
    label1.Caption:= Edit1.Text;
  finally
    Release;
  end;
end;

end.


Форма для ввода пароля:
Код

unit Unit2;

interface

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

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

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Close;
end;

end.


Автор: Marriage 30.8.2005, 10:04
Цитата(Potia @ 29.8.2005, 20:28)
сравнить, загрузить главную форму и передать туда эти значения.

А что мешает использовать глобальные переменные ???

Автор: Alex 30.8.2005, 10:26
Цитата(Marriage @ 30.8.2005, 11:04)
А что мешает использовать глобальные переменные ???

Стремление написать код, который будет работать всегда и везде, экономия памяти.

Автор: Guest 30.8.2005, 18:42
Pakshin A. S., Да задача проста: при загрузке вылетает первая фрма где вводиться пароль и проверяется на соответствие, далее должна открыться программа именно от того человека, который ввел пароль.

Автор: Guest 30.8.2005, 19:04
Ничего не получается вот в этом моменте.

Код

procedure TForm2.Button1Click(Sender: TObject);
begin
if EditPass.Text = IntToStr(123)
  then
  begin
  Application.CreateForm(TForm1, Form1);
  Pass:=EditPass.Text;
  Form1.ShowModal; //Здесь начинает ругаться
  Form2.Free; //А это вообще делать не хочет
  end
  else
  EditPass.Text := '';
end;


Хочу заметить что первым вылитает Form2, от которой нужно получить значение PASS и закрыть, чтобы осталась только Form1

Автор: Potia 30.8.2005, 19:28
А можно как-то сделать вот такое
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
if EditPass.Text = IntToStr(123)
  then
  begin
  Application.CreateForm(TForm1, Form1);
  Pass:=EditPass.Text;
// Передать все права на Form1
  Form2.Close; // А тут просто ее закрыть
  end
  else
  EditPass.Text := '';
end;


Почему родилась такая мысль, если из Form1 родить Form3, вот так

Код

Application.CreateForm(TForm3, Form3);
Form3.ShowModal;


А зыкрыть form3 вот так

Код

Form3.close;


То все супер form3 закрывается и все хорошо, а если я использую form2.close, то вся программа закрывается.

Автор: Pakshin A. S. 30.8.2005, 21:22
А можно и так сделать...

Демонстрационный проектик:
1) Создаем две формы Form1 и Form2. Form2 убираем из автокреита.

2) Ставим на вторую форму Edit для ввода имень пользователя.

3) Ставим Button на вторую форму.

4) Заводим переменные в Form2:
Код

var
 Form2: TForm2; // Это уже есть
 IsInsert: boolean;
 User: string;


5) На клик кнопки ставим
Код

IsInsert:=true;
User:=Edit1.Text;
Close;


6) Переделываем модуль основного проекта под наши нужды:
Код

begin
 Application.Initialization;
 Form2:=TForm2.Create(self);
 IsInsert:=false;
 Form2.ShowModal;
 Form2.Close;
 if IsInsert
  then
   begin
    Application.CreateForm(Form1, TForm1); // или как тама пишется 
    (*Если есть лэйбл, то можно проверить так Form1.Label1.Caption:=User;*)
    Application.Run;
  end;
end.


Автор: Alex 30.8.2005, 22:07
А чем вам мой пример не подходит? Если вас смущает, что загрузку второй формы я осуществляю в первой, то пусть вас это не смущает, т.к. при выполнении Create первой формы она еще не видна на экране и пользователь сначала в любом случаи увидит вторую форму и токо когда ее закроет ему на экране появится первая

Автор: Pakshin A. S. 31.8.2005, 13:00
Для ленивых:
http://www.pakshin.com.ru/index.php?module=art22 smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)