Skocz do zawartości

[Delphi] Wywołanie formy przez form2.show


sybic

Polecane posty

Wywołuje sobie formę2 następującą procedurą :

 

procedure TForm1.SpeedButton3Click(Sender: TObject);
var
 DialogRes : TModalResult;
begin
Form2 := TForm2.Create(Application);
try
Form2.parentHWND := Handle;
Form2.show;
finally

if Form2  <> nil then SpeedButton3.enabled:=false;

end;
end;

 

i tu brakuje mi wiedzy, bo aby to wszystko miało ręce i nogi trzeba zadbać o to, aby :

 

1. po wywołaniu okna przycisk SpeedButton3 był nieaktywny (by nie wywołać tego samego okna po raz drugi)

2. po zamknięciu form2 przycisk znów stał się aktywny, a pamięć przydzielona na wywołanie tego okna została zwolniona. Czyli aby wrócił stan dokładnie taki, jaki był przed wywołaniem okna.

 

Pkt. 1 udało mi się zrealizować, ale z pkt. 2 już nie wiem jak sobie poradzić...

 

A i jeszcze jedno pytanie. Jak zamknąć wywołaną już formę na pomocą przycisku Tbutton?

Gdy wywołuje formę poprzez showmodal, to nie mam z tym problemu.

Link do komentarza
Udostępnij na innych stronach

Skoro nie chcesz użyć ShowModal tylko koniecznie Show. To ja bym zrobił to - tak

jak pokazałem poniżej. Może jest inny sposób, który ktoś tutaj Tobie lepiej doradzi.

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 SpeedButton3.enabled := False;
 Form2 := TForm2.Create(Application);
 Form2.show;
end;
// ...
procedure TForm2.Button1Click(Sender: TObject);
begin
 Form1.SpeedButton3.enabled := True;
 Self.Close;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Form2 := nil;
end;

Oczywiście w kodzie pliku dpr usuń lub ustaw jako komentarz tworzenie Form2.

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Dzięki, naprawdę super!

 

Jednak widzę, że to wywołanie troszkę inaczej działa niż showmodal. Mianowicie otwarcie okna wizualnie wygląda troszkę dziwnie. Przy otwarciu jest trochę obliczeń, chwilę to trwa i komponenty umieszczone na nowej formie jakoś dziwnie się pojawiają. Wygląda to okropnie. Gdy wywołuje przez showmodal ten efekt nie występuje, lub wygląda inaczej. Wizualnie do przyjęcie.

W związku z tym mam pytanie – czy jest możliwość aby podczas wywołania okna jakąś jedną procedurą wszystko to jakoś wygasić, a gdy już się wszystko otworzy, wszystko to włączyć?

Link do komentarza
Udostępnij na innych stronach

No właśnie to mi nie wychodzi. Gdy w procedurze w zdarzeniu OnActivate daje false i potem nastepuje przeliczenie danych i na końcu visible:=true to program się wykłada z komunikatem :

"Cannot chagne form2 OnShow or OnHide. Process stopped"

Link do komentarza
Udostępnij na innych stronach

A czy musi to być forma tworzona od podstaw, może na początek spróbuj załadować formę dynamiczną (chyba tak się to nazywa)

tworzysz formę, układasz byle jak komponenty (chociaż jak już ją tworzysz to można wprowadzić jakiś ład)

menu Project \ Options i w okienku na liście masz Forms

 

Domyślnie formy są ładowane z prawej do kolumny Auto-create forms przerzuć swoją formę do Available forms

 

i teraz spróbuj utworzyć, pomieszać w ustawianiach i pokazać,

jeśli się okaże że forma po utworzeniu od razu sie pokazuje to może w inspektorze formy daj Visible False;

a potem próbuj ja pokazać.

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

A ja bym to troszkę inaczej oprogramował .... ;-)

 

forma1

 

klikamy button1, tworząc formę2 :

 

Form2 := TForm2.Create(Application);

Form2.Show;

 

forma 2

 

tworzymy ją, blokujemy button1 na formie1 :

 

procedure TForm2.FormCreate(Sender: TObject);

begin

 

Form1.Button1.Enabled := false;

 

end;

 

"kilujemy" formę2 :

 

procedure TForm2.FormDestroy(Sender: TObject);

begin

 

Form1.Button1.Enabled := true;

 

end;

 

no i oczywiście "killowanie" formy2 :

 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 

Action := CaFree;

 

end;

 

jak są akcje, to ich używajmy ..... ;-)

 

a co do cudów przy otwieraniu/tworzeniu formy, to z tego, co mi moja dziurawa pamięć przypomina :

 

odpalając form, robimy jej enabled := false, potem robią się różne cuda, a potem dajemy enabled := true;

powinno pomóc

Link do komentarza
Udostępnij na innych stronach

Mam jeszcze małe pytanie odnośnie tego tematu.

Po otwarciu formy2 przez show tak naprawdę mamy dwa niezależne okna.

Co zrobić aby windows widział dwa okna?

Bo teraz widzi jedno i aby dostać się do tego drugiego, trzeba odkrywać okno

główne programu. Jest to trochę uciążliwe.

Link do komentarza
Udostępnij na innych stronach

Niebardzo rozumiem co chcesz osiągnąć. Jak formatki pokazujesz przez Show to masz dostęp do obu, a jak one

na siebie zachodzą to ustaw - o ile to możliwe (nie są za duże) - je tak aby się nie zasłaniały poprzez kod, a jak

chcesz mieć formatkę z osobną belką na pasku zadań - to można zrobić to w taki sposób jak tu widzisz poniżej.

//...
private
 procedure CreateParams(var Params: TCreateParams); override;
end;
//...
procedure TForm1.CreateParams(var Params : TCreateParams);
begin
 inherited;
 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Prawie dobrze...

To znaczy jak umieszczam te procedury w formach, które wywołuje przez show to w belce, windowsa zarejestrowane jest jako dodatkowe okno. Generalnie o to chodziło...

Jednak jest problem z oknem głównego programu. O ile w klikając na belce windowsa, na okna wywołane przez show bez problemu na te okna przechodzę, to gdy kliknę na okno główne to niestety nie uaktywniam tego okna. Z kolei gdy te procedury umieszczam na głównej formie, to na belce windowsa widzę dwa okna. O jedno więcej...

Link do komentarza
Udostępnij na innych stronach

Jak chcesz przełączać formatki po kliknięciu na ich belki tytułowe (nad formatką) to pokazywane musza być poprzez Show.

Natomiast jeżeli robisz ten "trick" z CreateParams na formatce głownej to nic dziwnego że masz dwie belki. Można to tak,

jak poniżej pokazuje obejść ale to mało sensowne - według mnie - bo kod z OnCreate niweluje efekt tego w CreateParams.

//... 
protected
   procedure CreateParams(var Params: TCreateParams); override;
//...
procedure TForm1.CreateParams(var Params : TCreateParams);
begin
 inherited;
 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...