Форум: "Основная";
Текущий архив: 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