Zastopowowanie programu

Zastopowowanie programu
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Postaram się jak najlepiej opisać mój problem, mam nadzieję że zrozumiecie.

Mam pętle, która sprawdza warunek dla każdego I. Jeżeli warunek jest spełniony to tworzę nową formę, w której mam TCheckGroup. Chciałbym by w momencie tworzenia nowej formy dalsza część procedury się nie wykonywała, a czekała na reakcję na nowej formie. Opcje wybrane w TCheckGroup mają być przekazane do funkcji, wraz z I. Jeśli nie zatrzymam wykonywania procedury do czasu reakcji na nowej formie to I się zwiększa aż do maksymalnej zadeklarowanej wartości. A w przypadku spełnienia warunku po raz drugi wartości TCheckGroup od razu sie dublują.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
2

ShowModal


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Z opisu widzę że dokładnie o to chodzi, natomiast szczerze mówiąc nie wiem jak tego użyć. Mam coś takiego:

Kopiuj
 
for I := 1 to IloscTerminow do
    begin
      if Dzien = Terminy[I] then
        begin

          Program.Hide;

          PanelWyboru := TForm.Create(Application);
          with PanelWyboru do
          begin
            Show();
            Width := Program.Width;
            Height := Program.Height;
            Left := Program.Left;
            Top := Program.Top;
          end;

          with ListaWyboru do
          begin
            Parent := PanelWyboru;
            Height := Parent.Height - 50;
            Left := 0;
            Top := 0;
            Visible := True;
          end;

          AssignFile(Plik, 'config/cpeople.txt');
          Reset(Plik);
          try
            repeat
              ReadLn(Plik);
              ReadLn(Plik, Napis);
              Imie := StringReplace(Napis, 'First Name = ', '', []);
              ReadLn(Plik, Napis);
              Nazwisko := StringReplace(Napis, 'Last Name = ', '', []);
              ListaWyboru.Items.Add(Imie + ' ' + Nazwisko);
              for J := 1 to 16 do
                ReadLn(Plik);
            until EOF(Plik);
          finally
            CloseFile(Plik);
          end;


          PrzyciskWybierz.Show;

          with PrzyciskWybierz do
          begin
            Left := 50;
            Top := Parent.Height - 50;
            Caption := 'Wybierz';
            Parent := PanelWyboru;
          end;



          // w tym miejscu chciałbym zatrzymać działanie programu aż do uzyskania wyniku z PanelWyboru

          PanelWyboru.ShowModal; // ??

        end;
    end; 
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:minuta
1
  • jeśli showmodal na końcu pętli to po co show na jej początku ?
  • w pętli tworzysz formę ale jej nie zwalniasz
  • nie prościej utworzyć w IDE nową klasę dziedziczącą z TForm zawierającą wszystkie potrzebne kontrolki , zamiast "rzeźbić" to z poziomu kodu ?

klasa **TForm **ma metodę showmodal która zwraca wartość typu Integer
czyli

Kopiuj
exitCode:=forma.showmodal;

a pod button zamykający formę wyświetloną przez showmodal podpinasz akcję

Kopiuj
self.modalresult:= fResult;

jeśli fResult jest różne od zera to forma się zamyka i w zmiennej exitCode masz wartość fResult
w ten sposób , w zależności od wartości exitCode możesz sterować dalszym działaniem programu , np przyjmując że exitCode =13 (VK_return) oznacza zatwierdzenie treści formy , a 27 (VK_escape) odrzucenie jej

edytowany 3x, ostatnio: grzegorz_so
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
2

@dani17 - nie użwaj słów kluczowych do nazywania obiektów; PanelWyboru jest tworzony, ale nie jest zwalniany, więc masz wyciek pamięci; Kolejna rzecz:

Kopiuj
PanelWyboru := TForm.Create(Application);
with PanelWyboru do
begin
  Show();
  Width := Program.Width;
  Height := Program.Height;
  Left := Program.Left;
  Top := Program.Top;
end;

Ktoś nie zna metody SetBounds i właściwości BoundsRect; W Twoim przypadku wystarczy tyle:

Kopiuj
PanelWyboru := TForm.Create(Application);
PanelWyboru.BoundsRect := Program.BoundsRect;
PanelWyboru.Show();

Przy czym najpierw ustala się rozmiar komponentu lub okna, a dopiero potem pokazuje się go na ekranie; W przeciwnym razie może migać;

Następny kod:

Kopiuj
with ListaWyboru do
begin
  Parent := PanelWyboru;
  Height := Parent.Height - 50;
  Left := 0;
  Top := 0;
  Visible := True;
end;

Również można go napisać inaczej:

Kopiuj
ListaWyboru.Parent := PanelWyboru;
ListaWyboru.SetBounds(0, 0, ListaWyboru.Width, Parent.Height - 50);
ListaWyboru.Show();

Użycie metody SetBounds jest zalecane, bo powoduje tylko jedną akcję zmiany rozmiaru; Ustawianie każdego rozmiaru/pozycji osobno, powoduje wielokrotne wywołanie wewnętrznych metod zmieniających rozmiar i położenie, ustawiających wymiary i położenie komponentów zagnieżdżonych oraz przemalowujących płótno; W rezultacie kod wykonuje się 4x dłużej; Poza tym, do pokazywania i ukrywania komponentów/okien używaj albo pary metod Show i Hide, albo właściwości Visible; Po to, aby było jednolicie;

Przy czym z właściwości Visible korzystaj tylko w przypadku, gdy to czy komponent/formularz pokazać czy ukryć, nie da się określić na poziomie pisania kodu (np. gdy widoczność elementu określa wartość jakiejś zmiennej);

Kopiuj
AssignFile(Plik, 'config/cpeople.txt');
Reset(Plik);
try
  repeat
    ReadLn(Plik);
    ReadLn(Plik, Napis);
    Imie := StringReplace(Napis, 'First Name = ', '', []);
    ReadLn(Plik, Napis);
    Nazwisko := StringReplace(Napis, 'Last Name = ', '', []);
    ListaWyboru.Items.Add(Imie + ' ' + Nazwisko);
    for J := 1 to 16 do
      ReadLn(Plik);
  until EOF(Plik);
finally
  CloseFile(Plik);
end;

Co to za pieroństwo? Użyj jakiegoś API do plików konfiguracyjnych, zamiast ręcznie je rzeźbić... Z tego co widzę po kodzie, spokojnie wystarczą Ci pliki INI;

A jeśli o samo okno chodzi to nie rozumiem czego nie rozumiesz; Okno otwarte za pomocą metody ShowModal po prostu zatrzyma działanie bieżącego kodu, aż do momentu zamknięcia takiego okienka (w dowolny sposób); Zamknięte okienko nadal istnieje w pamięci, więc dalszy kod (ten chwilowo zatrzymany) może odczytać z niego dane; W ten sposób robi się własne okna dialogowe, tyle że całość opakowuje się w klasę sterującą i wygodnie zwracającą dane z okienka (kopiuje sobie dane z formularza do swoich pól, zanim zwolni obiekt okna z pamięci).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 7x, ostatnio: flowCRANE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.