Форум: "Основная";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
ВнизСамопроизвольное появление формы Найти похожие ветки
← →
Phantomouse © (2009-12-17 06:15) [0]Добрый день!
Не могу понять что именно я сделал :). После очередной компиляции приложения одна из его второстепенных форм стала автоматически появляться при запуске приложения.program UserManager;
uses
Forms,
Main in "Main.pas" {MainForm},
OptionsUnit in "OptionsUnit.pas" {Options},
UserUnit in "UserUnit.pas" {User};
{$R *.RES}
begin
Application.Initialize;
Application.Title := "VDS ACM Administrator";
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TOptions, Options);
Application.CreateForm(TUser, User);
Application.Run;
end.
Речь идёт о форме "User". В момент запуска форма появляется и "уходит" за MainForm так, как это случилось бы при вызове User.Show(); Пробовал убирать форму из списка автосоздаваемых и создавать вручную. Эффект тот же. При вызове TUser.Create(MainForm) форма появляется сама, не дожидаясь вызова Show() или ShowModal(). Трассировка по F7 ничего сорного не выявила.
Глюк впервые проявился после изменений кода, затрагивающих сохранение данных из полей формы User по нажатию кнопки ОК. Игрался с ModalResult, но после того, как заглючило, всё вернул в первоначальное состояние. Код юнита UserUnit:unit UserUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, sSkinProvider, acPNG, ExtCtrls, sPanel, Buttons, sSpeedButton,
StdCtrls, sLabel, sEdit, sGroupBox, Mask, sMaskEdit, sSpinEdit,
sCustomComboEdit, sTooledit, sComboEdit, sComboBox, sMemo, ComCtrls,
sPageControl, sButton;
type
TUser = class(TForm)
sSkinProvider1: TsSkinProvider;
Image1: TImage;
sPanel1: TsPanel;
sLabel1: TsLabel;
sLabel2: TsLabel;
sLabel3: TsLabel;
surnameEdit: TsEdit;
nameEdit: TsEdit;
thirdnameEdit: TsEdit;
sGroupBox1: TsGroupBox;
sLabel4: TsLabel;
passportEdit: TsMaskEdit;
sLabel6: TsLabel;
passdateEdit: TsDateEdit;
sGroupBox2: TsGroupBox;
cardEdit: TsEdit;
sSpeedButton3: TsSpeedButton;
sLabel7: TsLabel;
passorgEdit: TsComboBox;
sLabel8: TsLabel;
birthdayEdit: TsDateEdit;
sLabel5: TsLabel;
cityEdit: TsComboBox;
sLabel9: TsLabel;
addressEdit: TsMemo;
sLabel10: TsLabel;
phoneEdit: TsMaskEdit;
sLabel11: TsLabel;
emailEdit: TsEdit;
sPageControl1: TsPageControl;
sTabSheet1: TsTabSheet;
sTabSheet2: TsTabSheet;
sButton1: TsButton;
sButton2: TsButton;
procedure FormShow(Sender: TObject);
procedure sButton2Click(Sender: TObject);
procedure sButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
User: TUser;
implementation
uses Main;
{$R *.dfm}
procedure TUser.FormShow(Sender: TObject);
begin
sTabSheet1.PageIndex := 0;
surnameEdit.SetFocus;
end;
procedure TUser.sButton2Click(Sender: TObject);
begin
ShowMessage("Saved!");
Close;
end;
procedure TUser.sButton1Click(Sender: TObject);
begin
Close;
end;
end.
← →
sniknik © (2009-12-17 07:57) [1]> При вызове TUser.Create(MainForm) форма появляется сама, не дожидаясь вызова Show() или ShowModal().
поведение характерное для MDIChild форм. причем смутно помню был с ними глюк, вроде если установить этот тип то после вернуть "нормал" полноценно не получается (или это было с майнмди?... не помню и проверять не когда, на работу пора)
> Игрался с ModalResult
может не только с ним, может и типом форм?
← →
Anatoly Podgoretsky © (2009-12-17 08:37) [2]> sniknik (17.12.2009 07:57:01) [1]
Ты обрати внимание на его слова, что форма появляется сама, даже если ее нет в списке автосоздаваемых. В таком случае я не верю, что САМА.
← →
Ymen (2009-12-17 10:16) [3]User.visible := false ?
← →
sniknik © (2009-12-17 10:53) [4]> User.visible := false ?
MDIChild на это не обратит никакого внимания.
и потом что это за дурной подход, не решать проблему, а "замазывать" ее?
← →
brother © (2009-12-17 11:28) [5]> и потом что это за дурной подход, не решать проблему, а
> "замазывать" ее?
чтобы получить это:
http://www.brotherirk.narod.ru/shell/realizat.gif
:)
← →
Ymen (2009-12-17 12:26) [6]>sniknik ©
>> User.visible := false ?
>MDIChild на это не обратит никакого внимания.
Тоесть Вы сами решили без топикстартера, что это MDI ?
>И потом, что это за дурной подход, ...
Дальше устал читать...
← →
grammar-nazi (2009-12-17 12:33) [7]Ymen абсолютно прав. при установке FormStyle в fsMDIChild свойство Visible устанавливается в True, а при возврате к fsNormal таким и остаётся. соответственно, сразу же после создания, форма показывается.
← →
sniknik © (2009-12-17 13:24) [8]> а при возврате к fsNormal таким и остаётся.
вот это и есть похоже тот глюк про который я смутно помню...
и его и нужно исправить, вернуть значение в режиме разработки, а не делать присваивание в рантайм.
← →
Phantomouse © (2009-12-17 13:50) [9]>поведение характерное для MDIChild форм. причем смутно помню был с ними глюк, вроде если установить этот тип то после вернуть "нормал" полноценно не получается
Вот именно! Точно. Я же трогал ради интереса MDIChild... Но вернул в номал. Так что ещё можно переключить в design-time-е, чтобы убить самопроявление формы?
← →
Phantomouse © (2009-12-17 13:53) [10]Ступил. Действительно, установка Visible для формы в false решила проблему. Всем спасибо.
← →
han_malign (2009-12-18 15:36) [11]
> при установке FormStyle в fsMDIChild свойство Visible устанавливается в True
> вот это и есть похоже тот глюк про который я смутно помню...
- старый прикол, и не только c MDI - значение Visible в VCL "синхронизируется" для всех дочерних компонентов(невзирая на оконную топологию родитель/ребенок)...
З.Ы. С апишной ShowWindow(SW_HIDE/SW_RESTORE/SW_SHOW) - кажется какие то заморочки с "четностью" и "вложенностью" состояний были(давно... - уже и не упомню на какой версии Windows)... Возможно это в VCL и лечилось таким жестким Visible...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c