Beiträge von Kanashius

    Da du dir ein Google-Sheet selbst exportierst würde ich einwerfen:


    1. Exportier es als .csv (File->Download->Comma seperated values)

    2. .csv Datei einlesen (FileRead) und mit Text-Verarbeitung (RegExp) auslesen

    3. Gui erstellen mit einem Suchfeld für die IMEI und einer anzeige für das Suchergebnis (Es gab auch vor kurzem einen Thread zum einlesen mit Scannern: RE: Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen)

    4. Mit dem Scanner einscannen und Ergebnis direkt in der GUI anzeigen


    Das spart Excel komplett aus => einfacher und weniger Fehleranfällig und du brauchst die Lizenz nicht.

    Wenn du dann troztdem die Liste selbst anschauen willst, kannst du sie immernoch mit Excel öffnen (Excel unterstützt .csv).


    Ich würde Abhängigkeiten (wie hier Excel) immer vermeiden.

    Hi,

    das schaut doch schon recht gut aus :)


    Ich hab das gleiche vor kurzem in JavaFX gemacht um bei nem Fenster Darktheme zu unterstützen.

    Deshalb hab ich ein paar Verbesserungsvorschläge für dich :)


    Erstmal ein Fehler (vmtl. vom posten des Codes):

    1. Bei mir haben der Schließen (Í) und Maximieren-button (£) ein falsches Symbol (auch hier auf der Webseite; keine Ahnung, wo es falsch konvertiert wurde). Ich würde empfehlen mit ChrW die UTF-codes direkt zu nutzen, dann kann sowas nicht passieren. Für mein Tool hab ich z.B. minimize: ChrW(0x2015), maximize: ChrW(0x2610) und close: ChrW(0x2715)


    Verbesserung:

    1. Doppelkick auf die Titleleiste maximiert/entmaximiert ein Fenster, sollte recht leicht zu implementieren sein.

    2. Eigenes resize implementieren; relativ einfach, aber aufwändiger.

    3. AeroSnap: Wenn man ein Fenster an den Bildschirmrand zieht, füllt es je nach Rand einen Bereich. Linker Rand: linke hälfte, Ecke links oben/unten jeweiles die obere/untere linke Hälfte und das gleiche auch Rechts. Der obere Rand maximiert.

    Dafür muss man aber die Maus fangen und verhindern, dass sie auf andere Bildschirme an dem Rand übergeht, wenn man die Maus nicht zu schnell über die Kante bewegt. Außerdem zeigt Windows mittlerweile die Option, die andere freie Hälfte mit nem anderen Tool zu füllen,...

    Leider gibt es keine API dafür, sodass es nicht möglich ist das ganze exakt umzusetzen, aber zumindest die eigene Fenstergröße kann man anpassen. Auch wenn es nicht ganz so einfach ist.

    ?4. Vor kurzem hab ich mitbekommen, dass es mittlerweile in Windows auch FancyPages gibt; So ähnlich wie AeroSnap, nur mit mehr möglichkeiten, ABER auch wieder ohne API... X(

    Das standard Verhalten von GUIs nachzubauen ist also leider ziemlich schwer... (insbesondere, wenn man wie ich mit JavaFX auch Linux/Mac unterstützen will).


    Es ist leider ziemlich nervig, dass sobald man die Standard Titlebar wegnimmt (Window style undecorated), fast alle Funktionalität für ein normales Fenster mit verschwindet... Vor allem, weil auch die Standard Testenkombinationen mit wegfallen. Win+Left funktioniert z.B. nicht mehr um ein Fenster auf die linke Bildschirmhälfte zu packen (AeroSnap),... Das alles nachzubauen ist echt nervig. :/

    Ich hab den Code mal genommen und ihn umgeschrieben.

    Das wichtigste, was dir fehlt, ist Errorhandling. Wenn ein Fehler auftritt, sollte dieser als Fehler in der jeweiligen Funktion behandelt werden und Funktionsaufrufe sollten auf Fehler geprüft werden.

    Außerdem sollte man Globale Variablen so gut wie möglich vermeiden. Das bedeutet mehr als nur alle Global to Local zu wechseln. Es betrifft die Struktur, wie der Code aufgebaut ist. Ich hoffe, der Code von mir zeigt dir, wie das am besten geht.

    Ich hab die Fenstergröße,... wie immer als Variablen definiert. Das sorgt dafür, dass du die Größe nur an einer Stelle geändert werden muss, und alles andere wird automatisch angepasst.

    Variablen sollte mit dem Typ beginnen, der in ihnen gespeichert wird (wenn möglich). Stichwort "ungarische Notation": unter Names of Variables

    Dadurch, dass alles in einer Funktion ist, kann ich den Funktionsaufruf auch einfach in einer While-Schleife wrappen, sodass es mehrmals probiert wird.



    Ich hoffe, das hilft dir weiter :)

    Ich bin mir nicht sicher, aber ich vermute, es würde abbrechen, wenn der Ordner vorhanden ist.

    Ich würde entweder "git init" nutzen und dann mit "git remote set-url origin git@github.com:User/UserRepo.git" die URL setzen.

    Danach wirst du aber einen commit erstellen müssen um den dann mit deinem master/main branch zu mergen,...
    Je nach komplexität/unterschied zwischen den repos macht es ggf. Sinn, den Ordner umzubenennen, dann zu clonen und dann alles, was du behalten willst wieder rein zu kopieren und zu pushen.
    Viel Spaß :)

    Wenn du einen fixen DatenTyp "Bool" hast und den selber befüllst,... wird es natürlich funktionieren.

    Ich hab mich vmtl. falsch Ausgedrückt. In python z.B. kann man den return "type" angeben, kann aber trotzdem etwas anderes zurückgeben. An so etwas hab ich eher gedacht. Aber das ist ja quasi der Variant-Datentyp, den du meinst.

    Punkt 3+4 sind für mich wichtiger, das andere ist mehr so ein vorsichtig sein. In C gibt es recht viele "hacks/tricks", an die man nicht denkt, manche aber verwenden. Durch sowas kann man ja z.B. Integer zu Bool auf eine Art konvertieren, dass True am Ende nicht 1 ist, da es am Ende wie von AspirinJunkie erwähnt nur ein Integer ist. Ich denk da z.B. an einen Fehler-Wert in irgend einem struct und jemand kopiert den wert als memory Operation einfach rüber in ein anderes struct, wo es dann als boolean verwendet wird. Sollte man meiner Meinung nach nicht tun, aber wer weiß, auf was für Ideen manche kommen. Weil genaugenommen entspricht es halt der Specification, dass 0 False ist, alles andere True. Warum also nen extra code-abschnitt einfügen um alle andern Werte auf 1 zu setzen. Deshalb mein Argument: Besser vorsichtig sein, wer weiß, was low-level dort zusammengebastelt wurde... Es ist von compiler/memory-sicht ein integer. Nur aus programmier sicht halt nicht.

    Deshalb geben viele Compiler auch eine Warnung, wenn man $bSomething == True schreibt.

    Ich würde davon abraten, bool Variablen mit == True zu vergleichen.

    1. Es ist sprachenabhängig. Es gibt Sprachen, wo es anders definiert ist. In diesem Fall kann es dir auch passieren, dass irgendein Treiber nicht die Definition der windef.h nutzt, sondern was eigenes und du das als Struct bekommst o.ä. ... Also ich wäre eher vorsichtig.

    2. In manchen Sprachen ist True nicht als 1 definiert, sondern als "nicht 0", also nicht false. Deshalb kann es passieren, dass dort z.B. eine 3 zurückgegeben wird. Dann würde der Test mit ==True fehlschlagen, weil True ja intern 1 wäre und 1!=3

    3. In vielen Sprachen kann man in Conditions auch zuweisungen machen (auch in C). if($isCorrect == True) und if($isCorrect = True) schaut fast gleich aus, das eine ist aber immer True und ändert auch noch die Variable zu True und das nur durch ein vergessenes/beim tippen nicht richtig getroffenes =.

    4. Wenn man Variablen richtig benennt, also mit $bSomething oder besser noch $bIsSomething, dann sieht man es ah sofort.


    Für mich sind das genug Gründe, direkt den Boolean zu schreiben und nicht unnötigen extra Code zu haben, der nichtmal wirklich was bringt... Zu großes Risiko für einen fast nicht existierenden Vorteil.

    Ich würde das nicht als Bug bezeichnen... Wie willst du denn einen Eintrag in die Map unterscheiden, wenn du Zahlen (oder Strings) reinwirfst, wo auch 0 (oder nen leerer String) bei sein kann.

    Dann würdest du bei jedem nicht gefundenen Eintrag denken, dass stattdessen 0 (oder '') gefunden wurde.

    Von daher macht es schon Sinn, dass man nicht mit '' oder 0 vergleichen kann. Die beste Methode wäre eh "Not $sTest", von daher passt doch alles...

    Im Zweifel würde ich eher sagen, dass andere Stellen, wo das funktioniert nen Bug sind^^

    Habe die Möglichkeit gefunden, im Explorer über den send("^b") und send("p") die Datei zu drucken und da den PDF-Drucker gewählt.

    Das wäre dann eine schlechte Methode der Automatisierung.

    1. Funktioniert es z.B. bei mir nicht. Ich benutzt Windows 10 (Ich vermute, du nutzt Windows 11) und dort funktioniert die Tastenkombination nicht

    2. Wenn du Send() benutzt darf der Nutzer zu dem Zeitpunkt nichts machen. Ansonsten kann ziemliches Chaos entstehen und dein Scribt funktioniert nicht mehr richtig. Send ist die schlechteste Methode der Automatisierung.

    Danach folgt ControlSend. Dort kann zumindest der Nutzer keinen Blödsinn machen, indem er deinem Script dazwischen funkt, aber du hast immernoch Fenster, die die ganze Zeit auf und zu gehen und dem Nutzer dazwischen funken. Außerdem bekommst du Probleme, wenn z.B. Microsoft beim nächsten update den Explorer ändert und deine automatisierung nicht mehr funktioniert.

    Deshalb ist die beste Möglichkeit die automatisierung mit CLI. Dort bekommt der Nutzer nichteinmal mit, dass im Hintergrund irgendetwas passiert. Solange du die Software nicht updatest wird es immer funktionieren und CLI commands werden selten so verändert, dass sie nicht mehr funktionieren; im Gegensatz zu Fenstern, die oft überarbeitet werden.

    Wenn du dann noch ein portables Programm verwendest muss der Nutzer nichts installieren, du lieferst die benötigten Dateien mit dem Programm aus und kannst sicher sein, dass sie sich nicht durch automatische Updates verändert werden. Das garantiert die beste Stabilität deines Programmes und sorgt dafür, dass es auch bei jedem laufen wird. Du hast quasi die "volle Kontrolle" und sorgst dadurch für die wenigsten Dinge die sich ändern könnten um Probleme zu machen, sodass dein Programm am Ende sehr stabil läuft.

    AutoIt kann theoretisch alles umsetzen, was du am PC so machen kannst. Es ist aber keine gute Wahl für low-level Programmierung. Dafür sollte man eher eine Hochsprache (z.b. Rust, C, Java,...) nutzen.

    Z.B. Byte manipulation ist zwar möglich mit BitAnd, BitOr,... , aber recht eingeschränkt und langsam. Dafür ist AutoIt nicht ausgelegt. Du brauchst aber unter anderem solche Operationen um z.B. PDFs direkt zu erstellen, bearbeiten,...

    Da es nicht dafür ausgelegt ist, wirst du auch nicht wirklich Bibliotheken (in AutoIt UDFs genannt) dafür finden. Selbst wenn sich jemand den Aufwand machen würde wäre die Performance sehr langsam,...


    Der Hauptfokus von AutoIt ist Automatisierung (und ich würde z.B. auch schnelle GUI Erstellung,... dazuzählen).

    Deshalb wäre der sinnvollste Ansatz um mit AutoIt ein PDF zu erstellen die Automatisierung einer Vorhandenen Anwendung.

    Ich hab z.B. gerade kurz danach gesucht und folgendes Programm gefunden: https://imagemagick.org/script/download.php#windows

    Es unterstützt CLI (Commandline Arguments), was die beste Methode der automatisierung ist: https://imagemagick.org/script/command-line-processing.php

    (Ich hab nach "image to pdf portable commandline" gesucht)

    Dementsprechend kannst du das dann z.B. mit Run('convert.exe "image.jpg" -quality 100 image.pdf') in AutoIt ausführen (die convert executable ist in ImageMagick enthalten). (Ich habs nicht getestet, sollte aber so/so ähnlich funktionieren).

    Es ist übrigens möglich, mehrere Bildschirme mit unterschiedlichen DPI Einstellungen zu haben.

    Ich hab z.B. 4 Bildschirme; 2x 4k mit 150% und 2x FHD mit 100%.

    Das nachfolgende Script fragt die Informationen ab und gibt sie aus. Vielleicht bist du ja motiviert, das in dein Script zu integrieren ;)

    Die Ausgabe von meinen Bildschirmen würde wie folgt aussehen:

    Edit: Habs ausversehen in Englisch geschrieben; habs auf Deutsch geändert :sweat_smile:

    Als zusätzliches Extra, damit du einen Vergleich hast:

    das machen jetzt angeblich die modernen Betriebssysteme von selbst.

    Das würde mich aber sehr wundern. Ja, das Betriebssystem weiß, welcher Arbeitsspeicher zu deinem Programm gehört und räumt am Programm-Ende den Speicher auf und gibt ihn frei, genauso wie es ihn erweitert, wenn das Programm mehr Speicher benötigt.

    Das ersetzt aber keinesfalls die Verwendung von free(). Wenn du free() nicht verwendest verbraucht dein Programm mehr und mehr RAM und gibt ihn nicht wieder frei. Daran ändert das Betriebssystem nichts. Valgrind ist nur ein Tool, um zu schauen, ob du allokierten Speicher wieder freigibst um sicherzugehen, dass dein Programm nicht immer mehr RAM verbraucht (bis es irgendwann abstürzt).


    Einige Programmiersprachen arbeiten aber tatsächlich mittlerweile ohne free() und theoretisch auch ohne malloc,... .

    Java, C#, Python,... z.B. haben einen Garbagecollector. Der läuft immer wieder zwischendurch über das Programm drüber und checkt, welche Variablen nicht mehr Referenziert sind und gibt den Speicher frei.

    Andere wie z.B. Rust, C++ (teilweise),... arbeiten mit Scopes. Variablen sind nur in nem bestimmten Scope gültig und werden danach automatisch wieder freigegeben. Das sorgt dafür, dass Programmierer sich nicht selbst darum kümmern müssen (=> weniger fehlende free()). Rust ist z.B. sehr explizit, wie du Daten in einen anderen Scope geben kannst,... und es ist quasi unmöglich dort Variablen nicht freizugeben (ausgenommen mit code, der als unsafe markiert ist).

    Garbage collectoren verbrauchen CPU Zeit, gehen also auf die Performance und sind auch Speicherintensiver (Referenz counter,...). Scope basierte Lösungen verbrauchen minimal mehr Compilezeit, haben aber keine extra Kosten zur Laufzeit.


    Also nein, wenn man nicht gerade Programmiersprachen verwendet, die das Problem anders lösen, muss man immer noch selbst den Speicher verwalten. Das Betriebssystem kümmert sich nicht um die Speicherverwaltung deines Programmes. Es behält nur im Auge, wie viel Speicher du brauchst, wieder freigibst und übernimmt den Speicher des Programmes am Ende der Laufzeit wieder.

    Jo, ich hab mich an dem Code des Original Posters orientiert, was dort berechnet werden soll. Deshalb die Abweichungen.

    Bei der Tatsächlichen Arbeitszeit ziehst du die Pause ab, während der Original Code nur die Zeit zwischen Ankunft und Ende nimmt. Da manchmal pausen,... als Arbeitszeit gelten und ich da nichts ändern wollte, sind die Zeiten natürlich unterschiedlich.

    Die Überstunden bauen auch darauf auf,...

    Nur bei der Endzeit hab ich die 10 Stunden übersehen :)


    Aber das sollte der Threadersteller ohne Probleme so anpassen können, wie es gewollt ist :).

    Hi :)
    Ich hab mir das Ganze angesehen und habs mal mit viel flexiblität umgesetzt. Du musst eig. nur die Parameter oben einstellen, wie es dir gefällt und alles sollte sich automatisch anpassen.

    Zum Berechnen hab ich die Date Funktionen genutzt. Dazu muss man ggf. das Datum dazurechnen und kann automatisch addieren.

    Ich hab die Pausen als Array umgesetzt. Es können also theoretisch beliebig viele Pausen zur Berechnung genutzt werden. Dafür müsste man aber ne Listview für die Pausen nutzen, oder so.

    Selbiges auch für die Soll-Zeit. Der Code unterstützt für jeden Wochentag eine eigene Soll-Zeit. Momentan wird die eine von der Gui für alle Wochentage benutzt.


    Ich hoffe, es ist ausreichend kommentiert.


    Viel Spaß :)

    Es kommt zwar drauf an, wie viele Geräte du generell verwerwaltest,... Aber ich würde in Erwägung ziehen, die Infos nach Gerät zu speichern und dann ggf. alle durchiterieren, um die Geräte zu finden, die die Fehlermeldung haben.

    Selbst wenn du 10000 Geräte hast dürfte das durchlaufen nicht lange dauern.

    Wenn du aber beim Gerät hinzufügen/ändern, alle Stellen zum hinzufügen/entfernen der Infos suchen musst, dürfte das länger dauern. Insbesondere, wenn sich bei nem Gerät durch nen update,... die Fehlermeldung ändert, weil du dann ja nicht nur die aktuellen Infos brauchst, sondern auch die vorherigen, um zu sehen, bei welcher Fehlermeldung du das Gerät rausnehmen musst,...


    Also, wenn du diese JSON-Daten nicht aus anderen generierst, sondern manuell pflegen willst, würde ich überlegen, die Struktur anders zu gestalten.

    Besser den PC 1-2 Sekunden alle Objekte durchsuchen lassen, als selber Stunden zu verbringen, Daten anzupassen :D

    Wenn Geschwindigkeit trotzdem zu langsam ist, würd ich immernoch die Geräte als JSON ablegen und dann das nach Fehlercode sortierte JSON daraus generieren.


    Aber ob das in deiner Anwendung notwendig/sinnvoll ist wirst du vmtl. besser wissen :)

    Ich vermute, dass die Simulation von Windows her deaktiviert ist (also vmtl. auch _winapi_keybd_event).

    Was aber funktionieren sollte ist, einen Treiber zu installieren, der angibt ein Eingabegerät zu sein und darüber die Tastatur zu bedienen. Also nen virtual keyboard driver.

    Auf die schnelle hab ich diesen finden können. Habs aber nicht getestet.

    GitHub - hedgar2017/loki-hidriver: Virtual mouse and keyboard driver for Windows 7 and higher
    Virtual mouse and keyboard driver for Windows 7 and higher - GitHub - hedgar2017/loki-hidriver: Virtual mouse and keyboard driver for Windows 7 and higher
    github.com


    (Du musst zum installieren vmtl. kurzzeitig unsignierte Treiber erlauben. Also den Code vom link am besten selber kompilieren, um sicher zu sein :).)

    Naja... genau was da steht: Die Variable wurde vorher als Konstante deklariert.

    Du kannst die Variable also nicht später neu zuweisen. Wenn du den Block mehrmals in deinem Script hast, wird es sich beschweren.


    Am besten postest du das ganze Script. Ich vermute stark, dass du Arrays verwenden solltest (anstatt den Code mehrmals zu kopieren,...).


    Ansonsten: Einfach das const überall weglassen, wo du die Variable deklarierst/definierst.