Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];

Вниз

Childs окна   Найти похожие ветки 

 
Explorer   (2002-07-12 15:30) [0]

Мастера!
Сделал "ручками" форму авторизации(из Бд).
После правильного входа, делаю окно не видимым(Hide), и вызываю
другую форму. Но когда после этого, на нее пытаюсь вывести дочернюю форму, ошибка EInvalidOperation ("не могу открыть форму. MDI форма не активна.)

Скорей всего пытается вывести дочернии формы на форму авторизации.

Подскажите, как решить эту проблемку?


 
Skier   (2002-07-12 15:35) [1]

>Explorer
Видимо у тебя главная форма приложения это
- "форма авторизации", вот на неё и Delphi пытается
вывести дочернюю форму, а "форма авторизации" у тебя скрыта.

Попробуй создать "другую форму" через
Application.CreateForm(...)


 
Explorer   (2002-07-12 15:40) [2]

>Skier ©
можно по подробнее!
Где создать?


 
Skier   (2002-07-12 15:41) [3]

>Explorer
Я поторопился CreateForm не поможет :(


 
Explorer   (2002-07-12 15:43) [4]

Это я уже проверил!


 
Skier   (2002-07-12 15:45) [5]

>Explorer
Ты делаешь форме Hide, а "Show" потом не делаешь что ли ?


 
Johnmen   (2002-07-12 15:48) [6]

Обрати внимание
>Видимо у тебя главная форма приложения это
>- "форма авторизации", вот на неё и Delphi пытается



 
Explorer   (2002-07-12 15:50) [7]

Да все дело в том, что мне эта форма больше не нужнА!
Я ее не закрываю, потому что конекчусь к базе через ком-ту DataBase, выдергиваю из формы имя юзера.
А закрываю, только тогда, когда закрываю "главную форму", в которой хочу видеть childs формы.

Вот мне и интересно, как это можно обойти?


 
Explorer   (2002-07-12 15:52) [8]

>Johnmen ©
А как это изменить?


 
Skier   (2002-07-12 15:53) [9]

>Explorer
Как у тебя создаётся "главная форма" - покажи.


 
Skier   (2002-07-12 15:57) [10]

>Explorer
Если так
Application.CreateForm(TГлавнаяФорма, ГлавнаяФорма);

то замени на - ГлавнаяФорма := TГлавнаяФорма.Create(...)

А уже "другую форму" создавай через Application.CreateForm

Попробуй...


 
Johnmen   (2002-07-12 15:57) [11]

В MDI приложении м.б. только одна гл.форма, т.е. она создается первой...


 
Fiend   (2002-07-12 16:00) [12]

То Johnmen
Лабуда это
> .е. она создается первой...


Можно создать хоть двадцать форм при помощи TForm.Create(Application), но главная будет другой, которая создастся поздже


 
Skier   (2002-07-12 16:03) [13]

>Fiend
Точно.
Главную форму можно создать только через Application.CreateForm
и только один раз !


 
Johnmen   (2002-07-12 16:04) [14]

>Fiend © (12.07.02 16:00)
>но главная будет другой, которая создастся поздже

Кто и как определит, что она главная ? :)



 
Skier   (2002-07-12 16:06) [15]

>Johnmen
Чтобы задать главную форму нужно просто
задать Application.MainForm, а она задаётся только в
Application.CreateForm т.к. св-во Application.MainForm
только для чтения :(


 
Fiend   (2002-07-12 16:07) [16]

То Johnmen
Можно по разному создавать формы: TForm.Create или Application.CreateForm.
Это разные везчи.

посмотри в исходник самого ДПР и увидишь, что первый вызов Application.CreateForm создаёт именно главное окно программы. т.е. перед этим вызовом ты можешь приспокойненько, создавать сколько угодно "не главных" форм при помощи TForm.Create(Application)


 
Fiend   (2002-07-12 16:09) [17]

То Johnmen
вот Скаер правильно меня дополнил насчёт МайнФорм


 
Skier   (2002-07-12 16:11) [18]

>Fiend
Прошу прощения, но - Скиер :))


 
Johnmen   (2002-07-12 16:16) [19]

Ребята, не надо мне прописных истин...Вы меня не поняли...
И чего вы на меня набросились, лучше помогите автору !


 
Skier   (2002-07-12 16:19) [20]

>Johnmen
"Платон мне друг, но истина дороже !" :)))

> , лучше помогите автору !

Он, пока, молчит...


 
Johnmen   (2002-07-12 16:37) [21]

Да и при молчании можно попытаться. :)
У него в файле проекта стоит примерно так :
Application.CreateForm(TAutoForm, AutoForm);
Application.CreateForm(TMainMDIForm, MainMDIForm);

а это не катит, должно быть на первом месте
Application.CreateForm(TMainMDIForm, MainMDIForm);
и на момент Application.Run именно она д.б.главной


 
Skier   (2002-07-12 16:42) [22]

