Hast du denn auch alle Variablen etc. so eingebaut wie ich im Testcode?
Notfalls musst du das ganze Skript posten, ansonsten wird eine Hilfe dazu schwierig.
Hast du denn auch alle Variablen etc. so eingebaut wie ich im Testcode?
Notfalls musst du das ganze Skript posten, ansonsten wird eine Hilfe dazu schwierig.
Ich habe dazu folgendes gefunden: https://support.microsoft.com/en-au/office/w…2a-68da245a0446
Alternativ teste mal ob dir das hilft: https://www.autoitscript.com/forum/topic/12…&comment=853798
@Moombas kannst du mir mal bitte noch erklären warum meine ini Datei nicht mehr geht, es steht zwar was in der ini aber die Input Felder werden nicht von der ini übernommen. Wenn jetzt aber "GUICtrlSetData($input1[3], IniRead($ini, "3","Sekunden", 2)) ;ggf. den Defaultwert (2) (wenn die Ini nicht gefunden/gelesen werden kann) ändern"
darin steht, trägt er die 2 ein so wie es im Code steht aber in der ini steht was anderes und die Zahlen trägt er nicht in die Input Felder.
Ich kann den fehler jetzt auch nicht finden.
Hast du denn $ini richtig gesetzt?
Bei meinem Code wäre das in Zeile 9, wo du den Dateinamen & Pfad natürlich noch anpassen musst.
Und ändere in Zeile 20 (bei meinem Code) BitOR($WS_VISIBLE, $WS_OVERLAPPEDWINDOW) in BitOR($WS_CAPTION, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_OVERLAPPED, $WS_SYSMENU, $WS_THICKFRAME) (Danke nochmal Velted für das aufschlüsseln) damit du später weißt was da gemacht wurde.
Natürlich Kontinuierlich.
Ist ja schliesslich ein WIRELESS Scanner. Wenn du abdrückst kommt der Input so gut wie ohne verzögerung.
Für das wenig geld echt ein cooles ding. Nur wie gut der Akku hält müssen wir noch testen.
Naja, das kommt auf den Anwendungsfall wie man Wireless definiert an.
Beispiel 1:
Der Scanner ist per Basis, Dongle, BT mit dem PC/Kasse/Smartphone,... verbunden und überträgt die gescannten Daten direkt.
Beispiel 2:
Du gehst zum Scannen außerhalb der Reichweite (anderes Lagerhaus, Keller,...), scannst Kartons etc. (die gescannten Daten werden dann im Scanner gespeichert) und packst ihn dann zum Auslesen in die Station, wo diese dann vom PC verarbeitet werden müssen. Das wäre auch eine Form von Wireless arbeiten.
Aber an die schon existierende (Teil)-Lösung von Oscar hatte ich garnicht mehr gedacht. Gut das Kanashius das noch wusste ![]()
Aber blöde Frage: Wie arbeitet der Scanner?
Wir haben das beim Zebra (gleiches Setup), das der Scanner erst die gescannten Datenüberträgt, wenn er in die Station gesteckt wird.
Oder überträgt der DeLock diese kontinuierlich?
Alternativ wäre eine art keylogger (alle Zeichen der Tastatur mitloggen (TAB/Leertaste macht ein Reset der Daten) und immer prüfen ob der eingegebene String deiner Erwartung entspricht) aber ob das Sinnvoll und im Unternehmen erlaubt ist, sei mal dahin gestellt.
Warum so kompliziert?
Also am einfachsten wäre, du hast eine GUI mit nur einem Input, wo du "reinscannst", davon abhängig läuft dann der Rest.
Würde da etwas dagegen sprechen?
Ich habe das Tabellenformat in der *.dat nochmal an das angepasst, was du gepostet hast, er nimmt den Titel nun aus dem Dateinamen anstatt der Tabelle (passt sonst nicht) und ein erster Entwurf für die PDF-Erstellung ist drin, müsstest du Testen.
Was noch fehlen würde wäre:
- Prüfung ob alles auf eine Seite passt und ggf. nächste Seite erzeugen.
- Anpassung der Schrift (aktuell sehen die Tabelleneinträge aus wie bold und die Überschrift nicht, irgendwie falsch herum, hab aber da die Lösung nicht gefunden)
- Kopfzeile und Fußzeile (das sollte relativ einfach machbar sein)
Opt('MustDeclareVars', 1)
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.16.0
Author: Moombas
Script Function:
Get data from a csv (*.dat) file put it into a Listview and save it as PDF
ToDo:
- Prüfung ob alles auf eine Seite passt und ggf. nächste Seite erzeugen.
- Anpassung der Schrift
- Kopfzeile und Fußzeile
#ce ----------------------------------------------------------------------------
#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#include <Array.au3>
#include <AutoItConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <MsgBoxConstants.au3>
#include "MPDF_UDF.au3"
;GUI
Global $fMain, $lvData, $eComment, $bSave, $bClose, $bReset, $bNext, $iTableHigh
Global Const $iMainWidth = 1024
Global Const $iMainHeight = 768
Global Const $iCommHeight = 200
Global Const $iBtnHeight = 40
Global Const $iBtnWidth = 100
Global Const $iBorder = 5
;Variables
Global $File, $FileName
Global $bSaved = False
Global Const $sInputFolder = @ScriptDir & '\In\'
Global Const $sOutputFolder = @ScriptDir & '\Out\'
Global Const $sBackupFolder = @ScriptDir & '\Backup\'
$FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
_FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';')
If not IsArray($File) then
MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine Datei gefunden.')
Exit
Else
_GenerateGUI($File)
EndIf
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $bReset
_FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';')
_CreateListView($File)
Case $bNext
_NextFile()
Case $bSave
_DataToPDF()
_NextFile()
Case $bClose
_Exit()
EndSwitch
;~ sleep(100)
WEnd
Func _GenerateGUI($aFile)
Local Const $sTitle = Stringsplit($FileName, '.')[1]
$fMain = GUICreate($sTitle, $iMainWidth, $iMainHeight)
_CreateListView($aFile)
$eComment = GUICtrlCreateEdit('Insert comments here', $iBorder, $iMainHeight-(2*$iBorder)-$iCommHeight-$iBtnHeight, $iMainWidth-(2*$iBorder), $iCommHeight)
$bReset = GUICtrlCreateButton('Reset' , $iBorder , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bNext = GUICtrlCreateButton('Nächste' , (2*$iBorder)+$iBtnWidth , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bSave = GUICtrlCreateButton('Speichern', ($iMainWidth/2)-($iBtnWidth/2)-(2*$iBorder), $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bClose = GUICtrlCreateButton('Beenden' , $iMainWidth-$iBorder-$iBtnWidth , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
GUISetState(@SW_HIDE, $bNext)
GUISetState(@SW_SHOW, $fMain)
EndFunc
Func _NextFile();Nimmt aktuell nur die erste gefundene Datei, Anpassungen notwendig, sofern durchgeklickt werden soll. Nach dem Speichern, wird hiermit die nächste Datei aufgerufen
If not $bSaved then
If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Return
EndIf
$FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
_FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';'); Kann gegen eine Funktion ausgetauscht werden um z.B. alle *.? Dateien in einem "Inputordner" o.ä. zu verarbeiten.
If not IsArray($File) then
MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine weitere Datei gefunden.')
Exit
Else
_CreateListView($File)
EndIf
EndFunc
Func _CreateListView($aFile)
Local Const $iRows = Ubound($aFile, $UBOUND_Rows)-1
Local Const $iCols = Ubound($aFile, $UBOUND_COLUMNS)-1
Local Const $sTitle = Stringsplit($FileName, '.')[1]
WinSetTitle($fMain, '', $sTitle)
_GUICtrlListView_Destroy($lvData)
$lvData = GUICtrlCreateListView("", $iBorder, $iBorder, $iMainWidth-(2*$iBorder), $iMainHeight-(4*$iBorder)-$iCommHeight-$iBtnHeight, $LVS_NOCOLUMNHEADER)
_GUICtrlListView_SetExtendedListViewStyle($lvData, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
For $iCol = 0 To $iCols
_GUICtrlListView_AddColumn($lvData, $aFile[0][$iCol], 150)
Next
For $iRow = 0 To $iRows
_GUICtrlListView_AddItem($lvData, $aFile[$iRow][0], $iRow)
For $iCol = 1 to $iCols
_GUICtrlListView_AddSubItem($lvData, $iRow, $aFile[$iRow][$iCol], $iCol)
Next
Next
GUICtrlSetData($eComment, 'Insert comments here')
$bSaved = False
Endfunc
Func _DataToPDF()
Local $aData = _GUICtrlListView_CreateArray($lvData)
Local Const $sTitle = Stringsplit($FileName, '.')[1]
Local Const $iBorder = 2
Local Const $bTest = True
Local Const $iRows = Ubound($aData, $UBOUND_Rows)-1
Local Const $iCols = Ubound($aData, $UBOUND_COLUMNS)-1
_ArrayDelete($aData, 0)
;PDF Code comes here
;set the properties for the pdf
_SetTitle($sTitle)
_SetSubject('')
_SetKeywords("pdf, data, sqllite")
_OpenAfter($bTest);open after generation
_SetUnit($PDF_UNIT_CM)
_SetPaperSize("CUSTOM",841.890, 595.276); A4 landscape
_SetZoomMode($PDF_ZOOM_FULLPAGE)
_SetOrientation($PDF_ORIENTATION_LANDSCAPE)
_SetLayoutMode($PDF_LAYOUT_CONTINOUS)
;initialize the pdf
_InitPDF($sOutputFolder & WinGetTitle($fMain) & '_' & Stringsplit($FileName, '.')[1] & '.pdf')
;=== load used font(s) ===
;fonts: Garamond
_LoadFontTT("_CalibriB", $PDF_FONT_CALIBRI, $PDF_FONT_BOLD)
_LoadFontTT("_CalibriI", $PDF_FONT_CALIBRI, $PDF_FONT_ITALIC)
_LoadFontTT("_Calibri" , $PDF_FONT_CALIBRI)
;begin page
_BeginPage()
_InsertTable($aData, $iBorder, _GetPageHeight()/_GetUnit()-2-(0.8*$iRows) , 0, 0.8*$iRows, $iCols, $iRows)
_SetTextRenderingMode(1)
_InsertRenderedText((_GetPageWidth()/_GetUnit())/2, _GetPageHeight()/_GetUnit()-1.5 , $sTitle , "_Calibri", 16, 100, $PDF_ALIGN_CENTER, 0x000000, 0x000000)
_InsertRenderedText($iBorder , _GetPageHeight()/_GetUnit()-$iTableHigh-$iBorder-1, GUICtrlRead($eComment), '_Calibri', 12, 100, $PDF_ALIGN_LEFT , 0x000000, 0x000000)
_SetTextRenderingMode(0)
_EndPage()
;write the buffer to disk
_ClosePDFFile()
;When ready
;~ FileMove($sInputFolder & $FileName, $sBackupFolder & WinGetTitle($fMain) & '_' & $FileName, $FC_OVERWRITE + $FC_CREATEPATH)
$bSaved = True
EndFunc
Func _Exit()
If $bSaved then
Exit
Else
If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Exit
EndIf
EndFunc
Func _InsertTable($aData, $iX, $iY, $iW = 0, $iH = 0, $iCols = 0, $iRows = 0, $lTxtColor = 0x000000, $lBorderColor = 0xdddddd)
Local $lScale, $sLength, $sText, $iColW, $iRowH, $lRGB = 0xffffff
Local $iPgW = Round(_GetPageWidth() / _GetUnit(), 1)
Local $iPgH = Round(_GetPageHeight() /_GetUnit() , 1)
If $iW = 0 Then $iW = $iPgW - $iX - 2
If $iH = 0 Then $iH = $iPgH - $iY - 2
$iTableHigh = $iH
_SetColourStroke($lBorderColor)
_Draw_Rectangle($iX, $iY, $iW, $iH, $PDF_STYLE_STROKED, 0, 0xffffff, 0.01)
_SetColourStroke(0)
$iColW = $iW / $iCols
$iRowH = $iH / $iRows
For $i = 0 To $iRows - 1
For $j = 0 To $iCols - 1
;~ If $i = 0 Then
;~ $lRGB = 0xfefefe
;~ Else
;~ $lRGB = 0xefefef
;~ EndIf
_SetColourStroke($lBorderColor)
_Draw_Rectangle($iX + $j * $iColW, $iY + $iH - ($i + 1) * $iRowH, $iColW, $iRowH, $PDF_STYLE_STROKED, 0, $lRGB, 0.01)
_SetColourStroke(0)
$sText = $aData[$i][$j]
If $sText = '' then $sText = ' '
$sLength = Round(_GetTextLength($sText, "_Calibri", 8), 1)
$lScale = Ceiling(0.75 * $iColW * 100 / $sLength)
_SetColourFill($lTxtColor)
_SetTextHorizontalScaling($lScale)
_DrawText($iX + $j * $iColW + $iColW / 10, $iY + $iH - ($i + 1) * $iRowH + ($iRowH - 10 / _GetUnit()) / 2, $sText, "_Calibri", 8, $PDF_ALIGN_LEFT, 0)
_SetTextHorizontalScaling(100)
_SetColourFill(0)
Next
Next
EndFunc ;==>_InsertTable
; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_CreateArray
; Description ...: Creates a 2-dimensional array from a listview.
; Syntax ........: _GUICtrlListView_CreateArray($hListView[, $sDelimeter = '|'])
; Parameters ....: $hListView - Control ID/Handle to the control
; $sDelimeter - [optional] One or more characters to use as delimiters (case sensitive). Default is '|'.
; Return values .: Success - The array returned is two-dimensional and is made up of the following:
; $aArray[0][0] = Number of rows
; $aArray[0][1] = Number of columns
; $aArray[0][2] = Delimited string of the column name(s) e.g. Column 1|Column 2|Column 3|Column nth
; $aArray[1][0] = 1st row, 1st column
; $aArray[1][1] = 1st row, 2nd column
; $aArray[1][2] = 1st row, 3rd column
; $aArray[n][0] = nth row, 1st column
; $aArray[n][1] = nth row, 2nd column
; $aArray[n][2] = nth row, 3rd column
; Author ........: guinness
; Remarks .......: GUICtrlListView.au3 should be included.
; Example .......: Yes
; ===============================================================================================================================
Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
If $iColumnCount < 3 Then
$iDim = 3 - $iColumnCount
EndIf
If $sDelimeter = Default Then
$sDelimeter = '|'
EndIf
Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
For $i = 0 To $iColumnCount - 1
$aColumns = _GUICtrlListView_GetColumn($hListView, $i)
$aReturn[0][2] &= $aColumns[5] & $sDelimeter
Next
$aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))
For $i = 0 To $iItemCount - 1
For $j = 0 To $iColumnCount - 1
$aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
Next
Next
Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
EndFunc ;==>_GUICtrlListView_CreateArray
Alles anzeigen
Die Funktion (auch wen sie vom Namen nicht 100% passt) könnte von der Crypt.au3 stammen (im Anhang).
Hier ein kleines Minisample:
Opt('MustDeclareVars', 1)
#include <Crypt.au3>
Global $sEncryptedData, $sDecryptedData
Global Const $sPassword = 'EncryptionPassword'
Global Const $vCryptKey = _Crypt_DeriveKey(StringToBinary($sPassword), $CALG_AES_256)
$sEncryptedData = StringTrimLeft(_Crypt_EncryptData('DataToEncrypt', $vCryptKey, $CALG_USERKEY), 2) ;StringTrim to remove 0x as indicator for Hex
Consolewrite($sEncryptedData & @CRLF)
$sDecryptedData = BinaryToString(_Crypt_DecryptData('0x' & $sEncryptedData, $vCryptKey, $CALG_USERKEY)) ;"'0x' & " only needed if 0x was previously removed
Consolewrite($sDecryptedData & @CRLF)
Alles anzeigen
Ah ok, dann war ich da falsch beim Zusammensetzen.
Noch ein Grund für:
ZitatAuch verwende lieber Bitor() um die Flags zu setzen, dann weiß man später noch, was du da gesetzt hast, mit dem puren Hex-Wert kann später keiner mehr was anfangen bzw. muss sich das mühsam zusammen suchen.
Im Anhang nur mal ein Sample (noch ohne die Konvertierung Array>PDF + Kommentarfeld).
Sicherlich noch einige andere Anpassungen notwendig aber ich denke manchmal ist es einfacher einfach mal einen Ausgangspunkt, der nicht nur aus Text besteht, zu haben.
Hier der Code (die GUI sollte sich dynamisch anpassen wenn man die jeweiligen Konstanen ändert für die jeweiligen Bedürfnisse):
Opt('MustDeclareVars', 1)
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.16.0
Author: Moombas
Script Function:
Get data from a csv (*.dat) file put it into a Listview and save it as PDF
ToDo:
- Convert from Array to PDF as table and insert comment text
#ce ----------------------------------------------------------------------------
#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#include <Array.au3>
#include <AutoItConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <MsgBoxConstants.au3>
;GUI
Global $fMain, $lvData, $eComment, $bSave, $bClose, $bReset, $bNext
Global Const $iMainWidth = 1024
Global Const $iMainHeight = 768
Global Const $iCommHeight = 200
Global Const $iBtnHeight = 40
Global Const $iBtnWidth = 100
Global Const $iBorder = 5
;Variables
Global $File, $FileName
Global $bSaved = False
Global Const $sInputFolder = @ScriptDir & '\In\'
Global Const $sOutputFolder = @ScriptDir & '\Out\'
Global Const $sBackupFolder = @ScriptDir & '\Backup\'
$FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
_FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';')
If not IsArray($File) then
MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine Datei gefunden.')
Exit
Else
_GenerateGUI($File)
EndIf
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $bReset
_CreateListView($File)
Case $bNext
_NextFile()
Case $bSave
_DataToPDF()
_NextFile()
Case $bClose
_Exit()
EndSwitch
;~ sleep(100)
WEnd
Func _GenerateGUI($aFile)
Local Const $sTitle = $aFile[0][0]
$fMain = GUICreate($sTitle, $iMainWidth, $iMainHeight)
_CreateListView($aFile)
$eComment = GUICtrlCreateEdit('Insert comments here', $iBorder, $iMainHeight-(2*$iBorder)-$iCommHeight-$iBtnHeight, $iMainWidth-(2*$iBorder), $iCommHeight)
$bReset = GUICtrlCreateButton('Reset' , $iBorder , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bNext = GUICtrlCreateButton('Nächste' , (2*$iBorder)+$iBtnWidth , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bSave = GUICtrlCreateButton('Speichern', ($iMainWidth/2)-($iBtnWidth/2)-(2*$iBorder), $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
$bClose = GUICtrlCreateButton('Beenden' , $iMainWidth-$iBorder-$iBtnWidth , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
GUISetState(@SW_HIDE, $bNext)
GUISetState(@SW_SHOW, $fMain)
EndFunc
Func _NextFile();Nimmt aktuell nur die erste gefundene Datei, Anpassungen notwendig, sofern durchgeklickt werden soll. Nach dem Speichern, wird hiermit die nächste Datei aufgerufen
If not $bSaved then
If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Return
EndIf
$FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
_FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';'); Kann gegen eine Funktion ausgetauscht werden um z.B. alle *.? Dateien in einem "Inputordner" o.ä. zu verarbeiten.
If not IsArray($File) then
MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine weitere Datei gefunden.')
Exit
Else
_CreateListView($File)
EndIf
EndFunc
Func _CreateListView($aFile)
Local Const $iRows = Ubound($aFile, $UBOUND_Rows)-1
Local Const $iCols = Ubound($aFile, $UBOUND_COLUMNS)-1
Local Const $sTitle = $aFile[0][0]
$aFile[0][0] = ''
WinSetTitle($fMain, '', $sTitle)
_GUICtrlListView_Destroy($lvData)
$lvData = GUICtrlCreateListView("", $iBorder, $iBorder, $iMainWidth-(2*$iBorder), $iMainHeight-(4*$iBorder)-$iCommHeight-$iBtnHeight, $LVS_NOCOLUMNHEADER)
_GUICtrlListView_SetExtendedListViewStyle($lvData, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
For $iCol = 0 To $iCols
_GUICtrlListView_AddColumn($lvData, $aFile[0][$iCol], 150)
Next
For $iRow = 0 To $iRows
_GUICtrlListView_AddItem($lvData, $aFile[$iRow][0], $iRow)
For $iCol = 1 to $iCols
_GUICtrlListView_AddSubItem($lvData, $iRow, $aFile[$iRow][$iCol], $iCol)
Next
Next
GUICtrlSetData($eComment, 'Insert comments here')
$bSaved = False
Endfunc
Func _DataToPDF()
Local $aData = _GUICtrlListView_CreateArray($lvData)
_ArrayDelete($aData, 0)
;PDF Code comes here
;When ready
FileMove($sInputFolder & $FileName, $sBackupFolder & WinGetTitle($fMain) & '_' & $FileName, $FC_OVERWRITE + $FC_CREATEPATH)
$bSaved = True
EndFunc
Func _Exit()
If $bSaved then
Exit
Else
If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Exit
EndIf
EndFunc
; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_CreateArray
; Description ...: Creates a 2-dimensional array from a listview.
; Syntax ........: _GUICtrlListView_CreateArray($hListView[, $sDelimeter = '|'])
; Parameters ....: $hListView - Control ID/Handle to the control
; $sDelimeter - [optional] One or more characters to use as delimiters (case sensitive). Default is '|'.
; Return values .: Success - The array returned is two-dimensional and is made up of the following:
; $aArray[0][0] = Number of rows
; $aArray[0][1] = Number of columns
; $aArray[0][2] = Delimited string of the column name(s) e.g. Column 1|Column 2|Column 3|Column nth
; $aArray[1][0] = 1st row, 1st column
; $aArray[1][1] = 1st row, 2nd column
; $aArray[1][2] = 1st row, 3rd column
; $aArray[n][0] = nth row, 1st column
; $aArray[n][1] = nth row, 2nd column
; $aArray[n][2] = nth row, 3rd column
; Author ........: guinness
; Remarks .......: GUICtrlListView.au3 should be included.
; Example .......: Yes
; ===============================================================================================================================
Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
If $iColumnCount < 3 Then
$iDim = 3 - $iColumnCount
EndIf
If $sDelimeter = Default Then
$sDelimeter = '|'
EndIf
Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
For $i = 0 To $iColumnCount - 1
$aColumns = _GUICtrlListView_GetColumn($hListView, $i)
$aReturn[0][2] &= $aColumns[5] & $sDelimeter
Next
$aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))
For $i = 0 To $iItemCount - 1
For $j = 0 To $iColumnCount - 1
$aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
Next
Next
Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
EndFunc ;==>_GUICtrlListView_CreateArray
Alles anzeigen
Wenn jemand den PDF-Part übernehmen kann, könnte ich evtl. den Rest als Entwurf zur Verfügung stellen.
Ich habe bisher keine Tabellen, sondern nur reine txt-Dateien in PDF umgewandelt (TxTtoPDF.au3).
Ich empfehle dir halt Dringend Variablen so wenig wie möglichGlobal zu definieren und (wenn nicht nötig) kein Call für den Aufruf einer Funktion zu benutzen.
Auch verwende lieber Bitor() um die Flags zu setzen, dann weiß man später noch, was du da gesetzt hast, mit dem puren Hex-Wert kann später keiner mehr was anfangen bzw. muss sich das mühsam zusammen suchen.
Und das was ich in meinem Code hier gemacht habe (über Kommentare bei den globalen Variablen) kannst du diese dort dennoch "Gruppieren" und weißt somit wozu du diese brauchst.
Der Trick für den Hotkey isst ja eigentlich nur, das dieser einen manuellen Click auf den Button simuliert, sprich: Wichti war nur das der Button an sich funktioniert.
Ich hoffe du hast den Code auch verstanden den ich da zusammen gezimmert hat (mit Sicherheit noch weiter optimierbar aber dafür würde das restliche Skript evtl. fehlen bzw. ich wollte es dann nicht zu sehr von deinem ursprünglichen Code bringen).
Hier die leicht abgeänderte Version (jetzt funktioniert auch das F7):
(Dein Style macht irgendwie keinen Sinn (es gibt kein Flag, das 0x00C80000 enthält), daher hab ich es mal geändert)
Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;GUI
Global $Aufnahme, $go, $input[4]
;Globale Variablen
Global Const $ini = 'anyinifile.ini' ;trag hier die Inifile ein für deinen Timer
HotKeySet("{F7}", "PressTimerButton")
_CreateTimerGUI() ;Beispielfunktion um die GUI zu erstellen, nur deinen geposteten Part gesetzt, nicht den Rest der noch erforderlich wäre!
Jump1()
Func _CreateTimerGUI()
Local $name[4]=[3, 'Stunden','Minuten','Sekunden']
$input[0] = $name[0]
$Aufnahme = GUICreate('Aufnahme1', 370, 70, Default, Default, BitOR($WS_VISIBLE, $WS_OVERLAPPEDWINDOW)) ;vorher:0x10C80000 = 0x10CF0000?
For $i=1 To $name[0]
GUICtrlCreateGroup($name[$i], (5+70)*$i, 5, 70, 40, Default)
$input[$i] = GUICtrlCreateInput('', (7+70)*$i, 20, 60, 20, 1)
Next
$go = GUICtrlCreateButton('Start', 75, 45, 220, 20)
EndFunc
Func Jump1()
Local $end, $timer
Local $running = False
Local $Button[2]=['Start','Stop']
GUICtrlSetData($go, $button[$running])
GUISetState(@SW_SHOW, $Aufnahme)
;Achtung: Sektion angepasst, da alle Timerwerte in einer Sektion platz finden
GUICtrlSetData($input[1], IniRead($ini, "Timer","Stunden" , 0)) ;ggf. den Defaultwert (0) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
GUICtrlSetData($input[2], IniRead($ini, "Timer","Minuten" , 0)) ;ggf. den Defaultwert (0) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
GUICtrlSetData($input[3], IniRead($ini, "Timer","Sekunden", 2)) ;ggf. den Defaultwert (2) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
While 1
If $running And TimerDiff($timer)>=$end Then
$running = False
GUICtrlSetData($go, $button[$running])
MsgBox ("", "Test", "Timer abgelaufen", "")
EndIf
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
;~ GUISetState(@SW_HIDE, $Aufnahme)
;~ MainMenu()
ExitLoop
Case $go
If $running = False Then
$running = True
GUICtrlSetData($go, $button[$running])
$end = Convert($input)
$timer = TimerInit()
Else ;
$running = False
GUICtrlSetData($go, $button[$running])
EndIf
EndSwitch
sleep(100)
WEnd
GUISetState(@SW_HIDE, $Aufnahme)
EndFunc
Func PressTimerButton()
ControlClick('', '', $go)
EndFunc
Func Convert($array)
Return 1000*(60*(60*(GUICtrlRead($array[1]))+GUICtrlRead($array[2]))+GUICtrlRead($array[3]))
EndFunc
Alles anzeigen
F7 habe ich vergessen zu testen, sorry ![]()
Ich hab das ganze mal ein wenig überarbeitet und mein test war Erfolgreich:
Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
;GUI
Global $Aufnahme, $go, $input[4]
;Globale Variablen
Global Const $ini = 'anyinifile.ini' ;trag hier die Inifile ein für deinen Timer
HotKeySet ("{F7}", "Jump1")
_CreateTimerGUI() ;Beispielfunktion um die GUI zu erstellen, nur deinen geposteten Part gesetzt, nicht den Rest der noch erforderlich wäre!
Jump1()
;~ MainMenu()
Func _CreateTimerGUI()
Local $name[4]=[3, 'Stunden','Minuten','Sekunden']
$input[0] = $name[0]
$Aufnahme = GUICreate('Aufnahme1', 370, 70, Default, Default, 0x10C80000)
For $i=1 To $name[0]
GUICtrlCreateGroup($name[$i], (5+70)*$i, 5, 70, 40, Default)
$input[$i] = GUICtrlCreateInput('', (7+70)*$i, 20, 60, 20, 1)
Next
$go = GUICtrlCreateButton('Start', 75, 45, 220, 20)
EndFunc
Func Jump1()
Local $end, $timer
Local $running = False
Local $Button[2]=['Start','Stop']
GUISetState(@SW_SHOW, $Aufnahme)
;Achtung: Sektion angepasst, da alle Timerwerte in einer Sektion platz finden
GUICtrlSetData($input[1], IniRead($ini, "Timer","Stunden" , 0)) ;ggf. den Defaultwert (0) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
GUICtrlSetData($input[2], IniRead($ini, "Timer","Minuten" , 0)) ;ggf. den Defaultwert (0) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
GUICtrlSetData($input[3], IniRead($ini, "Timer","Sekunden", 2)) ;ggf. den Defaultwert (2) (wenn die Ini nicht gefunden/gelesen werden kann) ändern
While 100
If $running And TimerDiff($timer)>=$end Then
$running = False
GUICtrlSetData($go, $button[$running])
MsgBox ("", "Test", "Timer abgelaufen", "")
EndIf
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE, $Aufnahme)
ExitLoop
Case $go
If $running = False Then
$running = True
GUICtrlSetData($go, $button[$running])
$end = Convert($input)
$timer = TimerInit()
Else ;
$running = False
GUICtrlSetData($go, $button[$running])
EndIf
EndSwitch
WEnd
GUISetState(@SW_HIDE, $Aufnahme)
EndFunc
Func Convert($array)
Return 1000*(60*(60*(GUICtrlRead($array[1]))+GUICtrlRead($array[2]))+GUICtrlRead($array[3]))
EndFunc
Alles anzeigen
Mein erster Blick:
1. Warum rufst du Funktionen mit "Call" auf, das ist nur nötig, wenn der Funktionsname (als String) "generiert" wird.
2. Variablen in einer Funktion sind immer Local zu definieren, brauchst du sie auch außerhalb, gehört die Definition auch nach draußen:
3. Hotkeyset, gehört an den Anfang des Scriptes.
4. Du erstellst jedes mal einen Button/Gruppe/inputs, wenn die Funktion "Aufnahme1 aufgerufen wird. Du solltest ihn lieber in der GUI erstellen und ausblenden und hier nur wieder einblenden!
5. du setzt den Zähler nie runter, bedeutet mit jedem Aufruf von "Jump1" wird es 1 mehr. Damit passt deine Abfrage spätestens beim 3. mal nicht mehr (startest mit 0) wobei du die 1 aaktuell auch nicht abfragst.
Dann wäre es interessant wie diese csv bzw txt aufebaut sind:
; getrennt oder , oder ganz was anderes?
mit " vorweg und hinten dran oder ohne?
Die Überschrift ist in der Datei enthalten oder aus dem Dateinamen oder woanders?
Der Text unten in der PDF soll aus einem (Freitext)Kommentarfeld kommen?
Ich gehe davon aus, das es auch mal mehrere Seiten sein können?
Wäre es nicht besser am Anfang zu starten (Woher kommen die Daten? Wie sehen die Daten aus? usw.) bevor man den letzten Schritt (erstellen der PDf aus der fertigen Ansicht) macht.
Daher nochmal BlutigerAnfänger :
- Quelle: Woher kommen die Daten? Aus einer anderen Datei (CSV, Excel,...) oder einem Programm?
- Das ist keinesfalls egal, Programmieren bedeutet alles zusammen zu setzen und die Daten muss man sich ja irgendwo holen.
- Sind die Daten immer gleich aufgebaut oder kann es unterschiede geben (Spaltenüberschriften/ Spaltenanzahl)?
- Du hast was von SQLite geschrieben. Schau mal hier:
- Darstellung: Am Besten stellst du ein Bild einer Excel die Beispielhaft zeigt wie die Daten Dargestellt werden sollen.
- PDF: Sollen sie dort 1:1 wie im Programm dargestellt werden oder kommt hier wieder ein anderes Format zum Tragen?
- Dazu zählt auch: Überschrift, Fußnote, welche Spalten angezeigt werden sollen etc.?
- Hierzu gab es oben ja schon ein paar Beispiele.
Was du wegen der Dateinamen meinst (kleiner Fonts
), erschließt sich mir noch nicht so ganz.
Wie wäre es wenn du mal den ganzen relevanten Code (also setzen des Kotkeys, die Funktionen selber etc.) postest (idealerweise hier als AutoIt Code anzeigen lassen).
Dann knnen wir viel besser schauen was du falsch machst.
Dein Auszug oben sieht verwirrend aus.