Hast Du Dir die neue Beta von Jos schon angesehen?
Ich werds mal ansehen.
Hast Du Dir die neue Beta von Jos schon angesehen?
Ich werds mal ansehen.
Ich habe SciTE auf neuem System in der aktuellen Version installiert. Leider funktioniert hier das Syntaxhighlighting eigener UDF nicht.
Laut Anweisung in SciTE ist so vorzugehen:
# Add the below lines to your SciTEUser.properties when you want to add User Abbreviations and UDFS
#import au3.keywords.user.abbreviations
#import au3.UserUdfs
Ich habe also meine UDF in der au3.UserUdfs.properties eingetragen und import au3.UserUdfs in die SciTEUser.properties.
Aber still ruht der See - es funktioniert nicht.
Das hat ja auch in der alten Version niemals funktioniert, der einzig mögliche Weg war, die eigenen UDF bei den Standard-UDF mit einzutragen. Ist natürlich immer eklig, weil man als User keinen Schreibzugriff im Programmordner hat.
Hat irgendjemand eine sinnvolle Lösung hierfür gefunden?
Ich will mal eine Leiche schänden.
Als ich gerade auf meinem neuen Rechner SciTE in das Dark-Theme gepfriemelt habe ist mir aufgefallen, dass es die 5.te Farbe auch schon default gibt (style.errorlist.13). Dort die Farbe eurer Wahl setzen - fertig.
("back" und "eolfilled" sind nur im Dark-Theme nötig)
# OUTPUT PANE uses errorlist colors
style.errorlist.32=$(font.small),#1D1D1D
style.errorlist.0=fore:#DCDCCC,back:#1D1D1D,eolfilled
# diff changed >
style.errorlist.4=fore:#0000F0,back:#1D1D1D,eolfilled
# diff changed !
style.errorlist.10=fore:#FF003F,back:#1D1D1D,eolfilled
# diff addition +
style.errorlist.11=fore:#00A800,back:#1D1D1D,eolfilled
# diff deletion -
style.errorlist.12=fore:#FFA200,back:#1D1D1D,eolfilled
# diff message --- and +++
style.errorlist.13=fore:#FF00FF,back:#1D1D1D,eolfilled
Alles anzeigen
Sieht bei mir so aus:
Ich verstehe unter einem Forum eine Plattform der "Hilfe zur Selbsthilfe" - so agieren wir (nebst eines Minimums an Höflichkeit) zumindest in den 2 Foren, die
ich adminstriere. Da beantwortet man die Fragen oder versucht es zumindest, mögen sie einem Profi auch noch flach erscheinen. Ich erachte mich nach über
40 Jahren Berufserfahrung mittlerweile als recht fit in meinem Fachbereich. Trotzdem / genau deswegen würde es mir nicht im Traum einfallen, jemandem zu
erklären, dass ich effektivere, übersichtlichere und sicherere Programme schreiben kann als sie/er, dass wissen die Fragenden, sonst würde sie/er nicht fragen!
Du wirst hier im Forum selten erleben, dass ich die Contenance verliere. Aber wenn ich deine Einlassungen hier lese, bin ich kurz davor.
Dir wäre also geholfen gewesen, wenn als erste Antwort auf deine Frage die Funktion Eval benannt worden wäre - ohne weiteren Kontext. Denn das verlangst du ja stur: Ich frage - ihr Forumvolk habt zu antworten.
Keine Ahnung, was in deinen administrierten Foren so abgeht. Hier geht es uns um Hilfe zur Selbsthilfe. Und in 7 von 10 Fällen ist einfach das XY-Problem gegeben. Wenn du unsere Erfahrungen ignorieren willst: WARUM FRAGST DU???
Da wirst du wohl einen DOS-Emulator für dein Adressprogramm brauchen (z.B. https://www.dosbox.com/). Oder du installierst eine VM mit Win98.
Dann hätte Deine Frage doch lauten sollen:
Wie konvertiere ich die Tabellen einer mit AutoIt erstellten SQLite-Datenbank nach HTML?
Die richtige Fragestellung - ein leidiges Problem.
@PSblnkd Ich empfehle mal, auch den Titel deines Threads dahingehend zu ändern. (SQLite-DB to HTML HowTo o.ä.)
Ich habe ja das Skript zur Markierung von Tab-Item in SciTE erstellt.
Jetzt nutze ich das auch unter Win 11. Bisher unter Win 7 lief das tadellos. Unter Win 11 funktioniert es auch - aber es flickert, nicht sehr störend - aber merkbar.
Könnt ihr das nachvollziehen - und habt ggf. eine Idee zur Lösung?
Wenn das dbf-Ausgabeformat wirklich eine DBase-Datenbank ist,
Ich habe mal aus meinem Uralt-Programm die erforderlichen Parts zum dBase-Datei lesen zusammengefasst. Kannst ja mal damit testen. Die DBF wird hier in ein Array eingelesen.
;-- TIME_STAMP 2023-09-25 12:49:21
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIHObj.au3>
#include <WinAPIInternals.au3>
;===================================================================================================
$DBF = "C:\PATH\ZU_DEINER.DBF"
;===================================================================================================
Global Const $tagField = "char name[11];" & _ ; 0-10 | 11 bytes | field name
"char type;" & _ ; 11 | 1 byte | field type in ASCII
"uint memadress;" & _ ; 12-15 | 32 bit number | field data address
"byte len;" & _ ; 16 | 1 byte | field length
"byte deccount;" & _ ; 17 | 1 byte | field decimal count
"byte reserved[14];" ; 18-31 | 14 bytes | reserved bytes
Global Const $tagFileHeader = "byte ver;" & _ ; 0 | 1 byte | dBASE III version number
"byte date[3];" & _ ; 1-3 | 3 bytes | date of last update
"uint reccount;" & _ ; 4-7 | 32 bit number | number of records in data file
"ushort headerlength;" & _ ; 8-9 | 16 bit number | length of header structure
"ushort reclength;" & _ ; 10-11 | 16 bit number | length of the record
"byte reserved[20];" ; 12-31 | 20 bytes | reserved bytes
;~ $tagField & _ ; 32-n | 32 bytes each | field descriptor array
;~ "byte terminate;" ; n+1 | 1 byte | 0DH as the field terminator
Global $Header = DllStructCreate($tagFileHeader)
Global $DatabaseArray[1][2]
Global $databaseFieldInfos[1][5]
_ReadDBF($DBF)
_ArrayDisplay($databaseFieldInfos)
_ArrayDisplay($DatabaseArray)
Func _ReadDBF($inPathDBF)
Local $DBFFile = _WinAPI_CreateFile($inPathDBF, 2, 2, 2)
Local $ReadChars
If _WinAPI_ReadFile($DBFFile, DllStructGetPtr($Header), DllStructGetSize($Header), $ReadChars) Then
If DllStructGetData($Header, "ver") <> 3 Then ; Version muss
MsgBox(16, 'Error', "No supportet dbase format (only dbase 3 without .DBT-files)")
_WinAPI_CloseHandle($DBFFile)
Exit
EndIf
; $tagField erstellen
Local $FieldDescriptor = DllStructCreate($tagField)
; Infos aus Header auslesen
Local $HeaderLength = DllStructGetData($Header, "headerlength")
Local $FieldsCount = Floor(($HeaderLength - DllStructGetSize($Header) - 1) / DllStructGetSize($FieldDescriptor))
Local $RecordLength = DllStructGetData($Header, "reclength")
Local $RecordsCount = DllStructGetData($Header, "reccount")
; Zahl der Felder: (Headergröße- Dateiheadergröße- terminator-byte) / Feldbeschreibungs-größe
If $FieldsCount = 0 Then
MsgBox(16, '', "No fields")
Else
;~ Global $DatabaseArray[$RecordsCount + 1][$FieldsCount]
;~ Global $databaseFieldInfos[$FieldsCount][5]
ReDim $DatabaseArray[$RecordsCount + 1][$FieldsCount]
ReDim $databaseFieldInfos[$FieldsCount][5]
For $i = 1 To $FieldsCount
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($FieldDescriptor), DllStructGetSize($FieldDescriptor), $ReadChars)
$DatabaseArray[0][$i - 1] = DllStructGetData($FieldDescriptor, "name")
For $s = 0 To 4
$databaseFieldInfos[$i - 1][$s] = DllStructGetData($FieldDescriptor, $s + 1)
Next
Next
Local $CHECKREAD = DllStructCreate("byte terminate")
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($CHECKREAD), 1, $ReadChars)
If DllStructGetData($CHECKREAD, 1) == 0x0D Then
Local $RecordStruct = _CreateRecordStruct($databaseFieldInfos)
For $i = 1 To $RecordsCount
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($RecordStruct), DllStructGetSize($RecordStruct), $ReadChars)
If $ReadChars = 0 Then
; keine Felder mehr (Fehler)
ReDim $DatabaseArray[$i][$FieldsCount]
ExitLoop
EndIf
For $j = 1 To $FieldsCount
$DatabaseArray[$i][$j - 1] = DllStructGetData($RecordStruct, "field" & $j)
#Region Datentypen konvertieren
Switch $databaseFieldInfos[$j - 1][1]
Case "C" ; characters: nothing
$DatabaseArray[$i][$j - 1] = OemToChar($DatabaseArray[$i][$j - 1])
Case "N" ; numeric
If StringInStr($DatabaseArray[$i][$j - 1], '.') Then
$DatabaseArray[$i][$j - 1] = StringTrimRight(StringStripWS(StringReplace($DatabaseArray[$i][$j - 1], '.', ','), 1), 2)
Else
$DatabaseArray[$i][$j - 1] = Number($DatabaseArray[$i][$j - 1])
EndIf
Case "L"
Switch $DatabaseArray[$i][$j - 1]
Case "?"
$DatabaseArray[$i][$j - 1] = "N/A"
Case 'Y', 'y', 'T', 't'
$DatabaseArray[$i][$j - 1] = True
Case 'N', 'n', 'F', 'f'
$DatabaseArray[$i][$j - 1] = False
EndSwitch
Case "D"
$DatabaseArray[$i][$j - 1] = StringRegExpReplace($DatabaseArray[$i][$j - 1], "\A(\d{4})(\d\d)(\d\d)\Z", "$1/$2/$3")
Case "M" ; not supportet
EndSwitch
#EndRegion Datentypen konvertieren
Next
Sleep(10)
Next
Else
MsgBox(0, 'Error', "Wrong fielddescript_or_table")
EndIf
EndIf
_WinAPI_CloseHandle($DBFFile)
EndIf
; Spalten infos hizufügen zu Feld-Info array
ReDim $databaseFieldInfos[UBound($databaseFieldInfos)+1][5]
$databaseFieldInfos[UBound($databaseFieldInfos)-1][0] = "[[ NAME ]]"
$databaseFieldInfos[UBound($databaseFieldInfos)-1][1] = "[[ TYP ]]"
$databaseFieldInfos[UBound($databaseFieldInfos)-1][2] = "[[ ADRESSE ??? ]]"
$databaseFieldInfos[UBound($databaseFieldInfos)-1][3] = "[[ Byte-Länge ]]"
$databaseFieldInfos[UBound($databaseFieldInfos)-1][4] = "[[ Dezimalstellen ]]"
EndFunc
Func _CreateRecordStruct(ByRef $databaseFieldInfos)
Local $sText = "char deleted;"
For $i = 1 To UBound($databaseFieldInfos)
$sText &= "char field" & $i & "[" & $databaseFieldInfos[$i - 1][3] & "];"
Next
Return DllStructCreate($sText)
EndFunc ;==>_CreateRecordStruct
;===============================================================================
; Name: OemToChar
; Description: Wandelt einen ASCII- in einen ANSI-String
; Parameter(s): $szSrc = String der umgewandelt werden soll
; Requirement(s): keine
; Return Value(s): bei Erfolg: umgewandelter String
; bei Fehler: "" und @error = 1
; Author(s): bernd670
;===============================================================================
Func OemToChar($szSrc)
Local $placeholder
For $i = 0 To StringLen($szSrc)
$placeholder &= " "
Next
Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str",$placeholder)
If IsArray($lRetVal) And $lRetVal[0] = 1 Then
Return SetError(0,0,$lRetVal[2])
EndIf
Return SetError(1,0,"")
EndFunc ;==>OemToChar
Alles anzeigen
Ich habe das Riesenglück, dass unsere Arbeitsplatzrechner nicht ans Internet angeschlossen sind und somit mögliche Sicherheitslücken in der Software so interessant sind, wie der bekannte Sack Reis in China.
Aus diesem Grund läuft auch immer noch absolut zuverlässig unser Warenwirtschaftssystem mit einem Softwarestand von 2002.
Der Softwarelieferant wollte uns schon mehrfach so supertolle Updates überbügeln. Da haben wir dankend abgelehnt. Die Updates hätten u.A. zu einer kompletten Änderung unserer Arbeitsabläufe führen müssen. Ich hatte die Software soweit aufgebohrt (mit AutoIt) und an unsere Bedürfnisse angepasst, dass sie genau in unsere Abläufe passt. Andersrum ist schwachsinnig.
Wie man sieht sind 20 Jahre ohne Änderung kein Anzeichen für etwas Schlechtes. Im Kern sollte es immer darum gehen: Bringt eine Veränderung allen/vielen Anwendern einen echten Mehrwert. (Optischer Schnickschnack zählt m.M. nicht dazu)
warum die SQL-Light-UDF das .dbf-Format verwendet, statt .sql
SQLite verwendet gar keine Standard-Dateiendung, die ist völlig unerheblich. Ausschließlich der Dateiinhalt legt fest, dass dieses eine SQLite-Datenbank ist:
#include <SQLite.au3>
$sql = "C:\Programming\sqlite\dll-win32-x86\sqlite3.dll"
_SQLite_Startup($sql)
$db = "Datenbank.teddybaer" ; beliebiger Datenbankname
; Datenbank als permanente Datei erstellen
_SQLite_Open($db)
If @error Then
ConsoleWrite('Fehler beim Erstellen der Datenbankdatei' & @CRLF)
_SQLite_Close()
Exit
EndIf
_SQLite_Exec(-1, "CREATE TABLE aTest (a,b,c);") ; CREATE a Table
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('c','2','World');") ; INSERT Data
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('b','3',' ');") ; INSERT Data
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('a','1','Hello');") ; INSERT Data
_SQLite_Close()
; Datenbank erneut öffnen und Inhalt abfragen
_SQLite_Open($db)
If @error Then
ConsoleWrite('Fehler beim Öffnen der Datenbank' & @CRLF)
_SQLite_Close()
Exit
EndIf
Local $hQuery, $aRow, $sMsg
_SQLite_Query(-1, "SELECT c FROM aTest ORDER BY a;", $hQuery) ; the query
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
$sMsg &= $aRow[0]
WEnd
ConsoleWrite("Query: " & $sMsg & @CRLF)
_SQLite_Close()
_SQLite_Shutdown()
Alles anzeigen
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:
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.
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.
Laut google : 65% aller DBF-Dateien sind XBase DataBase-Dateien. Diese Dateien sind Klartext,
Wen hat Google denn da befragt
Mir ist noch nie eine Klartext *.dbf untergekommen, sondern ausschließlich Dateien im dBase-Datenbank Format. Das ist aber sauber strukturiert und lässt sich auslesen (Feldnamen, -typen, Inhalte).
Obwohl das Format aus den Anfängen der Computerzeit stammt, wurde es (und wird teilweise heute noch) als super leicht zu implementierendes Datenexport-Tool verwendet.
Ich arbeite regelmäßig damit (OK, ich stamme auch aus der Anfangszeit des PC ).
Auch im aktuellen MS-Office ist das Format weiterhin eingebunden:
Selbst dann ist die GUI noch zu groß.
Wenn ich viele optionale Funktionen anbieten - aber das ganze platzsparend anzeigen möchte, verwende ich Comboboxen. In der Regel kannst du deinen Platzbedarf damit auf 20% eindampfen. (In Kombination mit Mehrfachbelegung von Ein- /Ausgabefeldern)
Die GUI ist absichtlich so groß.
Mal als Tipp:
Eine GUI nie größer als ca. 1200 x 1000 (bzw. was in der Höhe in der Auflösung etwa den Wert hat).
Dann ist die Wahrscheinlichkeit groß, dass deine GUI auf fast allen Monitoren sichtbar ist.
Passen deine Inhalte da nicht drauf:
- scrollbare GUI oder
- Anordnung auf Tabs oder
- Verwendung von Child-GUI
Du kannst nicht davon ausgehen, dass alle solche Monsterauflösungen verwenden.
Ich sitze meist am Laptop - 1280 x 1024.
Man kann aber auch einen Dateinamen vorgeben.
Hatte ich noch angefügt.
$zint_path = "C:\Programming\addons\zint_barcode\zint-2.12.0"
$zint_exe = $zint_path & "\zint.exe"
$cmd = $zint_exe & ' -b QRCODE --border=1 --box -d "Gerade CLI ausprobiert - Das ist wirklich easy!" --quietzones'
Run($cmd, $zint_path, @SW_HIDE)
; Ergebnis ist automatisch "out.png" im WorkingDir
; oder: gezielte Ausgabe mit ' -o "\out\path\filename.ext"'
Du kannst das ganze in einer Schleife durchlaufen lassen, sofern du die Button Id's z.B. in ein Array geschrieben hast:
Oder:
Falls einzelne Variable für jede ID und alle Button wurden nacheinander erstellt
For $i = $ID_Button1st To $ID_ButtonLast ...
Um in deiner Mod-Funktion dann von 1 steigende Werte zu erhalten musst du dort zurück rechnen
Mod($deineZahl, ($i - $ID_Button1st) + 1)
Wer hat eigentlich diese dll geschrieben? Vielleicht kann ich ihn mal anschreiben.
Wenn man sowas mit einem Hook macht, werden die Flags ausgewertet, um CTRL abzufragen.
Vielleicht kannst du das ähnlich einbinden.
Geht viel einfacher als ich dachte.
Hintergrund ist, dass niemals 2 Tasten gleichzeitig gedrückt werden, sondern immer nacheinander. "Ctrl+A" wird auch nur erkannt, wenn erst "Ctrl" gedrückt wird und dann zusätzlich "A".
Genau diese Folge muss nun abgeprüft werden. Dazu einfach den Wert der zuletzt gedrückten Taste speichern und zum Vergleich nutzen.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
Opt("GUIOnEventMode", 1)
Global Const $VK_CONTROL = 0x11
Global Const $VK_A = 0x41
Global $hGui = GUICreate("Test", 320, 240)
GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
Global $cLV_Test = GUICtrlCreateListView("Name", 5, 5, 310, 230, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
For $i = 1 To 9
_GUICtrlListView_AddItem($cLV_Test, "Item" & $i)
Next
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)
While Sleep(10)
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam, $lParam
Local $tInfo, $iItem
Local Static $vkLastPressed = 0
Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
Switch $tNMHDR.Code
Case $LVN_KEYDOWN
Switch $tNMHDR.IDFrom
Case $cLV_Test
$tInfo = DllStructCreate($tagNMLVKEYDOWN, $lParam)
If $vkLastPressed <> $tInfo.VKey Then
If $vkLastPressed = $VK_CONTROL And $tInfo.VKey = $VK_A Then
ConsoleWrite('! <CTRL+A> pressed' & @CRLF)
EndIf
EndIf
$vkLastPressed = $tInfo.VKey
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _GUI_EVENT_CLOSE()
Exit
EndFunc
Alles anzeigen