logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Tworzenie dynamicznego TTimer i TButton w Delphi bez formy - jak to zrobić?

johny_84 18 Gru 2005 01:09 4079 7
REKLAMA
  • #1 2093687
    johny_84
    Poziom 16  
    Posty: 235
    Pomógł: 13
    Ocena: 3
    Witam

    Mam pytanie jak zrobic sobie timer i klikniecie guzika w delphi "dynamicznie" bez kladzenia na forme, bo czasem zalozmy ze nie mamy mozliwosci przewidzenia ile ich bedzie oraz jak obsluzyc klikniecie na guzik:

    var
        Timer: TTImer;
        Button: TButton;
    begin
     Timer := TTimer.Create(Self);
     Button := TButton.Create(Self);
    // i tak powiedzmy ze umiem wszystko oprocz zrobienia tego zeby czasomierz zmusic do odliczania
    // oraz klikniecia na guzik jak to zrobic
    end;


    Z gory dzieki za pomoc.

    Pozdro ;)
  • REKLAMA
  • #2 2093821
    SaraniS
    Poziom 26  
    Posty: 745
    Pomógł: 78
    Ocena: 26
    Witam
    O ile dobrze pamietam (a nie mam mozliwosci sprawdzic):
    
    Timer.Enabled := True; // True zeby "chodzil", false zeby zatrzymac
    Button.Click;
    


    PS. A wiesz o tym, ze obiekty, ktore stworzysz recznie, musisz rowniez recznie zniszczyc przy zakonczeniu programu? ;)
    Pozdrawiam :)
  • REKLAMA
  • #3 2094332
    johny_84
    Poziom 16  
    Posty: 235
    Pomógł: 13
    Ocena: 3
    No właśnie tak robie tak pokazujesz, ale ja chce jeszcze ten czas co mi sie zaczxnie odliczac bo ustawie sobie

    Timer.Interval := 1000;
    Timer.Enabled := True;


    no ale jak pobrac czas teraz takiego zegarka i wyswietlic? Tego jeszcze w zyciu nie robilem a mam pomysl na mala gierke i chce wlasnie tak tworzyc zegarki bo ich tam moze byc duzo potrzebne.

    A z tym Guzikiem to chce osluzyc wlasnie klikniecie, tylko jak bo nie moge napisac przeciez

    if (Button.Click) .....


    Jakbyś mógł to na jakimś przykładzie zobrazować top bylbym bardzo wdzięczny.

    Papatki ;)
  • REKLAMA
  • #4 2095635
    Jaro15l_90r
    Poziom 13  
    Posty: 84
    Pomógł: 4
    Nie da się odczytać czasu Timera. Trzeba stworzyć zmienną, którą Timer by powiększał np.:
    procedure Form1.Timer1Timer(Sender: TObject)
    var licznik: integer;
    begin
    Inc(licznik) // Znaczy to to samo co licznik := licznik + 1
    end;

    Ale nie wiem o co ci chodzi z przyciskiem. Czy akcja ma być przypisana do stworzonego w czasie działania aplikacji, czy już umieszczonego na formie przycisku? Jeżeli przycisk jest już stworzony (podczas edycji źródła) to przejdź na widok formy z tym przyciskiem i kliknij na nim dwa razy lub w Object Inspector przejdź na zakładkę Events, zaznacz przycisk i kliknij dwa razy na polu OnClick. Delphi stworzy procedurę i ty wpisz, co się ma dziać po kliknięciu przycisku np.:
    procedure Form1.Button1Click(Sender: TObject)
    begin
    Timer1.interval := 1000;
    Timer1.enabled := true;
    end;


    Pozdrawiam.
  • #5 2095791
    johny_84
    Poziom 16  
    Posty: 235
    Pomógł: 13
    Ocena: 3
    Dobrze wiec widze, ze tak nie mozna roztrzygnac problemu wiec zamieszczam kawalek kodu:

    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Guzik : TButton;
      Text : TLabel;
      Czas : TTimer;
    begin
      Guzik := TButton.Create(self);
      Text := TLabel.Create(self);
      Czas := TTimer.Create(self);
    
      with Guzik do
      begin
        Left := 100;
        Top := 25;
        Height := 35;
        Width := 160;
    //    Font.Height := 16;
        Font.Size := 12;
        Font.Style := [fsBold];
        Font.Color := clBlue;
        Caption := 'Odliczaj';// ten wlasnie stworzony guzik chce nacisnac zeby mi zaczal odliczac czas przez stworzony timer
      end;
    
      Czas.Interval := 1000;
      Czas.Enabled := true;
      Czas.Tag := Czas.Tag + 1;// jak odczytac czas takiego czegos
    
      with Text do
      begin
        Left := 100;
        Top := 100;
        Height := 35;
        Width := 160;
        Font.Size := 12;
        Font.Style := [fsBold];
        Font.Color := clBlue;
        Caption := IntToStr(Czas.Tag);//a tu mi wyswietla ten czas
      end;
    
    //  Guzik.OnClick(Sender);
    
    
      InsertControl(Text);
      InsertControl(Guzik);
    //nie niszcze obiektow
    end;//moze te obiekty powinny byc inaczej zadeklarowane :(
    

    Jejku widze ze natrafilem na powazny problem :( Ale moze ten kod cos rozjasni o co mi chodzi.

    Papa ;)
  • #6 2095953
    Sam Sung
    Poziom 33  
    Posty: 2026
    Pomógł: 227
    Ocena: 605
    Można zrobić tak. Definiujemy metodę obsługi zdarzenia tak jak pisał Jaro (Form1.Button1Click) i po stworzeniu przycisku przypisujemy
    Guzik.OnClick := Button1Click

    (oczywiście nazwę tej procedury można lepiej dobrać).
    Teraz obiekt Czas nie może być już zmienną lokalną, najlepiej zadeklarować go w sekcji private formularza. Wtedy też instrukcja IntToStr(Czas.Tag) będzie poprawna także poza FormCreate ;)
    Jeśli dodajesz utworzone kontrolki do formularza, to rzeczywiście nie trzeba ich samemu zwalniać.
    Nawiasem mówiąc, taki sposób odmierzania czasu w grze nie jest najlepszy. Lepiej byłoby napisac własną pętlę obsługi komunikatów, w niej odczytywać bieżący czas np. przez GetTickCount i podejmować decyzje co do akcji, która ma być podjęta (czasy nadchodzących zdarzeń można przechowywać w kolejce priorytetowej).
  • REKLAMA
  • #7 2115839
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    Witam

    Jeśli chcesz odmierzać czas to timer nie jest za dobrym pomysłem. Timer wykonuje sie co pewien ustalony czas ale jak wykonuje się jakaś procedura to timer się nie wykona. Trzeba poczekać jak ta procedura się skończy.

    Możesz to zobaczyć na przykładzie. Dodaj na forme label1 , button1 i timer1. Pod batton1.click napisz sleep(5000). Timerem1 wyświetlaj co sekunda coś na label1. Uruchom program i zobacz co się dzieje gdy naciśniesz na button1.

    Wykonywanie timer1 zostanie wstrzymane aż skończy się wykonywać procedura click.

    Lepszym rozwiązaniem jest zastosowanie wątków. O wątkach przeczytaj w Komputer Świat Ekspert 12/05.

    Pozdrawiam
  • #8 2261199
    johny_84
    Poziom 16  
    Posty: 235
    Pomógł: 13
    Ocena: 3
    Dzieki za odpowidzi. Koncze temat ;)

    Pozdro for all ;)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy tworzenia dynamicznych komponentów TTimer i TButton w Delphi bez umieszczania ich na formie oraz obsługi zdarzeń takich jak kliknięcie przycisku i odliczanie czasu. Aby uruchomić timer, należy ustawić właściwość Enabled na True oraz określić Interval w milisekundach. Timer sam w sobie nie przechowuje odliczanego czasu, dlatego konieczne jest stworzenie zmiennej licznikowej, którą w procedurze obsługi zdarzenia OnTimer zwiększa się o 1 lub inną wartość. Obsługa kliknięcia dynamicznie tworzonego przycisku wymaga przypisania procedury obsługi zdarzenia OnClick do właściwości Guzik.OnClick. Obiekty tworzone dynamicznie powinny być przechowywane jako pola klasy (np. w sekcji private formularza), aby można było nimi zarządzać poza lokalnym zakresem funkcji. Wskazano również, że timer w Delphi nie jest idealnym rozwiązaniem do precyzyjnego odmierzania czasu w grach, gdyż jego działanie jest wstrzymywane podczas wykonywania innych procedur. Zalecane jest wtedy użycie wątków lub własnej pętli obsługi komunikatów z wykorzystaniem funkcji GetTickCount do pomiaru czasu. Przykładowy kod pokazuje tworzenie przycisku, etykiety i timera dynamicznie, ustawianie ich właściwości oraz przypisanie zdarzeń. Podkreślono konieczność ręcznego zwalniania obiektów tworzonych dynamicznie, jeśli nie są dodane do formularza.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA