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


Автор: Rock 13.3.2005, 08:03
Беру код из DRKB, чтоб показать заставку перед запуском проги...
делаю все так:
Код

program Project1; 

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

{$R *.RES} 

begin 
  Application.Initialize; 
  Form2 := TForm2.Create(Application); 
  Form2.Show; 
  Form2.Update; 
  while Form2.Timer1.Enabled do 
    Application.ProcessMessages; 
  Application.CreateForm(TForm1, Form1); 
  Form2.Hide; 
  Form2.Free; 
  Application.Run; 
end. 

Все тип-топ - заставка показывается, но... вот после её закрытия меняеться шрифт на других формах - становиться больше, вот такая вот фигня... Если код появления заставки закоментировать, шрифт становится нормальным, как и был раньше...

Автор: Rock 14.3.2005, 12:35
Что не кто не вкурсе? Ещё дополнение: если убрать строчку Form2.Free - то такой проблеммы не возникает

Автор: Гость_Pakshin A. S. 14.3.2005, 15:15
А случаем так не проще?
Код

program Project1; 

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

{$R *.RES} 

begin 
  Application.Initialize; 
  Form2:=TForm2.Create(Application); 
  Form2.Show; 
  while Form2.Timer1.Enabled do 
    Application.ProcessMessages; 
  Form2.Free; 
  Application.CreateForm(TForm1, Form1); 
  Application.Run; 
end. 

По-моему работать будет аналогично... smile smile И без всяких там глючков.... Может просто вин или дельфи не так, как надо обрабатывает закрытие форм (точнее освобождение объектов...)

Вообще, если используется такая форма:
Код

...
procedure OnButton1Click(sender: TObject);
begin
 Close;
end;
...


Без всяких тама таймеров или форма закрывается через какую либо другую стороннюю функцию (например зарузки чего-либо), то вообще цикл еще можно убрать... smile

Покажи форму... smile

Автор: Vit 14.3.2005, 16:58
Цитата
  while Form2.Timer1.Enabled do
    Application.ProcessMessages;



А зачем это?

Автор: Петрович 14.3.2005, 18:55
Цитата(Vit @ 14.3.2005, 17:58)
А зачем это?

Это наверное для того, что бы форма повисела как минимум некоторое время.


Автор: Vit 14.3.2005, 21:10
Странное решение... Не проще ли было бы в цикле sleep покрутить... Не люблю разрушение объектов по таймеру...

Автор: Петрович 14.3.2005, 22:20
Дык он вроде по таймеру и не разрушает. Просто он наверное после срабатывания таймера делает его Enable := False что и служит признаком того что он уже сработал.

Автор: Rock 15.3.2005, 08:10
Vit, а как через sleep?
Значит вот:
Код



uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {PasswordDlg},
  mnVar in 'mnVar.pas',
  Unit3 in 'Unit3.pas' {AboutBox},
  Unit4 in 'Unit4.pas' {OKBottomDlg1},
  Unit5 in 'Unit5.pas' {Form5},
  Unit6 in 'Unit6.pas' {Form6},
  Unit7 in 'Unit7.pas' {Form7},
  WorkIni in 'WorkIni.pas';

{$R *.res}

begin
  Application.Initialize;
  Form6:= TForm6.Create(Application); //Заставка, появляющаяся перед запуском программы
  Form6.Show;
  Form6.Update;
  while Form6.Timer1.Enabled do
    Application.ProcessMessages;
  Form6.Free; //Если именно эту строчку закоментировать, то никаких проблем нету...
  Application.CreateForm(TForm1, Form1); //Главное окно программы
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TPasswordDlg, PasswordDlg);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.CreateForm(TOKBottomDlg1, OKBottomDlg1);
  Application.CreateForm(TForm5, Form5);
  Application.Run;
end.

А вот сама форма:
Код

unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, glFlyTxt, glLabel, glWizardHeader, glImage, StdCtrls;

type
  TForm6 = class(TForm)
    Timer1: TTimer;
    glWizardHeader1: TglWizardHeader;
    glLabel1: TglLabel;
    glLabel2: TglLabel;
    glBitmapImage1: TglBitmapImage;
    Label1: TLabel;
    glLabel3: TglLabel;
    glLabel4: TglLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
end;

Автор: RA 15.3.2005, 08:33
Rock

Добавь в uses Windows

а вместо
Цитата(Rock @ 15.3.2005, 08:10)
while Form6.Timer1.Enabled do
    Application.ProcessMessages;


вставь sleep(5000);

Автор: Петрович 15.3.2005, 08:37
Сделай так:
Код

{$R *.res}

begin
  Application.Initialize;
  Form6:= TForm6.Create(Application); //Заставка, появляющаяся перед запуском программы
  Form6.Show;
  Form6.Update;
  while Form6.Timer1.Enabled do
    Application.ProcessMessages;
  Form6.Hide;
  Application.CreateForm(TForm1, Form1); //Главное окно программы
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TPasswordDlg, PasswordDlg);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.CreateForm(TOKBottomDlg1, OKBottomDlg1);
  Application.CreateForm(TForm5, Form5);
  Application.Run;
  Form6.Free; //Если именно эту строчку закоментировать, то никаких проблем нету...
end.

и не парься.

Автор: ~FoX~ 15.3.2005, 10:40
Петрович
А нафига Form6.Hide; делать? Может просто Form6.Close; прокатит?

Автор: RA 15.3.2005, 11:13
Цитата
А нафига Form6.Hide; делать? Может просто Form6.Close; прокатит?


Если Form6 это MainForm то Close вызовет Application.Terminate, а если это не MainForm то Hide. smile
такая вот штука.

Автор: Петрович 15.3.2005, 12:00
Цитата(RAdmin @ 15.3.2005, 12:13)
Цитата (~FoX~ @ 15.3.2005, 10:40)
А нафига Form6.Hide; делать? Может просто Form6.Close; прокатит?



Если Form6 это MainForm то Close вызовет Application.Terminate, а если это не MainForm то Hide. 
такая вот штука.

На самом деле, в данном случае, однофигственно.

1. Form6 это не MainForm. Поскольку MainForm'ой становится первая форма созданная с помощью Application.CreateForm. Т.е. в данном случае Form1.

2. По умолчанию, если неизменен Action в OnClose, Close для не MainForm'ы делает ни что иное как Hide.

Автор: RA 15.3.2005, 12:20
Цитата
1. Form6 это не MainForm. Поскольку MainForm'ой становится первая форма созданная с помощью Application.CreateForm. Т.е. в данном случае Form1.


Ух шайтан я не заметил что там Create(Application);
Хотя я и неговорил что Form6 это MainForm, я сказал если smile

Цитата
По умолчанию, если неизменен Action в OnClose, Close для не MainForm'ы делает ни что иное как Hide.


Не петрович ты не прав.
ибо
Код

 if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate


Автор: Rock 15.3.2005, 13:00
Короче: сделал через sleep и поставил Form6.Free после Aplication.Run... вроде работает smile
Вот только интересно: почему глючит так

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