Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aktion darf nur alle 3 Sekunden ausgeführt werden. (https://www.delphipraxis.net/99369-aktion-darf-nur-alle-3-sekunden-ausgefuehrt-werden.html)

N30N 11. Sep 2007 09:14


Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Hi!

Ich bräuchte mal eure Hilfe. Ich will, dass eine bestimmte Aktion nur alle 3 Sekunden ausgelöst werden kann, sprich, wenn ich 2 mal innerhalb von 2 Sekunden auf den Button klicke, nur einmal was passiert.Nach 3 Sekunden ist es dann wieder "frei"


Wie kann ich das realisieren?

Klaus01 11. Sep 2007 09:17

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Guten Morgen,

beim ertsen klicken die Zeit speichern (GetTickCounts)
beim nächsten klicken wieder GetTickCount aufrufen und den Zeitunterschied
ermitteln. Ist er kleiner als 3 Sekunden -> mache nichts
Ist er größer oder gleich 3 Sekunden -> Zeit neu setzen und führe Aktionen aus.

Grüße
Klaus

angos 11. Sep 2007 09:19

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Hi,

da haste mehrere Möglichkeiten.

1.) Du kannst nen TTimer auf dein Formular ziehen und auf drei sekunden einstellen (interval=3000)

dann kannst du im Buttonklick
- den Timer Aktivieren
- Den Button disablen

im Timer kannst du
[edit=bug entfernt] - nachdem der timer einmal durchgelaufen ist den Button wieder Enablen[/edit]


2. Möglichkeit:
Suche mal nach Gettickcount, damit kannst du die Zeit abfragen die vergangen ist ;)

Es gibt wahrscheinlich noch mehr möglichkeiten


Gruß

pstruh 11. Sep 2007 09:22

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Moin, moin,
ja, so wie Klaus geschrieben hat! Vielleicht sollte alternativ (damit der Benutzer nicht verwirrt ist) der Button nach der ersten Click für 3 Sekunden gesperrt (disabled) werden, dann sieht der Anwender auch sofort, dass er in diesem Zeitraum keine Aktion auslösen kann
Gruß

TBx 11. Sep 2007 09:29

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
@angos: Der Timer braucht nur einmal durchlaufen zu werden, da Du das Interval bereits auf 3000 vorbesetzt.
@postruh: Welche Lösung favorisierst Du denn nun eigentlich? Erst schreibst Du, dass man es wie Klaus machen solle, dann gibst Du an, dass man den Button auch entsprechend disablen solte, was eindeutig die Lösung von angos ist :-)

Gruß

onlinekater

angos 11. Sep 2007 09:33

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Zitat:

Zitat von onlinekater
@angos: Der Timer braucht nur einmal durchlaufen zu werden, da Du das Interval bereits auf 3000 vorbesetzt.

wie peinlich... da war ich wohl wieder mit dem Kopf woanders als mit den fingern ^^ beitrag korrigiert

N30N 11. Sep 2007 09:35

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Also den Button disablen geht schonmal nicht ^^

Das ganze wird über eine externe USB Karte gesteuert, welche ihre eigenen Knöpfe hat.D.h.: Mein programm reagiert auf Knopfdrücke der Karte.


Ich werde mir mal Gettickcount anschauen in der Delphi Hilfe, wäre allerdings auch cool wenn es hier jemand besser als die Hilfe erklären kann.


//Edit: Also ich habe grade mal nachgeschaut, und die Delphi Hilfe hat leider keinen Eintrag zu dem Thema.

pstruh 11. Sep 2007 09:36

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Hallo, Zusammen!
Ich favorisiere die von mir vorgeschlagene Alternative, den Button für den Zeitraum zu sperren - finde ich benutzerfreundlicher :wink:

pstruh 11. Sep 2007 09:38

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Na, N3ON,
Klaus hat die Schritte aber wirklich gut vorgegeben, versuch's doch einfach mal...

N30N 11. Sep 2007 09:46

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Zitat:

Na, N3ON,
Klaus hat die Schritte aber wirklich gut vorgegeben, versuch's doch einfach mal...
Tut mir Leid, ich kriegs nicht hin, selbst wenn ich mich an die Anleitung halte.

Schon wenn ich versuche die Zeit zu speichern:

begin
Gettickcounts;


end;

bekomme ich ne Fehlermeldung.

Muss ich das vielleicht in eine Variable speichern oder so?

pstruh 11. Sep 2007 09:49

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Schreibe GetTickCount, mit Cursor 'draufgehen, F1 drücken, dann wird (bei mir) ein Hilfetext angezeigt. Ist 'ne Funktion, Ergebnis ist vom Typ DWord, gibt die Zeit in Millisekunden seit dem WindowsStart an. Also kannst du beim zweiten Aufruf die Zeitdifferenz in Millisekunden bestimmen...