>Johnmen
Всё правильно...
Я ему то же самое написал, просто - "форму авторизации"
можно создавать и так HisForm := THisForm .Create(...).
Но, в общем, твой вариант даже проще...



 
Explorer   (2002-07-15 06:18) [23]

А если мне надо, что бы было так:
В зависимости от статуса пользователя (user, admin...)после формы авторизации, запускались разные "Главные" формы?


 
Explorer   (2002-07-15 06:37) [24]

>Johnmen © (12.07.02 16:37)
>Да и при молчании можно попытаться. :)
>У него в файле проекта стоит примерно так :
>Application.CreateForm(TAutoForm, AutoForm);
>Application.CreateForm(TMainMDIForm, MainMDIForm);
>а это не катит, должно быть на первом месте
>Application.CreateForm(TMainMDIForm, MainMDIForm);
>и на момент Application.Run именно она д.б.главной

Но, тогда при запуске проги, первой выводиться "Главная форма".
А нужна форму "авторизации"!
Надо делать "Главную" HIDE? Только так или как по-другому?


 
msts   (2002-07-15 07:49) [25]

begin
Application.Initialize;
with TAutoForm.Create(nil) do try // создаем форму авторизации
if ShowModal = mrOK then begin //показываем в модальном режиме и если нажали кнопку ОК
//кинь на TAutoForm 2 кнопки TButton (по стандарту)
// у них есть property ModalResult: TModalResult
// у первой выстави mrOk
// у второй mrCancel
if UserID = uidUser then //проверям проперту UserID - это простой юзер?
//проперту UserID - сделай сам и заполняй соответственно
Application.CreateForm(TUserMainMDIForm, MainMDIForm);
if UserID = uidAdmin then //это админ?
Application.CreateForm(TAdminMainMDIForm, MainMDIForm);
end;
finally
Free; // если произошла ошибка то уничтожаем TAutoForm
end;
Application.Run; //запускаем прогу
//PS: если ни одна форма не была создана то прога завершится
end;


 
msts   (2002-07-15 08:04) [26]

уточнение :

finally
Free; //ДАЖЕ если произошла ошибка (exception) то уничтожаем TAutoForm
end;

if UserID = uidUser then - можно заменить на case
или
завести пропертю (у TAutoForm)
MainFormClass : TFormClass
и возвращать класс формы который нужно создать
получаем:

if ShowModal = mrOK then
Application.CreateForm(MainFormClass, MainMDIForm);

соответственно выбор и установка MainFormClass осуществляется
в TAutoForm

а вот как у нас... выглядит programm:

program car2;

uses
Forms,
ComServ,
ComObj,
UCSInit,
windows,
car2_TLB in "car2_TLB.pas";

{$R *.TLB}

{$R *.res}

begin
SetServer(ComServer); //Устанавливаем ссылку на comserver
Application.Initialize;
LoadLog; //Загружаем службу журналирования операций
carLog.Init;
LoadWaiter; //Загружаем службу продолжительных операций
carWaiter.Init;
LoadKernel; //Загружаем ядро системы
carApplication.Init;
Application.Run;
carApplication.Done;
carWaiter.Done;
carLog.Done;
end.

когда в программе количество форм достигает 600 то
они и грузятся не так как предлагает борланд по умолчанию


 
Explorer   (2002-07-15 08:40) [27]

>msts
А если, я форму "авторизации" делаю сам?


 
Explorer   (2002-07-15 08:44) [28]

>msts
Извини, глупость сморозил!


 
Explorer   (2002-07-15 09:08) [29]

>msts
if ShowModal = mrOK then begin - ругается на эту строку!


 
Explorer   (2002-07-15 09:44) [30]

со строкой разобрался!
Но теперь прога виснет!


 
msts   (2002-07-15 10:40) [31]

круто
а подробности?

PS: причины:
неправельное наследование алгоритмов в процессе изменения исходников.
в начале использовалась перемення для формы TAutoForm (AutoForm)
а в новом варианте она = nil например где то стоит AutoForm.close

в общем копай




 
msts   (2002-07-15 11:06) [32]

так же учитывай
что при TAutoForm.Create(nil<----)
TAutoForm.Owner = nil а есть компоненты которым он нужен
еще не забывай
при создании мдичилд происходит обращение к
Application.MainForm."чего то там"
и еще...
в общем на основе неизвестного куска кода
можно предположить разные варианты ошибок
но настораживает что "Но теперь прога виснет!"
проверь в каком месте
(во пургу какую развел :) )


 
Explorer   (2002-07-15 12:17) [33]

>msts
Все заработало!!!
Как вссегда я напортачил!
Пытался закрывать форму AutoForm.close.

Всем большое спасибо!


 
saxon   (2002-07-15 13:39) [34]

попробуй так (это круче)

Application.Initialize;

SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
try
Application.Title := "Titel";
Application.HelpFile := "App.hlp";
...
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TPasswordDlg, PasswordDlg);
...
finally
SplashForm.Free;
end;
Application.OnIdle:=MainForm.StartPWDDialog;
Application.Run;

