2009-09-30 7 views
6

Miałem zwykły spacer wokół SO i natknąłem się na dyskusje o ramkach.Jaki jest akceptowany sposób używania ramek w Delphi?

jestem głównie hobbystów Delphi, a nie profesjonalny, więc musiałem nauczyć się korzystać TFrames mój własny sposób czarownica jest:

  • Tworzenie TFrame środku jest jednostka.
  • Dodaj tę jednostkę do głównego formularza Używa klauzuli.
  • dysponują zmienną tego TFrame typ
  • OnCreate formularza instanciates TFrame i przywiązuje go do TPanel zarówno na Tworzenie i .Parent
  • Na jednym z moich działań określonych że TFrame.Visible: = True i .BringToFront.

To jest moja praktyka po osobistej naradzie.

Jakie inne sposoby można użyć ramek?

Odpowiedz

13

To jeden sposób i nie ma w tym nic złego. Innym sposobem jest robienie tego wizualnie. Możesz więc w zasadzie dodać ramkę do formularza. Aby to zrobić:

  • Utwórz ramkę.
  • Przejdź do formularza, w którym chcesz umieścić ramkę.
  • Dodaj element ramy (karta Standard)
  • Wybierz ramkę z menu rozwijanego.
  • To wszystko!
+3

Jest to również moja preferowana metoda, ale w pewnych okolicznościach uważam za przydatne tworzenie ramek "na żądanie". Zwłaszcza w przypadku ramek, które są używane jako część kontrolki z zakładkami i mogą nigdy nie zostać pokazane. –

+0

@ sveinbringsli: tak, to też byłaby moja myśl. Zbyt dużo pamięci, aby je utworzyć, jeśli użytkownik użyje tylko jednego lub dwóch. –

4

Możesz nawet pójść o krok dalej, rejestrując swoje ramki jako komponenty.

To uniemożliwia edytowanie właściwości komponentów na ramce, gdy tylko składnik Ramka znajdzie się w formularzu. Ale myślę, że to dobrze.

Potrzebujesz jeszcze jednej rzeczy, niż zarejestrowanie ramki jako komponentu, co wyjaśnię w tym artykule na temat Delphi – Frames as visual Components – don’t forget your Sprig!.

Ta wiedza nie jest moja: dostałem ją od Ray Konopka podczas jednego z jego session s w Delphi Live conference w San Jose na początku tego roku.

1

To jest bardziej negatywna odpowiedź, ale wypróbowałem trasę, która obejmowała reparenting TFrames dla nieco skomplikowanego GUI.

Początkowo wszystko poszło dobrze, ale kiedy aplikacja się rozwinęła i więcej zdarzeń zaczęło latać, musiałem wyłączyć, a następnie przetwarzać komunikaty na jakiś czas (20 ms) przed zmianą, a następnie od czasu do czasu zdarzały się awarie podczas zmiany ramki.

Jeden z winowajców, który ostatecznie znalazłem, TPopmenu również rejestruje się w globalnych strukturach danych. To zmniejszyło problemy, ale wciąż tam były, więc odejdę od tej koncepcji.

+0

Yeids, ma sens. Jeśli masz zbyt wiele klatek, coś zdecydowanie się zepsuje. –

+0

To więcej, istnieje ryzyko, że komunikaty Windows dla ramki pojawią się mimo, że ramka została ponownie nadana. –

5

Jedyny problem z podejścia jest to, że nie można dodać wiele wystąpień tej samej ramce do danej postaci:

Frame1 := TMyFrame.Create(Self); 
Frame1.Parent := Self; 
// ... 
Frame2 := TMyFrame.Create(Self); // bombs out with "a component with the name MyFrame already exists" 

Rozwiązaniem dla jego jest przypisać inną nazwę dla każdej instancji:

Frame1 := TMyFrame.Create(Self) 
Frame1.Parent := Self; 
Frame1.Name := "FirstFrame"; 
// ... 
Frame2 := TMyFrame.Create(Self); // works now, there is no name conflict 
+0

Dzięki za pomysł. Zwykle potrzebuję tylko jednej klatki na funkcję, ale stanie się to wkrótce, gdy potrzebuję wielu instancji. Dziękuję Ci!! –