[Anfrage] Möchte Stoppuhr mit USB Button und Eingabeformular programmieren

  • ....

    Muecke :

    Ich hoffe, die ganze Diskussion wird für Dich nicht zu verwirrend. Manchmal entwickelt ein Thread eine gewisse Eigendynamik;)

    Gruß Musashi

    Alles gut, ich verfolge das Thread hier immer noch, und bin auch noch daran das Formular zu Bauen, da sich in zwischen fertig habe und an der Speicher Routine bin :) (Fast fertig nur noch ein paar Sachen muss ich nachlesen)

    ich finde es sehr spannend wie Ihr euch alle austauscht, es ist ja nicht so das hier sich gegenseitig die Köpfe eingeschlagen wird, ich sehe das aus einer ganz anderen Perspektive des Austausches und das miteinander Diskutieren und das finde ich genial, nur gemeinsam ist man Stark, und warum nicht davon lernen. :)

    melde mich später wider mit dem neuen Code :)

    gruß Mücke

  • So jetzt habe ich hoffentlich alles was Ihr geschrieben habt noch in meinem Code ausgewechselt, so das die Uhr jetzt auch deutlich schneller laufen kann ;)

    (mich hatte das irgend wie nicht gestört gehabt)

    ich habe das Formular jetzt mit drin und es wird auch gespeichert, ich bekomme es nur nicht hin die Formularfelder nach dem Speichern wider zurück zu setzen :(

    Was muss ich da machen?

    Muss ich das GUICtrlCreateInput bearbeiten? mit GUICtrlSetData ? oder macht man das anders?

    so langsam wird der Code lang :( und unübersichtlich finde ich.

    ps. ich bin am überlegen ob die die Sleep Funktion von beginn wider einbauen soll, ich fand das eine echt coole Spielerei :) aktuell steht Sleep auf 44.

    Gruß Mücke

  • Hallo Muecke, muss dich leider nochmal entäuschen, es lauft noch 1 Ding in deinem Script fehlerhaft.

    Achja und es wird wirklich langsam unübersichtlich.

    In der Funktion HotKeyPressed solltest du dir einen Weg überlegen um direkt beim Beenden der Stoppuhr die Aktuelle Zeit zu ermitteln, denn was bringen schon Millisekunden wenn sie denn nicht stimmen.

    Momentan würde die Gesamtzeit bei Spielende durch die Sleep-Time verfälscht, das wären zwar hier nicht allzuviel aber falsch ist eben falsch.

    Aber den Sleep auf jeden Fall drin lassen, sonst hast nur unnötige CPU-Last.


    Stoppuhr-GUI5.au3

    7 Mal editiert, zuletzt von Tuxedo (4. Dezember 2018 um 08:06)

  • Hallo Muecke, muss dich leider nochmal entäuschen, ...toppuhr-GUI5.au3

    Grundsätzlich so etwas ist keine Enttäuschung sonder Bug Bewältigung ;) ist doch gut wenn etwas auffielt und so das Programm runder und sauberer wird.

    Jedoch kann ich dir nicht ganz folgen. Bitte hilf mir etwas auf die Sprünge:

    In der Funktion HotKeyPressed solltest du dir einen Weg überlegen um direkt beim Beenden der Stoppuhr die Aktuelle Zeit zu ermitteln, denn was bringen schon Millisekunden wenn sie denn nicht stimmen.

    Momentan würde die Gesamtzeit bei Spielende durch die Sleep-Time verfälscht, das wären zwar hier nicht allzuviel aber falsch ist eben falsch.oppuhr-GUI5.au3

    In Zeile 170 wird doch die Bildschirmzeit in die Variable $Player_Zeit geschrieben, und die $Player_Zeit wird dann im Formular dargestellt wie auch gespeichert.

    Diesen weg habe ich mit Absicht so gewählt, denn wenn am Monitor eine andere Zeit steht als die im Formular würde sich der Spieler aufregen und sagen das gemogelt wird, und das wollte ich vermeinten.

    Sollte ich mit meiner Annahme daneben liegen, sag beschied.

    Aber den Sleep auf jeden Fall drin lassen, sonst hast nur unnötige CPU-Last.

    Drin lassen möchte ich diesen schon, im Quellprogramm von Bitnugger war jedoch eine Möglichkeit eingebaut die Sleep zeit im laufe des Timers zu verändern das finde ich ganz witzig, denn so könnte man die Geschwindigkeit der Aktualisierung an den Rechner auf dem das Prog laufen tut anpassen :)


    Du kannst den Inhalt eines Controls mit GUICtrlSetData setzen, das solltest du machen nachdem die GUI erzeugt wurde aber bevor sie angezeigt wird.

    Alles klar dann wies ich was ich machen muss. Danke.


    PS. wie bekomme ich meinen Code etwas übersichtlicher dargestellt?

    Ich finde das in zwischen echt durcheinander. Habt Ihr eine Idee?


    gruß Mücke


    [EDIT]

    Angenommen ich würde alle Funktionen für die erstellen der GUI in eine Seerate Datei parken kann ich die dann mit include wider einbinden?

    habe das getestet, doch das Programm funktioniert auf den ersten blick, der Compiler meint jedoch das die Globalen Variablen nicht deklariert wären :( in der importierten Datei.

    macht man das anders? oder auf was muss ich achten?

    naja, ein nach dem anderen jetzt schaue ich erst das mein Formular wider auf Anfang sich setzt sobald alle werte gespeichert wurden.

    Einmal editiert, zuletzt von Muecke (4. Dezember 2018 um 16:44)

  • So das Formular wird jetzt auch wider zurück geätzt, ich habe mit den Labels

    $idLabelCheckbox_2 = GUICtrlCreateCheckbox($Text, $X, $Y, $Breite, $Hohe, $Style)

    ein Problem.

    Wenn die einmal angeklickt waren bekomme ich die nicht wieder zurück gesetzt, sprich so das als wenn sie nicht angeklickt waren.

    ich schaffe es den Label text zu ändern doch das wollte ich nicht :(


    Erstellt werden 3 Stück in der Func _GUI_Formular() dort ganz unten.


    Status Änderung sollte in der Func _Formular_Speichern() (auch ganz unten, stattfinden.


    könnte mir da jemand weiterhelfen?

    ps. ich habe den Programm Code etwas durch gemischt und Größere Blöcke Kommentar eingefügt, das man eher sieht wo was anfangen tut und wo aufhören.

    Gruß Mücke

    [EDIT] Frage von oben hat sich erledigt. habe gerade was gefunden anstelle von GUICtrlSetData() verwendet man hier GUICtrlSetState() Befehl/Makro.


    jetzt kann ich mich dran machen und die INI Datei anbinden :)

  • Hallo Muecke, Ich wollte dir mit meinem letzten Hinweis nur helfen auch ein genaues Endergebnis zu bekommen.

    Da ja die Anzeige per Sleep kontrolliert wird was ja gut ist, solltest du eben beim Endergebnis nicht den Anzeigewert sondern

    die volle verfügbare Genauigkeit verwenden. Sonst hättest du dir die Millisekunden ja sparen können.

    Die Anzeigewerte sind ja begrenzt, da hast du pro Sekunde nur ca. 25 verschiedene Werte zur Auswahl, dann könntest ja eigentlich gleich

    nur Zehntelsekunden zur Berechnug verwenden.

    Allerdings hast du damit Recht, daß dann wenn du die volle Genauigkeit fürs Endergebnis nimmst, der Endwert noch

    ein paar Millisekunden mehr anzeigt als die vorherige Anzeige. Aber ich nehme mal an bei dem Spiel spielen keine Roboter mit,

    ein Mensch wird wohl kaum einen so schnellen Blick haben. Abgesehen davon ist ja deine Anzeige auch schon eine

    optische Täuschung, denn du zeigst ja nur ca. 25 Werte pro Sekunde und nicht 1000.

    Beim Skifahren im TV werden ja auch nur ich glaube Zehntelsekunden während der Fahrt gezeigt und wenns gegen

    eine Auswertung zugeht wird erst die volle Genauigkeit angezeigt(und die tatsächliche Zeit ist erst im Endergebnis sichtbar).

    Ich bin eben der Meinung, wenn du deine Mitspieler nicht täuschen willst, solltest du im Endergebnis die tatsächliche Zeit

    verwenden nicht die aus der Play Anzeige.

    Dazu brauchst du ja kaum etwas ändern, nur vor der Anzeige der Endzeit(in der HotKeyPressed Funktion) nochmal

    die _GetTime aufrufen bevor du $g_sTime = ... auswertest, und schon passt es.

    Was genau willst du eigentlich mit dieser Stoppuhr für Zeiten messen? Du hast noch etwas von Audiofiles erwähnt.

    Willst du etwa die Zeit messen bis ein Audiofile erkannt wird oder sowas in der Art?

  • Hey Tuxedo,

    das leuchtet irgend wie ein, was du da sagst. muss ich mir noch mal durch den Kopf gehen lassen.


    Was das Wird.

    Wir haben auf einem Messestand ein Kleines Spiel da muss der User etwas zusammen bauen, und diese Zeit wollen wir Stopfen, der bester Player am Tag kann dann was gewinnen.

    Die Musik Untermalung war z.B. für so was gedacht

    https://www.youtube.com/watch?v=Y4QbJRAWvRU

    von der zeit ca. 0:53 bis ca. 0:57 Minuten.

    Als Dauerschleife.


    ich mache mir mal Gedanken heute dazu mit der zeit anzeige, und dann würde ich die INI Datei noch erstellen und einbinden.

    Danach kümmere ich mich um die Hintergrund Bilder und danach um die Musik :)

    jetzt gerade so beim Schreiben gefällt mir die Idee nur zwei nachkommastellen anzuzeigen jedoch beim Speichern 3 nachkommastellen zu haben.

  • Die Musik Untermalung war z.B. für so was gedacht

    Hi Muecke !

    Ist zwar etwas Off-Topic, aber :

    Solltet ihr planen auf einem Messestand (also gewerblich) Musik zu spielen, dann prüft unbedingt vorher Musikrechte, GEMA usw. ab. 'Yello-The Race' unterliegt diversen Schutzrechten, der Spaß kann also teuer werden. Alternativ suche mal nach GEMA/rechtefreier Musik.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • jetzt gerade so beim Schreiben gefällt mir die Idee nur zwei nachkommastellen anzuzeigen jedoch beim Speichern 3 nachkommastellen zu haben.

    Dazu kann ich dir einen Tipp geben, falls du dir selbst eine Lösung stricken willst statt meine zu verwenden, was ja zum Lernen ganz gut

    wäre (ausserdem führen viele Wege nach Rom).

    Pass auf, daß du auch wirklich die Zehntel Sekunden aus dem String pickst und nicht etwa

    zwei Ziffern aus z.B. dem Nano, Piko oder Femto Sekunden Bereich.

    Durch den Sleep sehen diiese falschen Ziffern nämlich auch wie die echten Zehntel aus,

    bei der Suche nach meiner Lösung lag ich auch 2-3 mal falsch.

    Das kannst du gut überprüfen indem du, wenn du glaubt die Lösung gefunden zu haben, ein paar Durchläufe machst

    aber mit einem Sleep von z.B. "5 ms".

    Wenn die Zehntel Sekunden sich dann immer noch verhalten wie Zehntel Sekunden, hast du es richtig gemacht und kannst es fixieren.

    Deine Stoppuhr entwickelt sich langsam zu einem Großprojekt was?


    Viel Spaß noch

    Tuxedo

  • So die INI Datei habe ich jetzt mit eingebunden man kann somit über die INI Datei jetzt das aussehen des Programms beeinflussen.

    Daher gibt es einen Neuen Code inklusive einer INI Datei im Anhang.

    Ich habe auch die Idee von Tuxedo für die Übernahme der tatsächlichen zeit übernommen.

    Wobei noch immer 3 Stellen angezeigt werden beim Spielen. (das mit den zwei stellen mache ich auch noch Später).

    Was mir aufgefallen ist, wenn ich zwischen den GUI`s umschalte dann sehe ich für einen Bruchteil immer meinen Desktop das möchte ich nicht,

    daher habe ich die Func _GUI_setzen() überarbeitet.

    Ich blende zuerst die Neue GUI ein und dann blende ich die alten GUI`s alle aus.

    Beim Schnellen hin und her springen kommt immer noch ab und an der Desktop durch :( naja das ist dann jetzt so.

    Als nächstes baue ich die Bilder ein, so das man der GUI auch ein Hintergrund Bild geben kann. (das mache ich aber erst heute Abend schätze ich.

    Deine Stoppuhr entwickelt sich langsam zu einem Großprojekt was?

    so könnte man das auch ausdrücken, sie bekommt immer mehr Dinge implementiert :) bis sie so ist wie ich sie im Kopf mir vorgestellt hatte.

    Das das ganze sich so lange hinzieht hätte ich jedoch zu beginn nicht gedacht.


    Gruß Mücke


    ps. INI Dateien können scheinbar nicht hochgeladen werden, daher muss die Endung von .txt auf .ini wider bei euch geändert werden !

  • Hallo miteinander,

    Jetzt habe ich die Hintergrunde mit eingebaut.

    Zwei Dinge bekomme ich nicht zum laufen bzw. eins kann ich mir nicht erklären :(

    Da ein Hintergrund (Bild) gesetzt wurde habe ich alle Label`s den Hintergrund auf transparent gestellt, das klappt auch bis auf die GUICtrlCreateCheckbox wie kann ich hier den Hintergrund auf transparent stellen?

    Das andere ist, wenn ich bei der Func _GUI_Formular() einen Hintergrund erfolgreich gesetzt habe kann ich das Formular nur noch mit der Tastatur ansteuern, die Maus geht dann nicht mehr ;( (also ich kann die Felder nicht mehr auswählen)

    Was mache ich da Fehlerhaft?

    gruß Mücke

    ps. da jetzt die INI Datei und das Programm sich geändert haben wider beide Datei im Anhang.

    aus .txt muss wider .ini gemacht werden.

    Die Bilder für den Hintergrund müssen in den Programmordner/Wallpaper stehen.

    Die Betreffenden Zielen sind

    396 und 519


    Code Ausschnitt:

    C
    Func _GUI_Formular()
    $ID_GUI_Formular =     GUICreate("Sleep-Timer", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)                         ; GUI erstellen
                        GUISetBkColor($GUI_Formular_BG_Color, $ID_GUI_Formular)                                         ; GUI Background Color
                        GUISetFont($GUI_Formular_Font_Size, $FW_NORMAL, $GUI_FONTNORMAL, "Calibri", $ID_GUI_Formular)     ; GUI Schriftgröße und Art Einstellen
                        GUICtrlCreatePic($GUI_Formular_BG_Pic, 0, 0, @DesktopWidth, @DesktopHeight)                        ; GUI BG laden

    ...

    Gruß Mücke

    • Offizieller Beitrag

    Jetzt habe ich die Hintergrunde mit eingebaut.

    Nur mal so als Hinweis:

    Bitte poste nicht xxx Versionen von Deinem Programm, wenn es nicht für das Problem unausweichlich ist.

    Im Allgemeinen machen wir das so, dass die jeweils aktuelle Version in Post#1 gepostet wird (Beitrag bearbeiten, altes Programm löschen, neues Programm hochladen).

    Du kannst dann gern noch einen Beitrag hintendran schreiben, damit der Thread als neu gekennzeichnet wird.

  • Hallo Muecke !

    Wg. Transparenz bei Checkboxen könntest Du so etwas machen - nach einem Vorschlag von UEZ

    EDIT : Beispiel um Variante mit Zeilenumbruch erweitert, also $BS_MULTILINE

    siehe ggf. auch : https://www.autoitscript.com/forum/topic/12…arent-checkbox/

    EDIT2 :

    Zusätzlich zu dem Hinweis von Oscar in Beitrag #55 wäre es hilfreich, wenn Du dem Dateinamen eine Versionsnummer anfügen würdest, also z.B. Stoppuhr-GUI-V3.au3.

    EDIT3 :

    Muecke :

    Hmm, ich erhalte auch eine transparente Checkbox (also den Text, nicht das Kästchen) ohne den

    DLL-Aufruf, einfach mit :

    Code
    $iCheckbox_One = GUICtrlCreateCheckbox("Checkbox 1", 15, 50, 300, 20)
    ;~ DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($iCheckbox_One), "wstr", 0, "wstr", 0)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    5 Mal editiert, zuletzt von Musashi (6. Dezember 2018 um 17:51) aus folgendem Grund: Zeichen ergaben zufällig ein :( , erweitert um einen Link , erweitert um Multiline

  • Hallo Oscar , alles klar werde ich so machen. Danke für den Hinweis.

    Musashi , das mit dem einbinden der dll hat gut geklappt, danke.

    Jetzt ist nur noch das Problem das ich mit der Maus das Formular nicht mehr anwählen kann sobald das Hintergrund Bild geladen ist.

    ich habe ein kleinen Muster Code gemacht, der das verdeutlicht.

    wenn man Zeile 20 raus nimmt, oder das Bild nicht gesetzt werden kann dann kann das Formular mit der Maus angewählt werden.

    Sobald ein Bild jedoch gesetzt werden konnte kann man das Formular nicht mehr mit der Maus bedienen.

    Woran liegt das?

    was muss ich machen das ich trotz Bild die Maus verwenden kann?

    Ihr müsst im Programm Ordner einfach ein Bild mit dem Namen Wallpaper.bmp das wird dann geladen und automatisch auf Desktop Größe gestreckt.

    gruß Mücke

  • Hallo Muecke !

    Musashi , das mit dem einbinden der dll hat gut geklappt, danke.

    Wie ich in EDIT3 meines Beitrages #56 geschrieben habe, geht es offenbar auch ohne DLL-Aufruf !

    Was passiert bei Dir, wenn Du folgendes Testskript laufen lässt ?

    Bei mir liefert das folgendes Ergebnis :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wow, das klappt danke.

    kann mir da noch jemand was zu sagen, mit der Aussage aus der Hilfe kann ich nichts anfangen :(

    C
    GUICtrlSetState(-1, $GUI_DISABLE)
    ; Ändert den Status des Steuerelements. ==> Die Kontrolle wird ausgegraut.

    Musashi warum das bei dir Ohne DLL geht verstehe ich nicht, bei mir klappt dein Beispiel leider nicht :(

    Gruß Mücke

  • kann mir da noch jemand was zu sagen, mit der Aussage aus der Hilfe kann ich nichts anfangen

    Du änderst den Status des PicControls auf disabled, also sind Interaktionen (Events) damit nicht möglich, folglich gehen die Klicks die du auf das Bild sendest mehr oder weniger "durch" egal ob nun das Bild zuerst erstellt oder danach erstellt wurde.