В методе MainForm.StartPWDDialog происходит создание формы и авторизация юзера и ...


 
Explorer   (2002-07-15 13:44) [35]

>saxon ©
Сейчас и так попробую.


 
saxon   (2002-07-15 13:47) [36]

А по поводу главных не главных
НЕ ВАЖНО
как написан ДПР
главное какая форма главная в свойствах проекта !!!


 
Fiend   (2002-07-15 13:50) [37]

То saxon
Хотите сказать возможно такое:

Application.CreateForm(TForm1, Form1);
Application.CreateForm(TMainForm, MainForm);

И главная форма TMainForm?


 
saxon   (2002-07-15 13:53) [38]

стественно.
попробуйте так
а в свойствах проекта выставите на TMainForm
и все работает !!!


 
Fiend   (2002-07-15 13:57) [39]

То saxon, чушь

как тока вы выставите в свойствах проекта Main Form = TMainForm,
то исходник ДПР тут же изменится, и первой строкой среди CreateForm будет именно строка с созданием от TMainForm


 
Explorer   (2002-07-15 14:01) [40]

А подскажите, как в таком случае лучше коннект к базе сделать, точнее, где его лучше разместить? (использую DataBase)


 
Fiend   (2002-07-15 14:02) [41]

То Explorer
Мне кажется уже всё объяснили. Что же еще не понятно????


 
saxon   (2002-07-15 14:05) [42]

Fiend
В свойствах надо ставить перед тем как менять ДПР!!!
ну и естественно следить за этим.


 
Explorer   (2002-07-15 14:09) [43]

>Fiend ©
Вы извините, что я такой трудный, но меня интересует,
коннект лучше создавать на Главно форме, или лучше создать какой-нибудь DataModule и через него осуществлять коннект?


 
saxon   (2002-07-15 14:12) [44]

Лучше через DataModule.


 
Explorer   (2002-07-15 14:19) [45]

>saxon ©
Тогда обьясните пожалуйста мне не далекому, что я делаю не так?

Код:

program NightKassa;

uses
Forms, windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
Menus, Buttons, FormPassword in "Forms\FormPassword.pas" {FormPasswords},
DataModule in "Forms\DataModule.pas" {DataModuleKassa: TDataModuleKassa},
MainForm in "Forms\MainForm.pas" {MainF};

{$R *.res}

begin
Application.Initialize;
TDataModuleKassa.Create(DataModuleKassa);
with TFormPasswords.Create(nil) do try
TDataModuleKassa.Create(DataModuleKassa);
DataModuleKassa.DataBaseKassa.connected:=true;
QueryAuthUser.Active:=true;
if ShowModal = mrOk then begin
if (QueryAuthUser.FieldByName("UserName").AsString=DBLookupComboBoxUser.Text) and
(QueryAuthUser.FieldByName("UserPasswd").AsString=MaskEditPasswd.Text) and
(QueryAuthUser.FieldByName("Status").AsBoolean=false)
then begin
UserName:=DBLookupComboBoxUser.Text;
UserPasswd:=MaskEditPasswd.Text;
Application.CreateForm(TMainF, MainF);
end
else begin
MessageDlg("


 
Explorer   (2002-07-15 14:23) [46]

Разобрался!
надо было убрать:
DataModuleKassa.DataBaseKassa.connected:=true;


 
Fiend   (2002-07-15 14:30) [47]

To Explorer ©
Вот этой строкой TDataModuleKassa.Create(DataModuleKassa);
Вы создаёте объект, но указатель на него никуда не сохраняете, поэтому и обращение к DataModuleKassa.DataBaseKassa.connected:=true; вызывает у вас АВ.

Надо было написать DataModuleKassa:= TDataModuleKassa.Create(Application);
И тогда бы вы нормально обращались к объекту базы данных


 
saxon   (2002-07-15 14:32) [48]

To Explorer ©

Ну и вообще так как Вы это делаете
лучше и не делать!:))
Посмотри примеры делфи (там тоже есть умные вещи:) )


 
Explorer   (2002-07-15 14:39) [49]

>saxon ©
Я только учусь!
А это пока набросал, чтобы проверить и понять, как все это примерно работает! Но, то что Вы написали, постараюсь воплотить в жизнь!



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
1-81237
gluek
2002-07-14 15:59
2002.07.25
Еще вопросик по математике...


3-81203
Boroda Oleg
2002-07-05 10:50
2002.07.25
Ошибки при сцеплении строк в процедурах под IB


1-81238
V.Turecky
2002-07-14 15:31
2002.07.25
Как записать в реестр значения типа REG_BINARY?


6-81401
Krok
2002-05-13 14:23
2002.07.25
Как можно программно получить список компьютеров в лок.сети?


8-81387
Devid
2002-03-12 18:00
2002.07.25
Как заисать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский