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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2014, 23:55   #1
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Печаль окно авторизации

доброго времени суток!
потребовалось сделать окно авторизации для проекта.
Form2 - главная
Form1 - форма авторизации
Код:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Button3: TButton;
    Button1: TButton;
    DateStart: TDateTimePicker;
    DateEnd: TDateTimePicker;
    cs: TClientSocket;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  autorization: boolean;
implementation
uses Unit1;
{$R *.dfm}

function login(Form: TForm):boolean;
begin
try
  Form:=TForm1.Create(Application); //создаю форму авторизации
  Form.ShowModal; //показываю ее
finally
  Form.Free; //освобождаю
  Form:=nil;
end;
if autorization then login := True
else login := False;

end;

procedure TForm2.FormCreate(Sender: TObject);
var B: Boolean;
begin
autorization := false;
B:=login(Form1);
if not B then Application.Terminate;
end;

end.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ADODB, DB, StdCtrls, Inifiles, IdHTTP, IdHashMessageDigest, ExtCtrls,
  ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    edit_login: TEdit;
    edit_pass: TEdit;
    cs: TClientSocket;
    log: TMemo;
    te: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  arr=array of string;
  twoarr=array[0..1] of arr;
var
  Form1: TForm1;
  Ini: Tinifile;
  login, pass: string;


implementation
uses Unit2;

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//проверка авторизации...
      Unit2.autorization := true;
      Form2.Show;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Unit2.autorization:=false;
end;
Form2 выбрана как главная, form1 не создается автоматически(убрал в options: auto-create forms). При успешной авторизации главная форма показывается, но форма авторизации не убивается. Если в TForm1.Button1Click после Unit2.autorization := true; прописать Form1.Close или Form1.Hide, то вылезает эксепшн как показать главную форму, и убить форму авторизации?
marwell. вне форума Ответить с цитированием
Старый 24.06.2014, 00:16   #2
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Код:
function login(var Form: TForm):boolean;
begin
try
  Form:=TForm1.Create(Application); //создаю форму авторизации
  Form.ShowModal; //показываю ее
finally
  FreeAndNil(Form);
end;
if autorization then 
 Result := True
else
 Result := False;
end;
Скорее всего так. Остальное похоже на правду.
STRELOK-2007 вне форума Ответить с цитированием
Старый 24.06.2014, 00:26   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

http://programmersforum.ru/showpost....99&postcount=4
Создаю главную форму только при успешно пройденной авторизации.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.06.2014, 01:09   #4
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

спасибо большое!
marwell. вне форума Ответить с цитированием
Старый 24.06.2014, 01:34   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
http://programmersforum.ru/showpost....99&postcount=4
Создаю главную форму только при успешно пройденной авторизации.
Несколько странно выглядит строка
Код:
LoginPage.free;
последней строкой программы.

P.S,
А вообще меня давно удивляет такое поведение Дельфийских программ. Вроде как в учебниках исстари написано что цикл обработки сообщений запускается в методе TApplication.Run. Так каким же святым духом работает обработка сообщений в форме созданной и показанной до вызова этого метода?

Последний раз редактировалось northener; 24.06.2014 в 01:42.
northener вне форума Ответить с цитированием
Старый 24.06.2014, 02:55   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

northener, мне нечего Вам сказать по поводу TApplication.Run (не знаю этой "кухни"). Насчёт LoginPage.free - она нужна в обоих кейсах, вот и вынес. В общем, этот код можно рассматривать как пример, но является ли он 100% правильно работающим, не могу сказать (тыц).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.06.2014, 03:17   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
[B В общем, этот код можно рассматривать как пример, но является ли он 100% правильно работающим, не могу сказать (тыц).
Он действительно работающий. И под те 90% от АА он явно не подпадает.
И я не имел никоим образом сказать что этот код не рабочий. Я сказал только то что я сказал.
northener вне форума Ответить с цитированием
Старый 24.06.2014, 09:36   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Если в TForm1.Button1Click после Unit2.autorization := true; прописать Form1.Close или Form1.Hide, то вылезает эксепшн
В вашем случае переменная Form1 не инициализирована( ей нигде в коде не присваивается значение). В ней нет ссылки на ту самую форму авторизации.

Цитата:
Код:
function login(Form: TForm):boolean;
begin
try
  Form:=TForm1.Create(Application); //создаю форму авторизации
форма создана, но переменная form1 не будет заполнена, несмотря на это B:=login(Form1);

Дело в том что параметры процедур(функций) не возвращаются без явного на то указания.

Код:
function login(var Form: TForm):boolean; //теперь мы указали что МЫ можем изменить значение переданного нем параметра.
Код:
function Login: boolean;
begin
  Form1:=Tform1.Create(...);// прямая инициализация глобальной переменной Form1
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.06.2014 в 09:41.
evg_m вне форума Ответить с цитированием
Старый 24.06.2014, 10:37   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

BDA ShowModal функция, зачем еще какие то саксесы? ну и про фри уже сказали
eval вне форума Ответить с цитированием
Старый 24.06.2014, 15:23   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

eval, насчёт ShowModal согласен. Когда писал, не знал, что можно вернуть любое целое в ModalResult.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[?] Послать клавишу в чужое окно, не выводя окно на передний план. Moriarty Win Api 4 21.02.2011 05:11
Окно авторизации HAMMAN Помощь студентам 2 13.05.2008 11:58
Помогите сделать окно авторизации пользователей HAMMAN Помощь студентам 2 09.05.2008 00:02
окно авторизации Ary БД в Delphi 5 27.03.2008 11:22
«Окно+символ». Создать класс, представляющий окно в текстовом режиме. RustreX Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2007 19:28