- Offizieller Beitrag
Hallo @all
Hab ein kleines Projekt, dass ich immer nur Testen kann, wenn ich beim Kunden bin (wg. Lizenzen hab ich keine Möglichkeit die Software bei mir laufen zu lassen).
Falls jemand Lust hat, wär's nett, wenn ihr mal 'nen Blick drauf werft.
Die Fremdanwendung läßt sich leider nicht über Controls steuern, daher Mausklicks und Send.
Kurze Erläuterung:
Je nach Einstellung startet die Anwendung mit dem Titel $main_wdw1 od. ~2. Je nach OS-Sprache wird für die Beschriftung deutsch oder englisch verwendet. Ziel ist es, einen auszuwählenden Report mit der dafür in der Anwendung eingebundenen Funktion für einen auszuwählenden Patienten als PDF-Datei zu exportieren.
Wenn ihr irgendwelche Ungereimtheiten entdeckt - ich bin für jeden Hinweis dankbar.
Spoiler anzeigen
C
#NoTrayIcon
#include <GuiConstants.au3>
#Include <Misc.au3>
Dim $lbl_date, $lbl_name, $state1, $state2, $state3, $var, $report, $appl, $pdf_target
Dim $main_wdw1, $main_wdw2, $i, $lang, $label[15], $split
Select
Case StringInStr("0407,0807,0c07,1007,1407", @OSLang) ; Systemsprache Deutsch
$lang = 1
Case Else ; für alle anderen Englisch
$lang = 2
EndSelect
If FileExists(@ScriptDir & "\" & "ReportToPDF.INI") Then
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "window")
$main_wdw1 = $var[1][1]
$main_wdw2 = $var[2][1]
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "aktuell")
$report = $var[1][1]
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "pdf")
$pdf_target = $var[1][1]
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "application")
$appl = $var[1][1]
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "language")
For $i = 1 To $var[0][0]
$split = StringSplit($var[$i][1],"|")
$label[$i] = $split[$lang]
Next
Else
If $lang = 1 Then
MsgBox(4096, "Achtung !", "Die Datei: <ReportToPDF.INI> ist nicht im Ordner: <" & @ScriptDir & "\" & "> enthalten!" & @LF & "Ohne diese Datei kann das Programm nicht ausgeführt werden!")
Else
MsgBox(4096, "Attention !", "File: <ReportToPDF.INI> Is Not Included In Directory: <" & @ScriptDir & "\" & "> !" & @LF & "The Program Doesn't Work Without This File!")
EndIf
Exit
EndIf
$auswahl = GUICreate($label[1], 392, 131, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Combo_r = GUICtrlCreateCombo("", 40, 30, 310, 21)
$Button_esc = GUICtrlCreateButton($label[2], 21, 90, 150, 20)
$Button_ok = GUICtrlCreateButton($label[3], 219, 90, 150, 20)
$Group_r = GUICtrlCreateGroup($label[4], 20, 10, 350, 60)
$gui = GUICreate($label[5], 381, 230, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Group_1 = GUICtrlCreateGroup($label[6], 50, 30, 280, 160)
$Button_2 = GUICtrlCreateButton($label[7], 90, 60, 200, 30)
$Button_3 = GUICtrlCreateButton($label[8], 90, 140, 200, 30)
_ListReport()
GUISetState(@SW_SHOW, $auswahl)
While 1
Sleep(500) ; Prozessorlast verringern
$state1 = WinGetState($main_wdw1)
$state2 = WinGetState($main_wdw2)
$state3 = WinGetState($label[1])
$msg = GUIGetMsg()
Select
Case $state1 = 0 And $state2 = 0 And BitAnd($state3,8) <> 8
Run($appl)
_report()
GUISetState(@SW_SHOW, $gui)
Case $msg = $Button_2
GUISetState(@SW_HIDE, $gui)
_report()
Case $msg = $GUI_EVENT_CLOSE Or $msg = $Button_3
GUISetState(@SW_HIDE, $gui)
ExitLoop
Case $msg = $Button_esc
GUISetState(@SW_HIDE, $auswahl)
Case $msg = $Button_ok
$var = GUICtrlRead($Combo_r)
If @error Then
IniWrite(@ScriptDir & "\" & "ReportToPDF.INI", "aktuell","report0", $var)
Else
IniDelete(@ScriptDir & "\" & "ReportToPDF.INI", "aktuell","report0" )
IniWrite(@ScriptDir & "\" & "ReportToPDF.INI", "aktuell", "report0",$var)
EndIf
GUISetState(@SW_HIDE, $auswahl)
EndSelect
WEnd
Send("!{F4}") ; Beenden LabManager
Exit
Func _report()
Dim $var, $lm_butt_x, $lm_butt_y
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "labmanbutton") ; bei untersch. Bildauflösung in INI anpassen
$lm_butt_x = $var[1][1]
$lm_butt_y = $var[2][1]
BlockInput(1)
$lbl_name = ""
If $state1 = 8 Then
WinSetState($main_wdw1, "",@SW_MAXIMIZE)
MouseClick("Left",$lm_butt_x,$lm_butt_y,1,1) ; Button LabManager
EndIf
If $state2 = 8 Then
WinSetState($main_wdw2, "",@SW_MAXIMIZE)
MouseClick("Left",$lm_butt_x,$lm_butt_y,1,1) ; Button LabManager
EndIf
Send("{TAB 3}") ; Button CUSTOM SCORE SET REPORTS
Send("{ENTER}")
Sleep(1500)
Send($report) ; Auswahl Report
Send("{ENTER}")
Send("^{TAB}") ; WECHSELN ZU PATIENTENAUSWAHL
BlockInput(0)
While $lbl_name = ""
MsgBox(4096, $label[9], $label[10] & @LF & $label[11])
While _IsPressed("78") = 0 ; Warten auf User-Auswahl beendet und <F9> gedrückt
Sleep(250)
WEnd
Send("^{c}") ; ausgewählten Patienten kopieren in Zwischenablage
$lbl_name = ClipGet() ; Patient aus Zwischenablage zuweisen
if $lbl_name = "" Then
MsgBox(4096, $label[12], $label[13] & @LF & $label[14])
EndIf
WEnd
BlockInput(1)
$lbl_name = StringReplace($lbl_name, " ", "")
$lbl_name = StringReplace($lbl_name, ",", "_")
Send("{TAB}") ; wechselt in das Feld Datum und markiert es
Send("^{c}") ; Datum kopieren in Zwischenablage
$lbl_date = ClipGet() ; Datum aus Zwischenablage zuweisen
$lbl_date = _MultiDateToNorm($lbl_date, 1) ; in String wandeln (JJJJ-MM-TT)
Send("^+{TAB}") ; zurück zu Registerkarte REPORTS
Send("{TAB 22}") ; Button PDF
Send("{ENTER}") ; PDF-Speichermenü
Send($pdf_target & $lbl_name & "_" & $lbl_date) ; Dateinamen eintragen
Send("{TAB 2}") ; Button Speichern
Send("{ENTER}") ; Speichern
BlockInput(0)
EndFunc ;==>_report
Func _ListReport()
Dim $var, $tmp, $i
$var = IniReadSection(@ScriptDir & "\" & "ReportToPDF.INI", "reports")
For $i = 1 To $var[0][0]
$tmp = $var[$i][1]
If $tmp <> "" Then
GUICtrlSetData($Combo_r, $tmp, $var[1][1])
EndIf
Next
EndFunc ;==>_ChangeReport
Func _MultiDateToNorm($date, $s_sort = 0)
If StringMid($date, 2, 1) = "." Then; Tag dt. einstellig ?
$date = "0" & $date; Vornull Tag
EndIf
If StringMid($date, 2, 1) = "/" Then; Monat amerik. einstellig ?
$date = "0" & $date; Vornull Monat
EndIf
If StringMid($date, 2, 1) = "-" Then; Tag amerik. lang einstellig ?
$date = "0" & $date; Vornull Tag
EndIf
If StringMid($date, 5, 1) = "." Then; Monat dt. einstellig ?
$tmp = StringTrimLeft($date, 3)
$date = StringLeft($date, 3) & "0" & $tmp; Vornull Monat
EndIf
If StringMid($date, 5, 1) = "/" Then; Tag amerik. einstellig ?
$tmp = StringTrimLeft($date, 3)
$date = StringLeft($date, 3) & "0" & $tmp; Vornull Tag
EndIf
If StringLen($date) = 8 Or StringLen($date) = 9 Then; Jahr 2-stellig ?
$strJJ = StringRight($date, 2) ; Zeichen für Jahr selektieren
$date = StringTrimRight($date, 2) ; beide Zeichen für Jahr abschneiden
If $strJJ < 30 Then
$strJH = "20"; 00 bis 29 sind 20..
Else
$strJH = "19"; 30 bis 99 sind 19..
EndIf
$date = $date & $strJH & $strJJ; Jahr jetzt 4-stellig
EndIf
Select
Case StringMid($date, 3, 1) = "/"; amerik. Format "MM/TT/JJJJ" ?
$strMM = StringLeft($date, 2)
$strTT = StringMid($date, 4, 2)
$date = $strTT & "." & $strMM & "." & StringRight($date, 4)
Case StringMid($date, 3, 1) = "-";amerik. Format "TT-Mon-JJJJ" ?
$strTT = StringLeft($date, 2)
$strMM = StringUpper(StringMid($date, 4, 3))
Select
Case $strMM = "JAN"
$strMM = "01"
Case $strMM = "FEB"
$strMM = "02"
Case $strMM = "MAR"
$strMM = "03"
Case $strMM = "APR"
$strMM = "04"
Case $strMM = "MAY"
$strMM = "05"
Case $strMM = "JUN"
$strMM = "06"
Case $strMM = "JUL"
$strMM = "07"
Case $strMM = "AUG"
$strMM = "08"
Case $strMM = "SEP"
$strMM = "09"
Case $strMM = "OCT"
$strMM = "10"
Case $strMM = "NOV"
$strMM = "11"
Case $strMM = "DEC"
$strMM = "12"
EndSelect
$date = $strTT & "." & $strMM & "." & StringRight($date, 4)
EndSelect
If $s_sort = 1 Then; Optionsschalter gesetzt ?
$date = StringRight($date, 4) & "-" & StringMid($date, 4, 2) & "-" & StringMid($date, 1, 2) ; als sortierbarer String
EndIf
Return $date
EndFunc ;==>_MultiDateToNorm
Alles anzeigen
Code
;ReportToPDF.INI
[window]
main1=SomnoStar Pro - 1. Standard
main2=SomnoStar Pro - 1. Auswertung
[reports]
report0=Kommentare, Default
report1=MSLT Report, Default
report2=Polysomnography Report, Default
report3=Short Report, Default
report4=Long Report, Default
report5=Sleep Stage Report, Default
report6=Treatment Sequence Report, Default
report7=
report8=
report9=
[aktuell]
report0=Polysomnography Report, Default
[pdf]
target=Z:\
[application]
appl_path=C:\4100\score.exe
[labmanbutton]
pos_x=750
pos_y=500
[language]
label1=Aktuellen Report Ändern|Change Current Report
label2=Weiter mit aktuellem Report|Resume with Current Report
label3=Neue Auswahl Bestätigen|Acknowledge New Choice
label4=Aktueller Report - Bei Bedarf anderen Auswählen|Current Report - Change If Required
label5=Report Exportieren|Report Export
label6=Report in PDF-Datei exportieren|Report Export To PDF-File
label7=Einen weiteren Report exportieren|To Export Another Report
label8=Beenden|Exit
label9=Hinweis|Note
label10=Bitte wählen Sie den Patienten aus|Please Select Patient
label11=Bestätigen Sie die Auswahl mit Taste <F9> !|Acknowledge Your Choice With Key <F9> !
label12=Achtung !|Attention !
label13=- Es wurde kein Patient ausgewählt oder|- No Patient Was Selected Or
label14=- Der gewählte Patient ist nicht markiert (blau hinterlegt).|- The Selected Patient Is Not Marked (Lay Underneath Blue).
Alles anzeigen