sybic Napisano Luty 19, 2010 Zgłoś Share Napisano Luty 19, 2010 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 More sharing options...
olesio Napisano Luty 20, 2010 Zgłoś Share Napisano Luty 20, 2010 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 More sharing options...
sybic Napisano Luty 20, 2010 Autor Zgłoś Share Napisano Luty 20, 2010 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 More sharing options...
Integer Napisano Luty 20, 2010 Zgłoś Share Napisano Luty 20, 2010 Visible:= False; załadować komponenty Visible:= True; ? Link do komentarza Udostępnij na innych stronach More sharing options...
sybic Napisano Luty 21, 2010 Autor Zgłoś Share Napisano Luty 21, 2010 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 More sharing options...
Integer Napisano Luty 21, 2010 Zgłoś Share Napisano Luty 21, 2010 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 More sharing options...
valhallaman Napisano Marzec 1, 2010 Zgłoś Share Napisano Marzec 1, 2010 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 More sharing options...
sybic Napisano Marzec 3, 2010 Autor Zgłoś Share Napisano Marzec 3, 2010 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 More sharing options...
olesio Napisano Marzec 3, 2010 Zgłoś Share Napisano Marzec 3, 2010 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 More sharing options...
sybic Napisano Marzec 4, 2010 Autor Zgłoś Share Napisano Marzec 4, 2010 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 More sharing options...
olesio Napisano Marzec 4, 2010 Zgłoś Share Napisano Marzec 4, 2010 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.