1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • QRCode.au3 & QRCodeUI.au3 & QRCreatorCI.au3 mit aktueller quricol.dll (32 & 64 bit) integriert

    • BugFix
    • 1. Mai 2020 um 14:34

    Vor langer Zeit hatte ich einen QR-Code Creator erstellt. Inzwischen sind die dll in neuer Version verfügbar.

    Ich habe jetzt als Basis die QRCode.au3 erstellt

    • _QR_generatePNG
      Generates the QR-Code as PNG file for the passed text.
    • _QR_generateBMP
      Generates the QR-Code as BMP file for the passed text.
    • _QR_getHBitmap
      Creates a HBITMAP handle for the QR-Code for the passed text.
    • _QR_copyToClipboard
      Copies the QR-Code picture for the passed text to the clipboard.
    • _QR_FileDefault
      Generates a default filename (QR_YYYYMMDD_hhmmss)
    • _QR_getLastCall()
      Asks for the result of the last call (_QR_getHBitmap/_QR_copyToClipboard/_QR_generateBMP/_QR_generatePNG)
      Gets a structure with: .success(1/0) .error(@error) .width .type(B/C/F) .output(hBMP/''/fullpath) .margin .sizept .corrlevel

    Das lässt sich ohne grafische Oberfläche in jedem Skript verwenden.

    Für die QR-Code Erstellung sind folgende Parameter verfügbar:

    • $_sText
      Der zu codierende Text
    • $_sPathOut
      (Bei Dateierzeugung) Der volle Dateipfad, der erzeugten Datei
    • $_iMargin
      Der umlaufende Rand
    • $_iSizePt
      Die größe der erzeugten Punkte (1-4, abhängig vom Korrekturlevel)
    • $_iCorrLvl
      Das verwendete Korrekturlevel (0-3). Erlaubt das sichere Lesen des Codes auch bei teilweiser Zerstörung.
    • $_iOutSize (_QR_generatePNG und _QR_generateBMP)
      Die Breite (und Höhe) in px für die erstellte QR-Code Datei. Die erstellte Datei wird auf diese Größe angepasst. Mit "Default" wird der Parameter ignoriert.
      Die Anpassung schlägt fehl, wenn die übergebene Größe kleiner als die der original erstellten Datei ist.
    • $_iScale (_QR_copyToClipboard)
      Vergrößert den QR-Code für die Clipboardausgabe linear. Je nach $_iSizePt und $_iCorrLvl ergibt z.B. Faktor 10 bis 12 etwa die Breite eines Blatts A4

    Der "QR-Code Creator" wurde gewaltig überarbeitet und heißt jetzt "QRCodeUI".

    Eine skalierbare Vorschau ist enthalten. Die Größe des QR-Codes, der in die Zwischenablage kopiert wird, ist analog zur Vorschaugröße, kann aber auch separat eingestellt werden.

    Die Größe erstellter *.BMP oder *.PNG ist abhängig vom verwendeten Korrekturlevel und der Punktgröße und wird von der Dll bestimmt. (Werde ich vielleicht später noch ergänzen, dass die Größe der erzeugten Bilder in Dateien skalierbar ist.)

    Aber schaut es euch einfach an.

    Die "statusbar_small.au3" hänge ich nochmal mit an, da sie im "QRCodeUI" verwendet wird.

    EDIT: NEU v 0.2

    Es kann bei den Funktionen _QR_generatePNG und _QR_generateBMP der Parameter $_iOutSize übergeben werden mit der Seitenlänge in px für den QRCode in der Datei. Wird dieser Parameter übergeben werden 2 Dateien erstellt: Das Original als "..\Name.ext" und die resized Version als "..\Name(1).ext". wird nur eine Datei mit dieser Größe erstellt. Minimum ist Größe der Datei, wie sie von der Dll erstellt wird, wird ggf. automatisch korrigiert.

    EDIT: NEU v 0.3

    • Dateiausgabe mit veränderter Größe jetzt auch ohne gleichzeitiges Speichern der standardmäßig durch den Dll-Aufruf erzeugten Datei möglich
    • Deshalb auch die UI angepasst
    • Bug in Dateivalidierungsfunktion gefixed

    EDIT: NEU QRCreatorCI.au3 - Um die Ergebnisausgabe zu erhalten nicht vergessen: #AutoIt3Wrapper_Change2CUI=y

    • Kommandozeilenversion
    • min. Parameter für Text erforderlich (Standard Pfad: Home, Datei: QR_JJJJMMTT_hhmmss.png)

    EDIT: QRCreatorCI.au3 v 0.2

    • Bug bei Typ 'clip' ohne Scalingparameter gefixed

    EDIT: QRCreatorCI.au3 v 0.4 16.07.24

    • Per Kommandozeile jetzt auch Multiline Text möglich (Caret ^ ist Standardplatzhalter für CRLF)

    Bilder in diesem Post

    QRCreatorCI.au3
    AutoIt
    ;-- TIME_STAMP   2024-07-16 10:25:32   v 0.4
    
    ;----------------------------------------------------------------------------------------------------------------
    ; available command line parameters
    ;----------------------------------------------------------------------------------------------------------------
    ;  REQUIRED
    ;    break=Replacement character for a line break in the text. (Default: ^).
    ;          Must only be set if different from standard or one-line text includes a ^ (then "break=none" required). 
    ;          If the parameter is used, it must always be set as the first parameter.
    ;    text=Text for encoding
    ;  OPTIONAL
    ;    file=path/filename[.ext]  - If ommited, the default will used: @HomeDrive & @HomePath & "\QR_YYYYMMDD_hhmmss"
    ;    type=png,bmp,clip         - If ommited, 'png' will used. With clip runs CopyToClipboard.
    ;         or combined png/bmp    If file has .ext and type is passed but is different to .ext than will used type
    ;    width=int                 - (and height) initializes a resizing of the default created QR-Code
    ;                                Resizing fails, if passed size is smaller as the default generated file.
    ;                              REMARK: Only for file creation
    ;    scale=int                 - Factor for up scaling the QR-Code
    ;                              REMARK: Only for CopyToClipboard
    ;    margin=4                  - The margin around the QR-Code in px (Default = 4)
    ;    corrlevel=0               - Up to 7%, 15%, 25% or 30% damage [0, 1, 2, 3]. (Default = 0)
    ;    sizept=2                  - The size of the painted pixel itself. The value depends on the correction level.
    ;                                Only the smallest point size can be used for the largest correction level.
    ;                                The value will corrected automatically, if wrong.
    ;----------------------------------------------------------------------------------------------------------------
    ; return values
    ;----------------------------------------------------------------------------------------------------------------
    ; comma separated string with:
    ;   ERROR=@error
    ;   RESULT='FullFilePath' or 'CLIPBOARD'
    ;   SIZE=width x heigth
    ;   SIZEPT=The really used (may be corrected) size of point
    ;   MARGIN=The used margin size
    ;   CORRLEVEL=The used correction level
    ;----------------------------------------------------------------------------------------------------------------
    
    #include "QRCreator.au3"
    #include <WinAPIFiles.au3>
    
    Opt('MustDeclareVars', 1)
    
    
    ;----------------------------------------------------------------------------------------------------------------
    Global $sHome = @HomeDrive & @HomePath
    Global $sText, $sFile, $sType, $iWidth, $iScale, $iMargin, $iCorrlevel, $iSizePt
    Global $bBreak = True, $charLineBreak = "^"              ; Replacement character for a line break in the text
    Global $bFile = False, $bResize = False, $bClip = False
    Global $aMatch, $sOutputResult = '', $idxCall = 0, $tRes
    Global $aCall[3][2] ; [['function',$aArgs]]  -- max. 3 operations at once
    Global $aArgsPNG[6] = ["CallArgArray"], $aArgsBMP[6] = ["CallArgArray"], $aArgsRE_PNG[7] = ["CallArgArray"]
    Global $aArgsRE_BMP[7] = ["CallArgArray"], $aArgsCLIP[6] = ["CallArgArray"]
    ;----------------------------------------------------------------------------------------------------------------
    
    ;----------------------------------------------------------------------------------------------------------------
    If $CMDLINE[0] = 0 Then
    	Exit ConsoleWrite(_OutPutResult(1,'Minimum Required a Text Parameter!') & @CRLF)
    Else
        $charLineBreak = _OrDefault(_ParseForParam('break'), '^')
        If $charLineBreak = 'none' Then $bBreak = False
    	$sText      = _ParseForParam('text')
        If $sText <> Null Then          ; check for replace with line break
            If $bBreak And StringInStr($sText, $charLineBreak) Then
                $sText = StringReplace($sText, $charLineBreak, @CRLF)
            EndIf
        EndIf
    	$sFile      = _OrDefault(_ParseForParam('file'), Null)
    	If $sFile <> Null Then $bFile = True
    	$sType      = _OrDefault(_ParseForParam('type'), Null)
    	If $sType <> Null Then
    		If StringInStr($sType, 'png') Or StringInStr($sType, 'png') Then $bFile = True
    		If StringInStr($sType, 'clip') Then $bClip = True
    	EndIf
    	$iWidth     = _OrDefault(_ParseForParam('width'), Null)
    	If $iWidth <> Null Then
    		$bFile = False
    		$bResize = True
    	EndIf
    	$iScale     = _OrDefault(_ParseForParam('scale'), Null)
    	If $iScale <> Null And Not StringInStr($sType, 'clip') Then $bClip = True
    	If StringInStr($sType, 'clip') And $iScale = Null Then $iScale = 1
    	$iMargin    = _OrDefault(_ParseForParam('margin'), 4)
    	$iCorrlevel = _OrDefault(_ParseForParam('corrlevel'), 0)
    	$iSizePt    = _OrDefault(_ParseForParam('sizept'), 2)
    EndIf
    If Not $bFile And Not $bResize And Not $bClip Then $bFile = True ; only Text passed
    ;----------------------------------------------------------------------------------------------------------------
    
    ;----------------------------------------------------------------------------------------------------------------
    ; detect what to do
    If $bFile Or $bResize Then
    	If $sFile = Null Then $sFile = $sHome & '\' & _QR_FileDefault()
    	$aMatch = StringRegExp($sFile, '\.([a-z]+)$', 1)
    	If IsArray($aMatch) Then
    		$sFile = StringRegExpReplace($sFile, '(\.[a-z]+)$', '')
    		If $sType = Null Then $sType = $aMatch[0]
    	EndIf
    	If $sType = Null Then $sType = 'png'
    	If StringInStr($sType, 'png') Then
    		$aCall[$idxCall][0] = '_QR_generatePNG'
    		$aCall[$idxCall][1] = _FillArgArray(($bResize ? $aArgsRE_PNG : $aArgsPNG), ($bResize ? 'rpng' : 'png'))
    		$idxCall += 1
    	EndIf
    	If StringInStr($sType, 'bmp') Then
    		$aCall[$idxCall][0] = '_QR_generateBMP'
    		$aCall[$idxCall][1] = _FillArgArray(($bResize ? $aArgsRE_BMP : $aArgsBMP), ($bResize ? 'rbmp' : 'bmp'))
    		$idxCall += 1
    	EndIf
    EndIf
    
    If $bClip Then
    	$aCall[$idxCall][0] = '_QR_copyToClipboard'
    	$aCall[$idxCall][1] = _FillArgArray($aArgsCLIP, 'clip')
    	$idxCall += 1
    EndIf
    ;----------------------------------------------------------------------------------------------------------------
    
    ;----------------------------------------------------------------------------------------------------------------
    ; execute operation(s) and generate the output
    For $i = 0 To $idxCall -1
    ;== DEBUG
    ;~     ConsoleWrite('Call: ' & $aCall[$i][0] & @CRLF)
    ;==/DEBUG
    	Call($aCall[$i][0], $aCall[$i][1])
    	$tRes = _QR_getLastCall()
    	$sOutputResult &= _OutPutResult($tRes.error, ($aCall[$i][0] = '_QR_copyToClipboard' ? 'CLIPBOARD' : _WinAPI_GetFullPathName($tRes.output)), _
    	                                $tRes.width, $tRes.sizept, $tRes.margin, $tRes.corrlevel)
    Next
    ;----------------------------------------------------------------------------------------------------------------
    
    ;----------------------------------------------------------------------------------------------------------------
    ; write result to console
    ConsoleWrite($sOutputResult & @CRLF)
    ;----------------------------------------------------------------------------------------------------------------
    
    
    
    ;----------------------------------------------------------------------------------------------------------------
    ; functions
    
    Func _OutPutResult($_iErr, $_sRes, $_iSize=0, $_iSizePt=0, $_iMargin=0, $_iCorrLevel=0)
    	Local $sSize = $_iSize > 0 ? ($_iSize & 'x' & $_iSize) : '0'
    	Return (StringFormat('ERROR=%s,RESULT=%s,SIZE=%s,SIZEPT=%d,MARGIN=%d,CORRLEVEL=%d', _
    	                          $_iErr, $_sRes, $sSize, $_iSizePt, $_iMargin, $_iCorrLevel) & @CRLF)
    EndFunc
    
    
    Func _FillArgArray($_ar, $_type)
    	Switch $_type
    		Case 'png', 'bmp'
    			$_ar[1] = $sText
    			$_ar[2] = $sFile
    			$_ar[3] = $iMargin
    			$_ar[4] = $iSizePt
    			$_ar[5] = $iCorrlevel
    		Case 'rpng', 'rbmp'
    			$_ar[1] = $sText
    			$_ar[2] = $sFile
    			$_ar[3] = $iMargin
    			$_ar[4] = $iSizePt
    			$_ar[5] = $iCorrlevel
    			$_ar[6] = $iWidth
    		Case 'clip'
    			$_ar[1] = $sText
    			$_ar[2] = $iMargin
    			$_ar[3] = $iSizePt
    			$_ar[4] = $iCorrlevel
    			$_ar[5] = $iScale
    	EndSwitch
    	Return $_ar
    EndFunc
    
    
    Func _ParseForParam($_sParam)
    	For $i = 1 To $CMDLINE[0]
    		$aMatch = StringRegExp($CMDLINE[$i], '([^=]+)=(.+)', 1)
    		If IsArray($aMatch) And $aMatch[0] = $_sParam Then Return $aMatch[1]
    	Next
    	Return Null
    EndFunc
    
    
    Func _OrDefault($_vValue, $_vDefault)
    	Return ($_vValue <> Null ? $_vValue : $_vDefault)
    EndFunc
    ;----------------------------------------------------------------------------------------------------------------
    Alles anzeigen

    EDIT QRCreatorUI.au3 v 0.4 (in der .zip)

    • Die Parameter für den QRCode (ausgenommen Text!) können nun auch während der geöffneten Preview On-The-Fly geändert werden.
    • Wenn $_iSizePt geändert (verkleinert) werden musste, wird das optisch angezeigt.
    • Die Größenänderung des Preview ist neben Slider und UpDown jetzt auch durch Mausrad (vor + / zurück -) oder Maustasten (li + / re -) möglich, wenn die Maus über dem Previewfenster ist.

    Und so sieht es jetzt aus (QRCreatorUI):

    creatorUI.PNG  preview_scale1.PNG

    preview_scale12.PNG filesave.png

    resize_fail1.PNG resize_fail2.PNG

    resize.PNG clipboard.png

    Dateien

    QRCreatorCI.au3 8,45 kB – 365 Downloads QRCode_v0.4.zip 259,43 kB – 984 Downloads
  • OrganizeIncludes

    • BugFix
    • 1. Mai 2020 um 08:02

    Was mir an OI nicht so gefiel, dass zu viel unnötige Includes eingefügt werden, da nicht rekursiv in den Includes gesucht wird. Z.B. sind mit GDIPlus automatisch auch WinAPI Funktionen über das dortige Include enthalten und brauchen im Hauptskript nicht erneut aufgeführt werden.

    Die rekursive Ermittlung ist aber recht tricky. Da habe ich noch an einem zeitoptimierten Algorithmus gebastelt in der Lua Version.

    Habe es jetzt mal auf den oberen Teil meiner ToDoList gesetzt.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 30. April 2020 um 11:40
    Zitat von Oscar

    Ja, Nim ist deutlich umfangreicher/komplexer und natürlich auch leistungsfähiger als AutoIt, aber auch deutlich schwerer zu lernen.

    Man bekommt das nicht alles auf dem Silbertablett serviert (wie bei AutoIt), sondern muss sich alles zusammensuchen.

    Da sagst du was! - Hat aber den Vorteil, dass durch das intensive Lesen (bzw. vorrangig auch Übersetzen) sehr viel hängen bleibt. Der Lernerfolg ist schon recht groß.

    Mir fehlt auch: Funktion -> F1 -> Bsp. -> Aha, so gehts!

    Aber mit der Zeit weiß man, wie man suchen muss. Meist sind es Typ- oder Objektdefinitionen und in den Sourcen der offiziellen Pakete ist eigentlich recht gut dokumentiert.

    Zitat von Oscar

    1. Kann man benötigte Ressourcen (Bilder, Icons, Sounds, Dlls, etc.) mit in die Exe einbinden (ähnlich FileInstall oder "File to Base64 String Code Generator" von UEZ)?

    2. Im Netz habe ich gelesen, dass man ein Programm-Icon für die Exedatei nur mit "rcedit" nachträglich hinzufügen kann (funktioniert). Stimmt das?

    3. Wenn mein Programm fertig ist und ich nichts mehr debuggen will, reicht es dann den Compiler so aufzurufen: nim c -d:release --app:gui MeinProgramm.nim?

    Da bin ich momentan noch nicht sicher auskunftsfähig. Die ersten Programme, die ich geschrieben hatte, waren alle zur Textauswertung auf Konsolenebene.

  • OrganizeIncludes

    • BugFix
    • 30. April 2020 um 11:06
    Zitat von Moombas

    Problem mit Umlauten in Dateiname/Pfad

    Pfui! Wer verwendet denn Umlaute in den Pfaden. :D

    Der Autor des Tools ist nicht mehr in AutoIt aktiv. Mich hat es bisher nie gestört, weil ich die Includes nie einfügen lasse, sondern aus der Konsole ins Skript kopiere.

    Wenn ich mal Muße habe, werde ich mein in Lua angefangenes IncludeManagement mal fertigstellen. Aber da gab es noch einige Baustellen.

    EDIT:

    Zitat

    Ich definiere per Standard das bei mir die AU3 Dateien als UTF8 codiert

    Na, das ist ja (seit vorletzter Version?) Standard, also nicht UTF8, sondern UTF8wBOM. Da OI vor dieser Zeit erstellt wurde, kann das ein Grund sein.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 30. April 2020 um 10:46
    Zitat von Oscar

    Kann man bei den Fonts auch einen Monospaced-Font auswählen?

    Und welche Fonts stehen überhaupt zur Verfügung?

    Dafür gibt es das Font Objekt:

    Code
    # constructor: Font (param): wFont
    # parameter:
    #  pointSize: float = NaN            Size in points. 
    #  family = wFontFamilyDefault       The font family: a generic portable way of referring to fonts without specifying a facename.
    #  weight = wFontWeightNormal        Font weight, sometimes also referred to as font boldness.    
    #  italic = false                    The value can be true or false. 
    #  underline = false                 The value can be true or false.
    #  strikeout = false                 The value can be true or false. 
    #  faceName = ""                     An optional string specifying the face name to be used. 
    #  encoding = wFontEncodingDefault)  The font encoding.
    
    # https://khchen.github.io/wNim/wFont.html
    
    import wnim/[wApp, wFrame, wPanel, wStaticText, wFont]
    
    proc main() =
      let app = App()
      let frame = Frame(title="Test Font")
      let panel = Panel(frame)
    
      let fontCourier = Font(faceName="Courier New", italic=true, pointSize=12)
      let fontComic = Font(faceName="Comic Sans MS", weight=wFontWeightBold, pointSize=14)
    
      let st1 = StaticText(panel, label="Courier New, italic, size: 12", pos=(10, 30), size=(400, 60))
      let st2 = StaticText(panel, label="Comic Sans MS, bold, size: 14", pos=(10, 90), size=(400, 60))
    
      st1.setFont(fontCourier)
      st2.setFont(fontComic)
    
      frame.wIdExit do ():
        frame.delete() 
    
      frame.center()
      frame.show()
      app.mainLoop()
    
    main()  
    Alles anzeigen
    Zitat von Oscar

    Gibt es eine Sound-UDF?

    Standard Anlaufstelle für Module ist: Curated Packages

    Zum Thema Sound gibt es dort einen Eintrag: wave (The wave is a tiny WAV sound module.)

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 30. April 2020 um 00:07

    Noch Wichtig!

    Wie bei Verwendung von DC in AutoIt ist dieser anschliessend wieder freizugeben. Meine Prozedur aus dem vorigen Post muss dann so lauten:

    Code
    proc transPaint(sender: wWindow) =
      # paints controls transparent
      var
        dc = PaintDC(sender)
        rect = (0, 0, sender.getBestSize().width, sender.getBestSize().height)
    
      dc.backgroundTransparent = true
      dc.font = sender.getFont()
      dc.drawLabel(sender.label, rect, wCenter)  
      dc.delete()
  • Info zum Thema Corona und Mehrwegmasken

    • BugFix
    • 29. April 2020 um 20:02

    Frag 3 Gelehrte und du hast 5 Meinungen.

    Denn z. B. ist auch folgendes wissenschaftlich belegt:

    Viren bestehen grob gesagt aus RNA mit einer Fettschicht drumherum. Wird die Fettschicht zerstört, ist das Virus nicht mehr ansteckend. Und die Fetthülle wird einfach mit Seife zerstört. Deswegen ist regelmäßiges Händewaschen ja so angesagt.

    Also kann man die Masken sehr effektiv mit Seife waschen.

  • Fehler bei Script mit DBF-UDF

    • BugFix
    • 29. April 2020 um 15:09

    Verzeih, wenn ich nochmal reingrätsche. Aber hast du meinen Beitrag und meinen Lösungsvorschlag eigentlich gelesen? Damit wäre dein Aufwand nahezu null.

  • Fehler bei Script mit DBF-UDF

    • BugFix
    • 29. April 2020 um 13:39

    Also ich habe mir das mal näher angeschaut. Unter der Prämisse, dass .FO ausschließlich an der Position existiert, wo es auch entfernt werden soll, braucht man gar nicht so viel Aufwand betreiben. Das geht mit ein paar Zeilen:

    AutoIt
    Global $fH = FileOpen('BLP_FLAECHEN.dbf', 16) ; read binary
    Global $sBinary = FileRead($fH)
    FileClose($fH)
    
    $sBinary = StringReplace($sBinary, '2E464F', '202020') ; replace ".FO" mit "   "
    $fH = FileOpen("BLP_FLAECHEN_1.dbf", 1+8+16) ; write binary
    FileWrite($fH, $sBinary)
    FileClose($fH)

    ;)

  • Fehler bei Script mit DBF-UDF

    • BugFix
    • 29. April 2020 um 09:28

    Bin gerade unterwegs.

    Gegen Mittag bin ich wieder am PC, dann werde ich mal testen, ob ich mit den Funktionen, die ich für meine dbf Dateien verwende, auch deine öffnen kann. Die DBF-UDF habe ich mir noch nicht angesehen. Ich verwende dazu nicht den Stream, wie ich in vielen Bsp. schon gesehen habe, sondern direkt einen DB-Treiber.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 28. April 2020 um 21:06

    Falls du mehrere StaticText hast, die du transparent zeichnen möchtest, kann man das so lösen:

    Code
    proc transPaint(sender: wWindow) =
      # paints StaticText Ctrl transparent
      var
        dc = PaintDC(sender)
        rect = (0, 0, sender.getBestSize().width, sender.getBestSize().height)
    
      dc.backgroundTransparent = true
      dc.font = sender.getFont()
      dc.drawLabel(sender.label, rect, wCenter)  
      
    
    staticText.wEvent_Paint do ():
      transPaint(staticText)
    Alles anzeigen
  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 28. April 2020 um 19:22

    Du mußt refresh für das Panel aufrufen. Wenn du nur das Text-Ctrl neuzeichnest bleibt dafür der alte Inhalt noch bestehen, erst mit Neuzeichnen des Panel wird auch das Ctrl neu berechnet.

    Was bisher aber amit nicht funktioniert, ist dass das Layout angepasst wird. Ich hatte den Text mit centerX/Y am Panel ausgerichtet. Das wird bei Aufruf von Layout aber nicht mit der neuen Textlänge korrigiert.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 28. April 2020 um 11:57

    Jetzt habe ich noch einen eigenen Mouse-Handler eingefügt. Funktioniert nur noch nicht so, wie erwartet. Ich kann dort eine Terminalausgabe mit "echo" ausführen, aber keine eigenen Prozeduren ausführen (also z.B. den TextEntryDialog aufrufen), da fehlt mir momentan noch der Hintergrund.

    Code
    staticText.wEvent_Paint do ():
      var
        dc = PaintDC(staticText)
        rect = (0, 0, staticText.getBestSize().width, staticText.getBestSize().height)
    
      dc.backgroundTransparent = true
      dc.font = staticText.getFont()
      dc.drawLabel(staticText.label, rect, wCenter)
      # eigenen Mouse-Handler definieren:
      staticText.connect(wEvent_LeftDown) do (event: wEvent):
        echo "LEFT-DOWN"
    Alles anzeigen


    EDIT: Oscar

    Oh man, das Standardverfahren zum Erkennen der Events funktioniert ja. Es ist der Dialog, der sich nicht starten ließ!

    Ich kann zwar nicht genau erkennen, was an deiner Dialogzeile falsch sein soll, aber hiermit funktioniert es, wie gewollt:

    Code
    staticText.wEvent_CommandLeftClick do ():
      let dialog = TextEntryDialog(frame, value=staticText.label, message="Input text", caption="Modaless TextEntryDialog", style=wDefaultDialogStyle)
      dialog.showModaless()

    Vor lauter Auskommentierungen bei mir übersehen: Es fehlte doch was: dialog.showModaless()

    EDIT2: Oscar

    Hier noch mal kpl. mit Übernahme Eingabe + Neuzeichnen.

    Code
    staticText.wEvent_CommandLeftClick do ():
      let dialog = TextEntryDialog(frame, value=staticText.label, message="Input text", caption="Change The Text", style=wDefaultDialogStyle)
    
      dialog.wEvent_DialogClosed do ():
        if dialog.returnCode == wIdOk and dialog.value.len != 0:
          staticText.label = dialog.value
          panel.refresh()
    
      dialog.showModaless()
  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 28. April 2020 um 11:03

    So, Resizen und Transparenz konnte ich lösen. Ich habe die Prozedur zum Zeichnen des StaticText-Ctrl überschrieben. Nur Klickevent geht damit (noch) nicht:

    Code
    staticText.wEvent_Paint do ():
      var
        dc = PaintDC(staticText)
        rect = (0, 0, staticText.getBestSize().width, staticText.getBestSize().height)
    
      dc.backgroundTransparent = true
      dc.font = staticText.getFont()
      dc.drawLabel(staticText.label, rect, wCenter)
  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 28. April 2020 um 09:12

    OK, das Resizen geht nicht mehr automatisch. Das Klickevent auf den Text zu erkennen, ist sicher durch Eventzuordnung zum Rect realisierbar, aber auch erhöhter Aufwand.

    Ich werde mich mal in die Tiefen des Moduls eingraben. Vielleicht finde ich die Lösung.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 27. April 2020 um 18:08

    So, Antwort vom Autor:

    "You can deal with wEvent_Paint event and try to paint what you want. For example:"

    Code
    import wNim/[wApp, wFrame, wPanel, wBitmap, wPaintDC, wFont]
    
    var
      app = App()
      frame = Frame(title = "Demo")
      panel = Panel(frame)
      bitmap = Bitmap(r"release\examples\images\logo.png")
    
    panel.wEvent_Paint do ():
      var
        dc = PaintDC(panel)
        rect = (0, 0, bitmap.size.width, bitmap.size.height)
    
      dc.backgroundTransparent = true
      dc.font = Font(18)
      dc.drawBitmap(bitmap)
      dc.drawLabel("Hello, World", rect, wRight or wBottom)
    
    frame.center()
    frame.show()
    app.mainLoop()
    Alles anzeigen
  • [Nim] Layout - DSL

    • BugFix
    • 27. April 2020 um 12:56

    Und hier noch ein zweites Beispiel. Linke Seite enthält statischen Text (Höhe und Breite fix nach längstem Text). Rechte Seite für Eingaben mit Minimumbreite aber veränderlich. Das Fenster kann nicht kleiner gemacht werden als die minimal beanspruchte Fläche.

    Code
    import wnim/[wApp, wFrame, wPanel, wStaticText, wTextCtrl]
    
    proc main() =
      let app = App()
      let frame = Frame(title="Test DSL #2")
      let panel = Panel(frame)
    
      let st1 = StaticText(panel, label="Zeile 1 ist die längste")
      # von längster Zeile die Größe abfragen
      let stWidth = st1.getBestSize().width
      let stHeight = st1.getBestSize().height
      let tcHeight = stHeight     
      let tc1 = TextCtrl(panel)   # horizontral mit StaticText zentrieren
    
      let st2 = StaticText(panel, label="Zeile 2")
      let tc2 = TextCtrl(panel)
    
      let st3 = StaticText(panel, label="Zeile 3")
      let tc3 = TextCtrl(panel)
    
      let st4 = StaticText(panel, label="Zeile 4")
      let tc4 = TextCtrl(panel)
    
      proc layout() =
        panel.layout:
          # Zeile 1
          st1:
            left = panel.left + 10
            centerY = panel.top + 10 + (stHeight / 2)
            height = stHeight # beste Höhe des (längsten) Textes
            width = stWidth   # beste Breite des längsten Textes
          tc1:
            left = st1.right + 20
            centerY = st1.centerY
            height = tcHeight
            # Rand (links + rechts) + StaticText.Breite + Abstand zw. st & tc 
            width = panel.width - (20 + stWidth + 20) 
          # Zeile 2
          st2:
            left = st1.left
            centerY = tc1.centerY + 10 + tcHeight
            height = stHeight
            width = stWidth
          tc2:
            left = tc1.left
            centerY = st2.centerY
            height = tcHeight
            width = tc1.width
          # Zeile 3
          st3:
            left = st1.left
            centerY = tc2.centerY + 10 + tcHeight
            height = stHeight
            width = stWidth
          tc3:
            left = tc1.left
            centerY = st3.centerY
            height = tcHeight
            width = tc1.width
          # Zeile 4
          st4:
            left = st1.left
            centerY = tc3.centerY + 10 + tcHeight
            height = stHeight
            width = stWidth
          tc4:
            left = tc1.left
            centerY = st4.centerY
            height = tcHeight
            width = tc1.width
    
      frame.wIdExit do ():
        frame.delete()
    
      panel.wEvent_Size do ():
        layout()
    
      layout()
    
      # Breite: Rand + StaticText + TextCtrl (min 200); Höhe 4 Zeilen + Abstände
      frame.minSize = (stWidth + 230, (4 * tcHeight) + (5 * 10) + (frame.size.height - panel.size.height))
    
      frame.center()
      frame.show()
      app.mainLoop()
    
    main()
    Alles anzeigen
  • [Nim] Layout - DSL

    • BugFix
    • 27. April 2020 um 11:00

    Also das Layout mit VFL zu gestalten ist echt nicht mein Ding. Ich habe mir jetzt mal DSL näher angeschaut und muss sagen, dass dies (für mich) wesentlich verständlicher rüberkommt.

    Hier mal ein kommentiertes Bsp. dazu:

    EDIT: Ich hatte gerade einen Beitrag im nim Forum gelesen, mit der Empfehlung nur in Prozeduren zu arbeiten. Für ein einzelnes Skript sicher nicht mit allzu großer Relevanz, aber es geht hierbei um die Reduzierung Globaler Variablen (im Hauptprogramm sind Variablen außerhalb von Prozeduren Global) und somit der Entlastung des GC.

    Deshalb habe ich das Programm jetzt in die Prozedur main verlagert. (Prozeduren können, wie zu sehen, in Prozeduren erstellt werden)

    Code
    import wnim/[wApp, wFrame, wPanel, wButton]
    
    proc main() =
      let app = App()
      let frame = Frame(title="Test DSL")
      let panel = Panel(frame)
    
      # alle Button gleiche Höhe, gesamte Fensterhöhe ausnutzen (abzgl. Rand: 10)
      # Zeile 1 - gesamte Breite ausfüllen
      let button1 = Button(panel, label="1")
      let button2 = Button(panel, label="2")
      let button3 = Button(panel, label="3")
    
      # Zeile 2 - mittig mit derselben Breite der Button aus #1
      let button4 = Button(panel, label="4")
      let button5 = Button(panel, label="5")
    
      # Zeile 3 - wie Zeile 2
      let button6 = Button(panel, label="6")
      let button7 = Button(panel, label="7")
    
      # Zeile 4 - wie Zeile 1
      let button8 = Button(panel, label="8")
      let button9 = Button(panel, label="9")
      let button10 = Button(panel, label="10")
    
      proc layout() =
        panel.layout:
          # Zeile 1
          button1:
            top = panel.top + 10
            left = panel.left + 10
            # oberer + unterer Rand + 3*Zwischenräume (5*10)
            height = (panel.height - (5 * 10)) / 4  # 4 Zeilen
            # linker + rechter Rand + 2*Zwischenräume (4*10)
            width = (panel.width - (4 * 10)) / 3  # 3 Spalten
          button2:
            top = button1.top
            left = button1.right + 10
            height = button1.height
            width = button1.width
          button3:
            top = button1.top
            left = button2.right + 10
            height = button1.height
            width = button1.width
          # Zeile 2
          button4:
            top = button1.bottom + 10
            # links von Mitte 1/2 Abstand und Buttonbreite
            left = (panel.width / 2) - (5 + button1.width) 
            height = button1.height
            width = button1.width
          button5:
            top = button4.top
            left = button4.right + 10
            height = button1.height
            width = button1.width
          # Zeile 3
          button6:
            top = button4.bottom + 10
            left = button4.left
            height = button1.height
            width = button1.width
          button7:
            top = button6.top
            left = button6.right + 10
            height = button1.height
            width = button1.width
          # Zeile 4
          button8:
            top = button6.bottom + 10
            left = button1.left
            height = button1.height
            width = button1.width
          button9:
            top = button8.top
            left = button8.right + 10
            height = button1.height
            width = button1.width
          button10:
            top = button8.top
            left = button9.right + 10
            height = button1.height
            width = button1.width    
    
      frame.wIdExit do ():
        frame.delete()
    
      panel.wEvent_Size do ():
        layout()
    
      layout()
      frame.center()
      frame.show()
      app.mainLoop()
    
    main()
    Alles anzeigen
  • [Nim] Registry - Typ eines Schlüssels abfragen

    • BugFix
    • 26. April 2020 um 20:01
    Zitat von Lottich

    Ist das wirklich problematisch?

    Nein, das nicht. Aber ich hatte eigentlich erwartet, dass die proprietären Registryfunktionen das direkt auslesen, denn es ist ja im Schlüssel hinterlegt.

  • [Nim] Fragen zu einem Frame (Window)

    • BugFix
    • 26. April 2020 um 17:23
    Zitat von Oscar

    Und das Hintergrundbild verhindert das betätigen der Buttons. Also muss wohl irgendwie der Klick auf das Bild deaktiviert werden (wie in AutoIt). Aber wie?

    Das ist ausnahmsweise einfach. Wir müssen nicht wie in AutoIt denken. Hier ist alles auch ein Fenster. D.h. die Referenz für die Button und alle Ctrl, die über dem Bild liegen sollen, muss dann auch das Bild sein:

    let button = Button(staticbitmap, label="Font", pos=(0, 80)) etc.

    Wegen der anderen Sachen werde ich mal schauen.

    Edit:

    Ich habe es mal versucht mit: style=wTransparentWindow und staticText.setTransparent() - beides ohne Erfolg. Bsp. habe ich dazu auch nicht entdecken können.

    Da es wohl nicht trivial ist, habe ich eine Anfrage an den Autor gestellt: https://github.com/khchen/wNim/issues/55

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™