• Kleine Hinweise für .ini Dateien:
    - [Todo] Ein Program das eine .ini verwendet sollte "immer" eine Default-Ini generieren, falls versucht wird die Ini zu lesen, obwohl keine vorhanden ist (im Idealfall mit einem kleinen nicht invasivem Hinweis das das soeben passiert ist). Diese Ini sollte an der Stelle liegen von der aus das Programm die Ini später auch lesen wird, sodass ein neuer Nutzer beim Programmstart direkt weiß was hier eigentlich los ist.

    - [Bug] Dein Programm crasht wenn die .ini fehlt: "QR-Code-Generator.au3" (141) : ==> Subscript used on non-accessible variable.:"

    - [Todo] Der Programmname gehört nicht in die .ini

    - [Todo] Der übliche Nutzer erwartet, dass die .ini "config.ini", "settings.ini" oder ähnlich heißt.

    Kleine Hinweise für Programme die irgendwer verwendet allgemein:

    - [Todo] Bau eine Statusleiste unten an den Bildschirmrand in der unauffällig alle möglichen Infos (z.B. auch das Generieren der .ini) angezeigt werden. Falls mal irgendwas nicht klappt kannst du hier Fehlercodes ausgeben die der Benutzer dir dann mitteilen kann.

    - [Todo] Der übliche Nutzer erwartet eine Titelleiste mit einem Menu das mit "Datei" (en. "File") beginnt um auf einige Grundfunktionen zugreifen zu können: Laden, Speichern, Beenden, etc. Alles sollte mit Hotkeys verwendbar sein.

    - [Todo] Die Tabs sollten alle einen Namen haben, selbst wenn es nur Nummern sind. Falls dein Programm häufiger verwendet wird gewöhnen sich die Nutzer daran, dass sie z.B. "auf Tab 5 klicken müssen", das wird aber nicht passieren wenn die Tabs keine Bezeichnung haben.

    - [Bug] Die Inputfelder für Ordner und Dateiname löschen sich automatisch, wenn man hineinklickt.


    Das soll keine Kritik sein, nur eine Art Todo-Liste (von Sachen die mir auf die Schnelle aufgefallen sind), das sind alles Probleme die wieder auf dich zurückkommen, sobald mehrere Leute dein Programm verwenden :)

    Zur UI Skalierung auch ein Hinweis:

    - Es ist immer eine schwierige Sache, vor allem wenn das UI einige Teile enthält die unterschiedlich skalieren. Wenn du komplizierteres Verhalten möchtest musst du vermutlich von Hand etwas basteln (ggf. die RESIZE msg abfangen und die Elemente neu anordnen). Da musst du aber jemanden Fragen der sich damit besser auskennt (mit den Built-in Funktionen zum Resizen), ich selbst mache sowas immer "extrem" umständlich (mit verschachtelten Boxen. Das gesamte Fenster enthält "eine" Box, diese Box enthält z.B. 2 Boxen (eine große die die übergeordenete Box fast komplett ausfüllt und am unteren Rand eine mit voller Breite und 30px Höhe), in die Untere Box kommt dann z.B. die Statusbar, in die obere kommen weitere Boxen die das Fenster ein Regionen einteilen. In diese kommen dann die UI-Elemente selbst. Wird das Fenster skaliert, wird nur die eine einzige Box die alles weitere enthält skaliert. Anschließend wird die Skalierung an die unteren Boxen durchgereicht und alles passt sich automatisch von selbst so an wie man es eingestellt hat... Habe dafür aber leider keine UDF, sonst würde ich die garantiert mal posten)

    lg

    M

  • Dein Programm crasht wenn die .ini fehlt

    Solange niemand die/meine Ordnerstruktur ändert, ist die INI immer da. Die Ordnerstruktur muss erhalten bleiben, weil sonst noch mehr nicht funktioniert.

    Der Programmname gehört nicht in die .ini

    Da steht nur der Name für eine DLL, nicht für das Programm selber. Die DLL gehört zur "QRGreator.au3" (das habe ich so in die QRGreator.au3 eingebaut, weil ich beim DLL-Namen flexibel sein möchte). Da könnte ich auch "Utz Uwe" hinschreiben, dann würde die temporäre dll eben "utz uwe.dll" heißen. :D

    Der übliche Nutzer erwartet, dass die .ini "config.ini", "settings.ini" oder ähnlich heißt.

    Die Nutzer die ich kenne, erwarten, dass das Programm funktioniert. Die interessieren sich nicht für irgendwelche Konfigurationsdateien. ;) Ich könnte auch einfach weiße Seiten nehmen, statt der vielen Farbe, aber das wäre zu leicht.

    Bau eine Statusleiste unten an den Bildschirmrand

    Hatte ich drin. Aber dann stürzt das Programm ab, wenn man einen Aztec-Code oder Datamatrix-Code erstellt (wird mit zint erstellt). Weshalb weiss ich nicht.


    z.B. auch das Generieren der .ini

    Mein Programm erstellt keine INI, sondern nur QR-Codes. Und da sieht man ob es erfolgreich war, weil die Codes in die Vorschau erscheint.

    Die Tabs sollten alle einen Namen haben, selbst wenn es nur Nummern sind.

    Ich habe die Tab-Namen absichtlich weggelassen. Ich steuere den Zugriff lieber über die Schaltflächen. Das gefällt miroptisch besser. Das habe ich in meinem Excel-QR-Code-Projekt auch so gemacht. Allerdings habe ich da zwei Multiseiten (die eine liegt auf der anderen), und gesteuert wird das das mit sevOutbar.

    Die Inputfelder für Ordner und Dateiname löschen sich automatisch, wenn man hineinklickt.

    Das ist Absicht, damit man nicht soviel mit der Maus arbeiten muss. Das ist noch aus einer alten Programmierung bzw. aus einem kleineren 2FA-Code-Creator, bei der/dem ich Beispieltext vorgegeben habe. Damit der automatisch gelöscht wird, wie man es von Internet-Formularen kennt, habe ich das so eingebaut.

  • Dann möchte ich mich entschuldigen. Ich schätze mal die "DAU-Programmierung" ("Dümmster Anzunehmender User") hat mich nachträglich beeinträchtigt^^
    Meine Übliche Vorgehensweise ist: Wenn mein kleiner Bruder ein Programm länger als 5 Minuten verwenden kann, ohne dass es abschmiert, dann ist es solide programmiert. (der ist 27 und hat auch was mit IT zu tun, aber er ist für Software quasi das Gegenteil von Jesus: "Tod durch Handauflegen") ^^

    lg

    M

  • Passt scho. Es weiß ja keiner außer mir, weshalb ich was mache. ;) Es wäre aber einfacher, wenn unsere liebe Firma nicht so ein Gschiss mit fertigen/richtigen Programmen machen würde. Dann wäre ich nicht auf die Idee gekommen, sowas selber zu machen ("Laienhaft zusammenzuschustern"). ;)

  • Bau eine Statusleiste unten an den Bildschirmrand

    Hier mal die Version mit Statusbar (die Datei[en] mit in den Ordner). Bei Nutzung von Aztec und Datamatrix (zint) stürzt die GUI ab. Die Exe gibt einen für mich nicht nachvollziehbaren Fehler aus. SciTe gibt folgenden Fehler aus.

    Zitat

    "C:\Users\user\Desktop\AutoIt-Multipage_\QR-Code-Generator3.au3" (1123) : ==> Variable must be of type "Object".:

    StatusbarSetColors($aStatusBar, 1, ($tRes.success ? $iGreen : $iRed))

    StatusbarSetColors($aStatusBar, 1, ($tRes^ ERROR

    Warum tritt das Problem nur bei zint auf? Kann ich nicht nachvollziehen. Vielleicht ist die Datei noch nicht fertig wenn die Statusbar gefüllt wird?

  • Das Problem liegt daran, dass in _QR_getLastCall() $__ga_LastCall[3] = "" (leerer String) ist. Das Nachfolgende Switch deckt diesen Fall nicht ab (hier könnte man Case Else verwenden, das fängt "alle" fälle ab die vorher nicht behandelt wurden). Da ich keine Ahnung von der QR UDF habe kann ich keine weiteren Aussagen treffen (kann also nicht sagen warum der Fehler auftritt, die Zeilen nach dem Switch (die mit DllStructSetData) verwenden nicht die dot-syntax weshalb hier @error gesetzt wird, weil $tOut keine Struct ist, sodass der Fehler bis in den Returnwert wandern kann) :S

    Da die UDF von BugFix ist müsste er sich das vermutlich ansehen.

    lg

    M

  • Ja, das ist mir inzwischen auch aufgefallen, dass es mit QRCreator.au3 zusammenhängt.

    Ich könnte für Aztec und Datamatrix auch eigene Parameter erstellen, mit denen ich die Statusbar fülle. Das schaue ich mir aber mal in Ruhe an, wenn ich mal mehrere Tage am Stück frei habe.

  • Hier mal die Version mit Statusbar (die Datei[en] mit in den Ordner). Bei Nutzung von Aztec und Datamatrix (zint) stürzt die GUI ab. Die Exe gibt einen für mich nicht nachvollziehbaren Fehler aus. SciTe gibt folgenden Fehler aus.

    Mal für mich zum Verständnis (ohne dass ich jetzt deinen Code anschaue):

    Du nutzt die CRCreator.au3 von mir und hast diese mit zint für die weiteren Varianten (Aztec etc.) kombiniert.

    Und nur in dieser Kombination tritt der Fehler auf.

    Das Problem liegt daran, dass in _QR_getLastCall() $__ga_LastCall[3] = "" (leerer String) ist. Das Nachfolgende Switch deckt diesen Fall nicht ab (hier könnte man Case Else verwenden, das fängt "alle" fälle ab die vorher nicht behandelt wurden).

    Denn bei Verwendung ausschließlich meiner UDF kann es keinen Fall: _QR_getLastCall() $__ga_LastCall[3] = "" (leerer String) geben. Das ist vom Programmablauf her ausgeschlossen.

    Ich vermute mal, dass du bei Nutzung mit zint, separat die Funktion

    __QRStoreLastCall($_iSucc, $_iErr, $_iW, $_sType, $_sOut, $_iMargin, $_iSizePt, $_iCorrLvl)

    mit allen Parametern aufrufen musst.

    Ich kann mir das später mal noch in deinem Code ansehen. Aber probiere schon mal.

  • Hmm, blöd zu Testen. Du hast die INI nicht mitgeliefert und erstellst sie leider nicht per default im Programm.

    Hier kann ich Mars nur beipflichten:

    AutoIt
    Global $INI = @ScriptDir & "\settings.ini"
    If Not FileExists($INI) Then
    ; hier INI mit allen Default-Werten erstellen
    EndIf

    Das sollte nie fehlen.

    Was aber sofort als Fehler kam: Bei allen Aufrufen der statusbar_small fehlte der Unterstrich vorm Funktionsnamen.

  • Du nutzt die CRCreator.au3 von mir und hast diese mit zint für die weiteren Varianten (Aztec etc.) kombiniert.

    Und nur in dieser Kombination tritt der Fehler auf.

    Nein. Das Problem habe ich nur wenn ich einen Aztec oder Datamatrix nutze. Der Fehler lag aber bei mir, ist mir gestern auf Arbeit eingefallen, ein Denkfehler. Die Statusbar wird ja durch den QRCreator gefüllt. Der kommt aber bei zint nicht zum Einsatz. Das muss ja auf einen Fehler laufen.

    Ich vermute mal, dass du bei Nutzung mit zint, separat die Funktion

    __QRStoreLastCall($_iSucc, $_iErr, $_iW, $_sType, $_sOut, $_iMargin, $_iSizePt, $_iCorrLvl)

    mit allen Parametern aufrufen musst.

    Danke! Das probiere ich mal. Die Idee hatte ich auch schon. Nur das wie hatte ich noch nicht im Kopf, sowas dauert bei mir länger. ;)

    Was aber sofort als Fehler kam: Bei allen Aufrufen der statusbar_small fehlte der Unterstrich vorm Funktionsnamen.

    Ein dummer Kopierfehler.

    Du hast die INI nicht mitgeliefert

    Die steckt im Donload weiter oben. Da ist auch zint & Co. mit drin. Das ganze Projekt ist zu groß für dieses Forum. Aber wie gesagt, ich teste das mal.

  • Apropos "UI Skalierung". Ich habe gestern und heute ein bisschen gebastelt. Im Endeffekt brauche ich das auch selbst, war aber immer viel zu faul eine richtige UDF daraus zu machen. Die Methode verwende ich aber eigentlich immer um GUIs aufzubauen.

    Im Anhang ist ein kleiner erster Eindruck der UDF. Das wird dir jetzt nicht viel bringen, weil man da das komplette UI vollständig neu gestalten müsste, aber wenn die UDF mal fertig ist hoffe ich, dass Skalierungsprobleme und Anordnungsprobleme bei User Interfaces der Vergangenheit angehören. Ich habe genug hässliche GUIs gesehen und genug hardgecodete Koordinaten und For-Loops um "schön angeordnete Buttons" zu produzieren. Das alles braucht man damit nicht mehr.

    Die Erklärungen in den Kommentaren ist rudimentär. Genaueres gibts dann irgendwann (wer weiß wann....) in einem eigenen Thread.

    lg

    M

  • Apropos "UI Skalierung". Ich habe gestern und heute ein bisschen gebastelt. Im Endeffekt brauche ich das auch selbst, war aber immer viel zu faul eine richtige UDF daraus zu machen. Die Methode verwende ich aber eigentlich immer um GUIs aufzubauen.

    Im Anhang ist ein kleiner erster Eindruck der UDF. Das wird dir jetzt nicht viel bringen, weil man da das komplette UI vollständig neu gestalten müsste, aber wenn die UDF mal fertig ist hoffe ich, dass Skalierungsprobleme und Anordnungsprobleme bei User Interfaces der Vergangenheit angehören. Ich habe genug hässliche GUIs gesehen und genug hardgecodete Koordinaten und For-Loops um "schön angeordnete Buttons" zu produzieren. Das alles braucht man damit nicht mehr.

    Die Erklärungen in den Kommentaren ist rudimentär. Genaueres gibts dann irgendwann (wer weiß wann....) in einem eigenen Thread.

    lg

    M

    Hmm, darüber hatte ich auch shcon mal nachgedacht, es dann aber verworfen mangels Zeit und Geduld ;) Aber wenn jemand sowas hin bekommen würde wäre das ein immenser Zugewinn.