pstruh 11. Sep 2007 09:50

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Ja klar, vom Typ DWord :wink:

N30N 11. Sep 2007 09:58

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Delphi-Quellcode:
  begin
    Test := Gettickcount;
    Ergebniss := Gettickcount - Test;
    if Ergebniss > 3 then
      shellexecute(handle,'open',pchar('mplayerc.exe'),pchar(video1),nil,sw_show);
    end;
Meint ihr das stimmt so?

pstruh 11. Sep 2007 10:01

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Hm, die Prüfung ergibt wohl alle drei Millisekunden ein TRUE, also besser 3*1000 ...

pstruh 11. Sep 2007 10:02

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
ach so, dann auch noch den StartZeitpunkt zurücksetzen, d.h. neu lesen

pstruh 11. Sep 2007 10:04

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Ja, und überhaupt - du darfst natürlich nicht direkt hintereinander 2x GetTickCount lesen, das geht ja nun leider überhaupt nicht ...
Lese doch bitte noch mal in Ruhe die Handlungsvorgabe von Klaus!

N30N 11. Sep 2007 10:27

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Zitat:

beim ertsen klicken die Zeit speichern (GetTickCounts)
beim nächsten klicken wieder GetTickCount aufrufen und den Zeitunterschied
ermitteln. Ist er kleiner als 3 Sekunden -> mache nichts
Ist er größer oder gleich 3 Sekunden -> Zeit neu setzen und führe Aktionen aus.
Wie schon gesagt, das ist einfach zu hoch für mich. Geht es auch etwas verständlicher, wenn möglich in Code Form? Wenn ich Code sehe, hilft mir das immer am Meisten.

pstruh 11. Sep 2007 10:31

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Hm, im Prinzip gern, musst aber noch ein bisschen warten (habe jetzt einen Bürotermin) Vielleicht hilft in der Zwischenzeit ja ein Anderer. Schaue aber nachher noch mal 'rein und helfe sonst gern weiter.
Gruß

N30N 11. Sep 2007 10:37

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Also ich hab folgende globale Variablen:

Delphi-Quellcode:
  Zeit : integer;
  Zeit2 : integer;
  Ergebniss: integer;

Dann habe ich bei der Formcreate folgendes eingetragen:

Delphi-Quellcode:
  Zeit := Gettickcount;

In meiner Abfrage steht folgendes:

Delphi-Quellcode:
begin
    Zeit2 := Gettickcount;
    Ergebniss := Zeit - Zeit2;
    if Ergebniss > 3000 then
    shellexecute(handle,'open',pchar('mplayerc.exe'),pchar(video1),nil,sw_show);
    Zeit := Gettickcount;
  end;

Es geht nicht. Irgendwo hab ich nen Logikfehler. Das Video startet nicht einfach nicht.

mschaefer 11. Sep 2007 10:42

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
< -3000

pstruh 11. Sep 2007 10:46

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Sehr schön: Besprechung fällt aus! Tja, also wie wäre es, wenn du die Subtraktion mal anders herum ausführst? Zeit2 - Zeit (hihihi) Ausserdem kannst du kürzen ..
Delphi-Quellcode:
if GetTickCount-Zeit>3000 then ...

N30N 11. Sep 2007 10:52

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
lol, es funktioniert ja tatsächlich.

Ich verstehe nur noch nicht so zu 100% warum das so ist. Zeit müsste doch nen höheren Wert haben als Zeit2 oder etwa nicht?

Naja, falls es noch Probleme gibt, meld ich mich :>


//Edit:

Also, es beinflusst nicht die Arbeitsweise des Programms, allerdings bekomme ich noch Fehlermeldungen:

Zitat:

Erzeugen
[Warnung] K8055.pas(94): Vorzeichenbehaftete und -lose Typen werden kombiniert - beide Operanden werden erweitert
Die Zeile ist folgende:
Delphi-Quellcode:
if GetTickCount-Zeit>1500 then
Wie kann ich das ändern?

Klaus01 11. Sep 2007 11:04

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Kommt die Meldung auch noch, wenn Du Zeit als Cardinal deklarierst?

Grüße
Klaus

pstruh 11. Sep 2007 11:05

Re: Aktion darf nur alle 3 Sekunden ausgeführt werden.
 
Also, verwende den Datentyp DWORD und nicht Integer! Übrigens, ist schon logisch so: Der Wert für ZEIT lliegt in der Vergangenheit und ist daher kleiner als die aktuelle Zeit, die du mit GetTickCount erhälst. Noch viel Spaß beim "Weiterbasteln" :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz