//FormHtml_1.prg 26.08.2023 18:40 //Sammlung der Funktionen fr die indiText/indiForm // sammelt alle Funktionen aus KSOX fr den Formulardruck per HTML und OpenOffice-Writer // fr alle anderen Bestatter AUSSER KSOX (fr KSOX bernimmt FormHtml_2 diese Aufgabe!) #include "Gra.ch" #include "Xbp.ch" #include "Appevent.ch" #include "Appedit.ch" #include "Appbrow.ch" #include "Font.ch" #include "Common.ch" #include "Dll.ch" #include "Dmlb.ch" #include "Common.ch" #include "fileio.ch" #include "directry.ch" //14.02.2026 18:22 mit HTML_Brief_2 abgeglichen: FUNCTION HTML_Brief_1( cFile, cFormular, cFont, cFSize, cFormSeite, cZeileCM, cNotiz_Bez ) //18.10.2022 cZeileMM -> cZeileCM // cNotiz_Bez LOCAL nZei := 8, nAnf, CR := Chr(13), LF := Chr(10) LOCAL nHandle, cBuffer, nBytes, cText, cNeuTxt := "" LOCAL cDatv := cDatver LOCAL nFSize, nFHoehe, nFBreite LOCAL nZeileMM LOCAL cSZeit, nSZeit, cFZeit, nFZeit, nZ //30.12.2022 15:29 warten aufs PDF LOCAL dHeute, dFDatum, cVermerk //19.02.2024 15:48 nachtr„glich als LOCAL erkl„rt LOCAL aFormSeite //18.02.2026 10:11 //05.01.2024 15:33 der Link zum PDF-Programm ist in der Datei PdfProgLinks vvvvvvvvvv LOCAL cTextPP := IIf(FExists(cDatver+"PdfProgLinks.txt"),MemoRead(cDatver+"PdfProgLinks.txt"),"") LOCAL nMaxLines := MlCount(cTextPP, 90) LOCAL aPPLinks[nMaxLines], n PRIVATE cPPLinks := cTextPP DEFAULT cFormular TO "" DEFAULT cFont TO '"Times New Roman", serif' DEFAULT cFSize TO '18pt' DEFAULT cFormSeite TO '1cm 1cm 1cm 2cm' DEFAULT cZeileCM TO '0.14' //11.10.2022 14:58 Zeilenabstand //08.01.2024 10:45 in inditext_1() PRIVATE cBuero //11.10.2022 16:56 PRIVATE fr VariFunkErsatz_1 nFSize := Val(cFSize) nFHoehe := nFSize * 0.352778 nFBreite := nFSize * 0.2 // 0.2 ist ein gesch„tzter vorl„ufiger Wert nZeileMM := IIf(Val(cZeileCM)<0.2, nFHoehe * Val(cZeileCM)*10, Val(cZeileCM)*10) // DO WHILE At("\",cDatv) > 0 // cDatv := Stuff( cDatv, At("\",cDatv), 1, "/" ) // ENDDO IF !"HDBE"$Upper(cFormular) cFormular := Stuff(cFormular,At("\",cFormular),1,"/") cFormular := "file:///c:/bestatt/bleines/"+cFormular //cDatv + cFormular ENDIF // Zur Vermeidung von Kollision verschiedener Drucke vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv // Test: ist bereits die Datei HTML_Brief.html auf diesem PC ge”ffnet? IF FExists("c:\hdbe\HTML_Brief.html") //22.12.2022 19:13 nHandle := FOpen( "c:\hdbe\HTML_Brief.html", FO_EXCLUSIVE ) IF nHandle = -1 //+ Die Datei ist bereits auf diesem PC ge”ffnet FClose(nHandle) msgbox("Es ist bereits ein HTML_Brief.html offen!"+CR+LF+"Bitte OfficeWriter schlieáen, dann nochmal versuchen!") RETURN .F. ELSE FClose(nHandle) ENDIF ENDIF //-------------------------------- // Test: ist bereits die Datei HTML_Brief.pdf auf diesem PC ge”ffnet? IF FExists("c:\hdbe\HTML_Brief.pdf") //22.12.2022 19:13 nHandle := FOpen( "c:\hdbe\HTML_Brief.pdf", FO_EXCLUSIVE ) IF nHandle = -1 //+ Die Datei ist bereits auf diesem PC ge”ffnet FClose(nHandle) msgbox("Es ist bereits ein HTML_Brief.PDF offen!"+CR+LF+"Bitte AdobeReader schlieáen, dann nochmal versuchen!") RETURN .F. ELSE FClose(nHandle) ENDIF ENDIF //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IF Len(cFile) > 50 cText := cFile cFile := "HTML_Brief" ELSE nHandle := FOpen( cFile, FO_READ ) //09.01.2026 10:46 cBuffer := Space(3000) //cBuffer := Space(10000) //09.01.2026 10:47 nBytes := FRead( nHandle, @cBuffer, 3000 ) //nBytes := FRead( nHandle, @cBuffer, 10000 ) cBuffer := FReadStr( nHandle, 20000 ) cText := AllTrim(cBuffer) FClose( nHandle ) ENDIF // Test mit automatischem Ausfllen bei bestimmtem Formular: IF "KSO_GhAusz.png"$cFormular cFont := "Times New Roman" cFSize := "14pt" cFormSeite := "0cm 0cm 0cm 0cm" nZeileMM := 4.9 cText := CR+LF+CR+LF + Space(65) + "Auftrag: " + Str(1->auftrnr,6,0) + CR+LF+CR+LF+CR+LF+CR+LF+CR+LF+CR+LF cText += Space(35) + Trim(1->vorname) + " " + Trim(1->name) + CR+LF ENDIF IF cFile == "c:\hdbe\dHTML.abr" .OR. cFile == "c:\hdbe\dHTML.mahn" cText := StrTran( cText, CR+LF+" ", CR+LF ) // linken Rand zu NULL machen ENDIF aFormSeite := Split(" ",cFormSeite) //18.02.2026 10:11 Split() ist in DbDruSysw.prg // vermutlich hier berflssig, weil schon in Inditext_1() 08.11.2022 10:42 // cBuero := SubStr(cBU5,At(" ",cBU5)+1) // cRufnummer := cBU6 IF 'Temp'$cFile // 11.12.2022 17:14 wenn im Text Formatierungen vorkommen (bl_r,bl_a etc...) cNeuTxt := ; ''+CR+LF+; ''+CR+LF+; '
'+CR+LF+; ' '+CR+LF+; '' //+CR+LF+;
ELSE //!"'+CR+LF+;
''+CR+LF+;
''+CR+LF+;
' '+CR+LF+;
' '+cFile+' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
''+CR+LF+;
IIf( Upper(Right(cFormular,4))==".PNG", ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
'
'+CR+LF+;
''+CR+LF+;
''+CR+LF, ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
''+CR+LF )
ENDIF
/*17.02.2026 20:49
''+CR+LF+;
''+CR+LF, ;
cNeuTxt := ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
' '+CR+LF+;
' '+cFile+' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
''+CR+LF+;
IIf( Upper(Right(cFormular,4))==".PNG", ;
''+CR+LF+;
''+CR+LF+;
'', ;
''+CR+LF+;
'' )
ENDIF
*/
cNeuTxt += ConvToAnsiCP(cText)
cNeuTxt += '' //17.02.2026 20:53 wegen ELSE-Žnderung hier oben
cNeuTxt := StrTran( cNeuTxt, "", " ") // durch <> entstehen 7 Blanks
IF !FExists("c:\hdbe\HTML_Brief.html")
nHandle := FCreate("c:\hdbe\HTML_Brief.html")
FClose(nHandle)
Sleep(100)
ENDIF
nHandle := FOpen("c:\hdbe\HTML_Brief.html",FO_READWRITE)
nBytes := FRead( nHandle, @cBuffer, 20000 )
nBytes := Max(10000,nBytes)
FSeek(nHandle, 0)
nBytes := FWrite( nHandle, PadR(cNeuTxt,nBytes," ") ) // damit frhere, l„ngere Texte berschrieben werden !!!
nBytes := FClose( nHandle )
//15.04.2025 15:46 jetzt ohne die Strg-Taste
// IF AppKeyState(65553)==1 .OR. " nFZeit .OR. DATE() > dFDatum ) .AND. .NOT. nZ > 20
sleep(100)
cFZeit := Directory("C:\HDBE\HTML_Brief.pdf")[1,F_WRITE_TIME]
nFZeit := Val(SubStr(cFZeit,1,2))*3600 + Val(SubStr(cFZeit,4,2))*60 + Val(SubStr(cFZeit,7,2))
nZ++
ENDDO
//05.01.2024 cPPLinks aus: FExists(cDatver+"PdfProgLinks.txt")
// speziell fr BleinX, weil ein PC keinen AdobeReader kann
IF Len(cPPLinks)>0
FOR n := 1 TO nMaxLines
aPPLinks[n] := Trim(MemoLine(cPPLinks, 100, n))
NEXT
FOR n := 1 TO Len(aPPLinks)
cPPLinks := aPPLinks[n] // cPPLinks wird hier doppelt verwendet ...
IF nZ > 20
msgbox("Achtung: Die PDF-Datei ist vermutlich von einem frheren Fall!")
BREAK
ENDIF
IF FExists(cPPLinks)
RunShell ("&cFilepdf",cPPLinks,.T.)
EXIT
ENDIF
NEXT
IIf(n>len(aPPLinks), msgbox("Das PDF-Programm ist nicht ordentlich installiert!"),)
ELSE
IF nZ > 20
msgbox("Achtung: Die PDF-DAtei ist vermutlich von einem frheren Fall!")
ELSEIF FExists('C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe') //64bit Reader
RunShell ("&cFilepdf","C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe",.T.)
ELSEIF FExists('C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe') //32bit Reader
RunShell ("&cFilepdf","C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe",.T.)
ELSEIF FExists('C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\AcroRd32.exe') // Test nur fr BleinX
RunShell ("&cFilepdf","C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\AcroRd32.exe",.T.)
ELSE
msgbox("Der Adobe Reader DC ist nicht ordentlich installiert!")
ENDIF
ENDIF
ENDIF
ELSE
msgbox("LibreOffice ist nicht ordentlich installiert")
ENDIF
ELSE
//26.08.2023 20:37 das muss in dieser Reihenfolge (lt. Alaska):
RunShell ( "c:\hdbe\HTML_Brief.html","c:\Program Files\LibreOffice\program\swriter.exe",.T.) //01.09.2023 .T.
ENDIF
IF !Empty(cNotiz_Bez)
cVermerk := ConvToOEMCP(cNotiz_Bez) + ": "+DtoC(DATE()) + ", " + BriefAdresse(2,"A") // 2==1-zeilig, "A"==Ansprechpartner
IF !cVermerk$1->notiz
1->(DbRlock())
1->notiz += CRLF + cVermerk
1->(DbCommit())
ENDIF
ENDIF
RETURN .T.
//14.02.2026 12:44 aus FormHtml_2 kopiert, aber den Mail-Schluss original belassen:
//aus FUNCTION HTML_Brief_2 fr Inditext_2()
//cOrdner = FormArt-Bezeichnung ohne .txt
//cMail_Adr = Mail-Adresse aus inditextF.txt 19.11.2023 11:49
//cMail_Betr = Mail-Betreff aus inditextF.txt 19.11.2023 11:49
//14.02.2026 17:53 abgeglichen mit HTML_Form_2 bis zu dieser Linie: (dahinter ist die Mail-Routine)
//*******************************************************************************************vvvvvvvvvvvvvv
FUNCTION HTML_Form_1( cContainer, cFormular, cFont, cFSize, cFormSeite, cZeileCM, cNotiz_Bez, cOrdner, cFile, cMail_Adr, cMail_Betr)
LOCAL nZei := 8, nAnf, nEnd, CR := Chr(13), LF := Chr(10)
LOCAL nHandle, cBuffer := Space(10000), nBytes, cText, cNeuTxt := ""
LOCAL nFSize, nFHoehe, nFBreite
LOCAL nZeileMM
LOCAL cSZeit, nSZeit, cFZeit, nFZeit, nZ //30.12.2022 15:29 warten aufs PDF
LOCAL cHeute := DtoC(DATE())
LOCAL oProgress //26.10.2023 18:56
LOCAL cMail_Body //21.11.2023 09:47
LOCAL cMailClient := cDatver+"ThunderbirdPortable\ThunderbirdPortable.exe"
LOCAL aFormSize, aHtmlFiles, cHFDatum, cVermerk //19.02.2024 15:55 nachtr„glich als LOCAL erkl„rt
//05.01.2024 15:33 der Link zum PDF-Programm ist in der Datei PdfProgLinks vvvvvvvvvv
LOCAL cTextPP := IIf(FExists(cDatver+"PdfProgLinks.txt"),MemoRead(cDatver+"PdfProgLinks.txt"),"")
LOCAL nMaxLines := MlCount(cTextPP, 90)
LOCAL aPPLinks[nMaxLines], n
LOCAL aParam := {} //14.04.2024 15:56
LOCAL cWhiteMails := "", lMAD_ok := .F. //22.07.2024 12:12
LOCAL cFileVorl //08.04.2025 18:39 der Original-Vorlagen-File als ausfllbare PDF-Datei
PRIVATE cPPLinks := cTextPP
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DEFAULT cFormular TO ""
DEFAULT cFont TO '"Times New Roman", serif'
DEFAULT cFSize TO '18pt'
DEFAULT cFormSeite TO '1cm 1cm 1cm 2cm'
DEFAULT cZeileCM TO '0.14' //11.10.2022 14:58 Zeilenabstand
// PRIVATE cAuftrOrdner := cDatver + "Indiform\AUFTRAG\" + StrZero(1->auftrnr,6,0) // nur bei KSOX
PRIVATE cAuftrOrdner := cDatver + "Scans\Dokumente\" + StrZero(1->auftrnr,6,0) // im Ordner der gescannten Dokumente
PRIVATE cFilehtml, cFilepdf, cFilehtmlur, cFilepdfur
//08.01.2024 10:45 in inditext_1() PRIVATE cBuero //11.10.2022 16:56 PRIVATE fr VariFunkErsatz
DEFAULT cMail_Adr TO ""
DEFAULT cMail_Betr TO ""
PRIVATE cBetreff := cMail_Betr //21.11.2023 10:09
// cFAVp ist PRIVATE = cFAV[1] 05.05.2024 15:08
cMail_Body := IIf(Empty(cMail_Adr),"",VariFunkErsatz_1(MemoRead(cDatver+cFAVp+"\Body.txt"))) //02.01.2024 13:50
nFSize := Val(cFSize)
nFHoehe := nFSize * 0.352778
nFBreite := nFSize * 0.2 // 0.2 ist ein gesch„tzter vorl„ufiger Wert
nZeileMM := IIf(Val(cZeileCM)<0.2, nFHoehe * Val(cZeileCM)*10, Val(cZeileCM)*10)
IF ValType(cFile) == "C" .AND. Len(cFile) > 4
IF Right(Lower(cFile),4) == ".txt"
cFile := Stuff(cFile,At(".txt",cFile),4,"") //06.09.2023 19:16
IF "\"$cFile //27.11.2023 12:03
cFile := SubStr(cFile,3) //27.11.2023 12:02
ENDIF
ENDIF
//07.04.2025 11:05: fr Original-PDFs
IF Right(Lower(cFile),4) == ".pdf"
cFileVorl := cFile
cFile := Stuff(cFile,At(".pdf",Lower(cFile)),4,"")
IF "\"$cFile
cFile := SubStr(cFile,RAt("\",cFile)+1)
ENDIF
ENDIF
//14.04.2025 17:52: fr Original-ODTs
IF Right(Lower(cFile),4) == ".odt"
cFileVorl := cFile
cFile := Stuff(cFile,At(".odt",Lower(cFile)),4,"")
IF "\"$cFile
cFile := SubStr(cFile,RAt("\",cFile)+1)
ENDIF
ENDIF
ENDIF
IF ValType(cFile)=="C" .AND. Len(cFile)>0 //14.04.2025 14:55
cOrdner := "\" + cFile //06.09.2023 19:16
ELSE
RETURN .F.
ENDIF
cAuftrOrdner += cOrdner //06.09.2023 19:20
IF !FExists( cAuftrOrdner,"D" )
RunShell( "/C MD "+cAuftrOrdner,, .T. )
sleep(200)
ENDIF
IF !FExists( cAuftrOrdner,"D" )
msgbox("Der Ordner " + cAuftrOrdner + " kann nicht erzeugt werden!")
RETURN .F.
ENDIF
cFilehtml := cAuftrOrdner + "\" + cFile + "_" + StrZero(1->auftrnr,6,0) + "_" + cHeute + ".html"
cFilehtmlur := cAuftrOrdner + "\" + cFile + "_" + StrZero(1->auftrnr,6,0) + "_" + "*" + ".html"
cFilepdf := cAuftrOrdner + "\" + cFile + "_" + StrZero(1->auftrnr,6,0) + "_" + cHeute + ".pdf"
cFilepdfur := cAuftrOrdner + "\" + cFile + "_" + StrZero(1->auftrnr,6,0) + "_" + "*" + ".pdf"
IF Upper(cFormular) != "ORIGINAL.PDF" //07.04.2025 19:30
cFormular := Stuff(cFormular,At("\",cFormular),1,"/")
aFormSize := FormSize(cFormular) //02.11.2023 10:58 um portrait/landscape zu unterscheiden
cFormular := '../../../../' + cFormular
ENDIF
IF Len(cContainer) == 0 .AND. Len(cFormular) > 0 .AND. !"ORIGINAL.PDF"$Upper(cFormular) //06.04.2025 12:08 wenn nur das Formular gedruckt werden soll
ELSEIF !"ORIGINAL.PDF"$Upper(cFormular) //31.10.2023 19:00 wenn kein Original-PDF-Formular
// Zur Vermeidung von Kollision verschiedener Drucke vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Check: ist bereits die Datei cFilehtml auf diesem PC ge”ffnet?
IF FExists(cFilehtml) //22.12.2022 19:13
nHandle := FOpen( cFilehtml, FO_EXCLUSIVE )
IF nHandle == -1
//+ Die Datei ist bereits auf diesem PC ge”ffnet
FClose(nHandle)
msgbox("Es ist bereits ein " + cFilehtml + " offen!"+CR+LF+;
"Bitte " + cFilehtml + " im OfficeWriter schlieáen, dann nochmal versuchen!")
RETURN .F.
ELSEIF ConfirmBox( oCB, "Soll sie berschrieben werden?", ;
"Diese Datei ist schon vorhanden mit Datum von heute!", ;
XBPMB_YESNO, ;
XBPMB_QUESTION ) == XBPMB_RET_YES
FClose(nHandle)
ELSE
FClose(nHandle)
RETURN .F.
ENDIF
ELSEIF FExists(cFilehtmlur) //06.09.2023 11:25
aHtmlFiles := Directory( cFilehtmlur )
ASort(aHtmlFiles,,,{|aX,aY|aX[3]>aY[3]}) //absteigend sortiert nach WriteDatum
cHFDatum := SubStr(aHtmlFiles[1,1],RAt("_",aHtmlFiles[1,1])+1,10) // bisher neueste Datei dieser Art
IF ConfirmBox( oCB, "Soll sie heute nochmal erzeugt werden?", ;
"Diese Datei ist schon vorhanden mit Datum vom "+cHFDatum+"!", ;
XBPMB_YESNO, ;
XBPMB_QUESTION ) == XBPMB_RET_YES
ELSE
cFilehtml := Stuff(cFilehtmlur,RAt("_",cFilehtmlur)+1,1,cHFDatum)
cFilepdf := Stuff(cFilepdfur,RAt("_",cFilepdfur)+1,1,cHFDatum)
ENDIF
ENDIF
//--------------------------------
// Test: ist bereits die Datei cFilepdf auf diesem PC ge”ffnet?
IF FExists(cFilepdf) //22.12.2022 19:13
nHandle := FOpen( cFilepdf, FO_EXCLUSIVE )
IF nHandle = -1
//+ Die Datei ist bereits auf diesem PC ge”ffnet
FClose(nHandle)
msgbox("Es ist bereits eine Datei " + cFilepdf + " offen!"+CR+LF+;
"Bitte AdobeReader schlieáen, dann nochmal versuchen!")
RETURN .F.
ELSE
FClose(nHandle)
ENDIF
ENDIF
ELSE //31.10.2023 19:06 nur fr ORIGINAL.PDF-Formulare: (sofort darstellen)
IF FExists(cFilepdfur)
cNotiz_Bez := cFile //15.04.2025 19:26
aPDFFiles := Directory( cFilepdfur )
ASort(aPDFFiles,,,{|aX,aY|aX[3]>aY[3]}) //absteigend sortiert nach WriteDatum
cHFDatum := SubStr(aPDFFiles[1,1],RAt("_",aPDFFiles[1,1])+1,10) // bisher neueste Datei dieser Art
IF ConfirmBox( oCB, "Soll sie heute nochmal erzeugt werden?", ;
"Diese Datei ist schon vorhanden mit Datum vom "+cHFDatum+"!", ;
XBPMB_YESNO, ;
XBPMB_QUESTION ) == XBPMB_RET_YES
//13.04.2025 15:56 COPY FILE (cDatver+"F\"+cFile+".pdf") TO (cFilepdf)
COPY FILE (cFileVorl) TO (cFilepdf)
ELSE
//gibts ja hier nicht cFilehtml := Stuff(cFilehtmlur,RAt("_",cFilehtmlur)+1,1,cHFDatum)
cFilepdf := Stuff(cFilepdfur,RAt("_",cFilepdfur)+1,1,cHFDatum)
ENDIF
ENDIF
cFilequelle := IIf("ORIGINAL.PDF"$Upper(cFormular), cFileVorl, cDatver+"F\"+cFile+".pdf") //08.04.2025 18:42 ?eigentlich nur: cFileVorl
COPY FILE (cFilequelle) TO (cFilepdf)
sleep(100) // vorsichtshalber...
//06.04.2025 16:32 umgedreht, damit zuerst nach 64bit-Version gesucht wird:
IF FExists('C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe') //64bit Reader
RunShell ("&cFilepdf","C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe",.T.)
ELSEIF FExists('C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe') //32bit Reader
RunShell ("&cFilepdf","C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe",.T.)
ELSE
msgbox("Der Adobe Reader DC ist nicht ordentlich installiert!")
RETURN .F.
ENDIF
IF !Empty(cNotiz_Bez)
cVermerk := ConvToOEMCP(cNotiz_Bez) + ": "+DtoC(DATE()) + ", fr " + BriefAdresse(2,"A") // 2==1-zeilig, "A"==Ansprechpartner
IF !cVermerk$1->notiz
1->(DbRlock())
1->notiz += CRLF + cVermerk
1->(DbCommit())
ENDIF
ENDIF
RETURN .T.
ENDIF
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// X cBuero := SubStr(cBU5,At(" ",cBU5)+1)
// X cRufnummer := cBU6
//die Version mit Temp drfte hier eigentlich nie vorkommen ... (06.09.2023 11:28)
IF 'Temp'$cFile // 11.12.2022 17:14 wenn im Text Formatierungen vorkommen (bl_r,bl_a etc...)
cNeuTxt := ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
' '+CR+LF+;
' '+cFile+' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
''+CR+LF+;
IIf( Upper(Right(cFormular,4))==".PNG", ;
'',;
'')+CR+LF+;
'' //+CR+LF+;
ELSEIF !"'+CR+LF+;
''+CR+LF+;
''+CR+LF+;
' '+CR+LF+;
' '+cFile+' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
''+CR+LF+;
IIf( Upper(Right(cFormular,4))==".PNG", ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
'
'+CR+LF, ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
''+CR+LF )
ELSE
cNeuTxt := ;
''+CR+LF+;
''+CR+LF+;
''+CR+LF+;
' '+CR+LF+;
' '+cFile+' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
' '+CR+LF+;
''+CR+LF+;
IIf( Upper(Right(cFormular,4))==".PNG", ;
''+CR+LF+;
''+CR+LF+;
'
',cContainer), 0, IIf(cVarInhalt[1]==',', cVarInhalt+' ', ' '+cVarInhalt))
ELSE
cVarInh := AllTrim(SubStr(cContainer,RAt('',cContainer)-RAt('',cContainer), 0, IIf(cVarInhalt[1]==',', cVarInhalt+' ', ' '+cVarInhalt))
ENDIF
//bleibt gleich!! aPos[1] += Len(cVarInhalt) * nFBreite * 10
ELSEIF Len(aPosition) == 2 // muss fr sich positioniert werden
IF cVarInhalt == "SENDEN"
cContainer += ''
cContainer += ''+CR+LF
aPos[1] := aPosition[1]+300 // weil der Knopf 3cm breit sit
aPos[2] := aPosition[2]
ELSEIF Val(cEingabeCM) == 0 .OR. cAusfuell == "HTML" // keine Eingabe-L„nge, wieso also INPUT ??? (immerhin readonly)
IF !Empty(cVarInhalt) .AND. cVarInhalt[1]==">" //11.02.2024 18:01 rechtsbndig, z.B. Euro
cVarInhalt := IIf(Len(cVarInhalt)>1,SubStr(cVarInhalt,2),"") //14.02.2024 12:52 > + nix = ""
IF cAusfuell == "HTML" .AND. Val(cEingabeCM) > 0 //18.02.2024 13:54
cDivCM := cEingabeCM
ELSE
// cDivCM := LTrim(Str(Len(cVarInhalt+" ")*nFBreite/10))+"cm"
cDivCM := LTrim(Str(FontBreite(cFont,cFSize,cVarInhalt+"W")))+"cm"
ENDIF
cLeftCM = LTrim(Str(Val(cLeftCM)-Val(cDivCM)))+"cm"
cTA := "text-align:right;"
ELSEIF !Empty(cVarInhalt) .AND. cVarInhalt[1]=="^" //11.02.2024 18:01 zentriert, z.B. Spalten
cVarInhalt := IIf(Len(cVarInhalt)>1,SubStr(cVarInhalt,2),"") //14.02.2024 12:52 > + nix = ""
IF cAusfuell == "HTML" .AND. Val(cEingabeCM) > 0 //18.02.2024 13:54
cDivCM := cEingabeCM
ELSE
// cDivCM := LTrim(Str(Len(cVarInhalt+" ")*nFBreite/10))+"cm"
cDivCM := LTrim(Str(FontBreite(cFont,cFSize,cVarInhalt+"W")))+"cm"
ENDIF
cLeftCM = LTrim(Str(Val(cLeftCM)-Val(cDivCM)/2))+"cm"
cTA := "text-align:center;"
ELSE
IF cAusfuell == "HTML" .AND. Val(cEingabeCM) > 0 //18.02.2024 13:54
cDivCM := cEingabeCM
ELSE
// cDivCM := LTrim(Str(Len(cVarInhalt+" ")*nFBreite/10))+"cm"
//17.02.2026 18:44 cDivCM := LTrim(Str(FontBreite(cFont,cFSize,cVarInhalt+Space(Max(1,Len(cVarInhalt)/10))),5,2))+"cm"
cDivCM := LTrim(Str(FontBreite(cFont,cFSize,cVarInhalt+"WW"),5,2))+"cm" //17.02.2026 18:45 "W"
ENDIF
cTA := ""
ENDIF
cTAFont := IIf("right"$cTA .AND. cAusfuell == "PDF","Courier",cFont) //12.02.2024 12:39 //18.02.2024 10:58 PDF
// das ist tats„chlich transparent (0.01): background-color:rgba(255,255,255,0.01)
cContainer += ''
IF cAusfuell == "HTML" //18.02.2024 10:51 ausfllen mit LO, daher
// IF !Empty(cVarInhalt) .AND. "C"==Upper(cVarInhalt[1]) .AND. "X"==Upper(cVarInhalt[Len(cVarInhalt)])
// check := IIf(cVarInhalt=="X",'checked="checked"',"")
// cContainer += ''+CR+LF
// ELSEIF !Empty(cVarInhalt) .AND. "R"==Upper(cVarInhalt[1]) .AND. "X"==Upper(cVarInhalt[Len(cVarInhalt)])
// check := IIf(cVarInhalt[Len(cVarInhalt)]=="X",'checked="checked"',"")
// cRadioName := SubStr(cVarInhalt,1,Len(cVarInhalt)-1)
// cContainer += ''+CR+LF
// ELSE
//
aTFSize := {"1","2","3","4","5","6","7","1","1","2","2","3","3","4","4","4","5","5","5","5","6","6","6","6","6","6","6","6","7","7","7","7","7","7","7","7","7"} //17.02.2024 20:42
cVarInhalt := IIf(cVarInhalt=="Cx"," ",IIf(cVarInhalt=="CX","X",cVarInhalt)) //18.02.2024 14:31
cVarInhalt := IIf(Len(cVarInhalt)==3 .AND. cVarinhalt[1]=="R" .AND. Upper(cVarInhalt[3])=="X",IIf(cVarInhalt[3]=="X","X"," "),cVarInhalt) //18.02.2024 14:31
IIF("ITALIC"$Upper(cFF),{cIt1:="",cIt2:=""},{cIt1:="",cIt2:=""}) //13.11.2024 14:08
IIF("BOLD"$Upper(cFF),{cBd1:="",cBd2:=""},{cBd1:="",cBd2:=""}) //13.11.2024 14:08
IF Val(cFS) < 8 .AND. Len(cFS) == 1
cContainer += ''+cIt1+cBd1+cVarInhalt+cBd2+cIt2+''+CR+LF
ELSE
cContainer += ''+cIt1+cBd1+cVarInhalt+cBd2+cIt2+''+CR+LF
ENDIF
ELSE
cContainer += cVarInhalt+''+CR+LF
ENDIF
//24.09.2023 12:14 berschreibt fr Inputfelder:
aPos[1] := aPosition[1] + Len(cVarInhalt)*nFBreite*10
aPos[2]=aPosition[2]
ELSEIF Val(cTextHoeheCM) > 0 // == IMMER PDF
cTopCM := LTrim(Str(aPosition[2]/100+Val(cZeileCM)-Val(cTextHoeheCM)))+"cm"
cLeftCM := LTrim(Str(aPosition[1]/100))+"cm"
cContainer += ''
cContainer += ''+CR+LF
//24.09.2023 12:14 berschreibt fr Inputfelder:
aPos[1] := aPosition[1] + Val(cEingabeCM)*100 //24.09.2023 12:15
aPos[2]=aPosition[2]
ELSE // == IMMER PDF
IF !Empty(cVarInhalt) .AND. cVarInhalt[1]==">" //11.02.2024 18:01 rechtsbndig, z.B. Euro
cVarInhalt := IIf(Len(cVarInhalt)>1,SubStr(cVarInhalt,2),"") //14.02.2024 12:52 > + nix = ""
cDivCM := LTrim(Str(Len(cVarInhalt+" ")*nFBreite/10))+"cm"
//22.02.2024 09:39 cLeftCM = LTrim(Str(Val(cLeftCM)-Val(cEingabeCM)))+"cm"
cTA := "text-align:right;"
cContainer += ''
ELSEIF !Empty(cVarInhalt) .AND. cVarInhalt[1]=="^" //11.02.2024 18:01 zentriert, z.B. Spalten
cVarInhalt := IIf(Len(cVarInhalt)>1,SubStr(cVarInhalt,2),"") //14.02.2024 12:52 ^ + nix = ""
cTA := "text-align:center;padding:auto;"
cContainer += ''
ELSE
// das ist tats„chlich transparent: background-color:rgba(255,255,255,0.01);
cTA := ""
cContainer += ''
ENDIF
IF !Empty(cVarInhalt) .AND. "C"==Upper(cVarInhalt[1]) .AND. "X"==Upper(cVarInhalt[Len(cVarInhalt)])
check := IIf(cVarInhalt=="X",'checked="checked"',"")
cContainer += ''+CR+LF
ELSEIF !Empty(cVarInhalt) .AND. "R"==Upper(cVarInhalt[1]) .AND. "X"==Upper(cVarInhalt[Len(cVarInhalt)])
check := IIf(cVarInhalt[Len(cVarInhalt)]=="X",'checked="checked"',"")
cRadioName := SubStr(cVarInhalt,1,Len(cVarInhalt)-1)
cContainer += ''+CR+LF
ELSE
//das sollte transparent sein(0.01 !!): border-color:rgba(255,255,255,0.01);background-color:rgba(255,255,255,0.01);
IF "right"$cTA
cTAFont := "Courier"
nAB := Int(Val(cEingabeCM)*10 / FontBreite(cTAFont,cETFSize)+1) //FontBreite ist in mm!
cVarInhalt := PadL(cVarInhalt,nAB)
ELSEIF "center"$cTA
cTAFont := "Courier"
nAB := Int(Val(cEingabeCM)*10 / FontBreite(cTAFont,cETFSize)+1) //FontBreite ist in mm!
cVarInhalt := PadC(cVarInhalt,nAB)
ELSE
cTAFont := cFont
ENDIF
cContainer += ''+CR+LF
ENDIF
//24.09.2023 12:14 berschreibt fr Inputfelder:
aPos[1] := aPosition[1] + Val(cEingabeCM)*100 //24.09.2023 12:15
aPos[2]=aPosition[2]
ENDIF
ENDIF
nEingabeVor := Val(cEingabeCM)
oProgress:increment() //+03.03.2024 21:33
ENDDO
oProgress:destroy() //+03.03.2024 21:33
/* IF nSO > 0
cContainer += ''
ENDIF*/
RETURN cString
FUNCTION FNT_set(cParnam1,cWert1,cParnam2,cWert2)
cParnam1 := cWert1
IF !Empty(cParnam2) .AND. !Empty(cWert2)
cParnam2 := cWert2
ENDIF
RETURN .T.
//06.11.2022 19:22 Adresse aus vers.dbf zusammenstellen fr html-Briefe
//19.03.2024 16:47 nA == Area, also 1,5,12 - als Zahl
FUNCTION BriefAdresse(nArt,cVerskz,nA) // nArt=1 heiát als Block, nArt=2 heiát in einer Zeile
LOCAL cAdresse := ""
DEFAULT nArt TO 1
DEFAULT cVerskz TO "FH001"
DEFAULT nA TO 5
cVerskz := AllTrim(cVerskz)
// cVerskz := AllTrim(ConvToOEMCP(cVerskz))
IF cVerskz == "A" // Adressat ist der Ansprechpartner
IF nArt == 1
cAdresse += AllTrim(Anrede()) + CRLF
cAdresse += AllTrim(1->ansp_vname) + " " + AllTrim(1->ansp_name) + CRLF
cAdresse += AllTrim(1->ansp_str) + CRLF
cAdresse += AllTrim(1->ansp_ort) + CRLF
ELSEIF nArt == 2
cAdresse += AllTrim(1->ansp_anr) + " " + AllTrim(1->ansp_vname) + " " + AllTrim(1->ansp_name) + ", " + AllTrim(1->ansp_str) + ", " + AllTrim(1->ansp_ort)
ELSEIF nArt == 3
cAdresse += AllTrim(1->ansp_anr) + " " + AllTrim(1->ansp_vname) + " " + AllTrim(1->ansp_name) + " " + AllTrim(1->ansp_str) + " " + AllTrim(1->ansp_ort)
ENDIF
ELSEIF cVerskz == "E" // Adressat ist der Ansprechpartner
IF nArt == 1
cAdresse += AllTrim(Anrede(IIf(1->anrede="Frau ","Herr ","Frau "))) + CRLF // trailing Space ist wichtig!
cAdresse += AllTrim(1->eh_vname) + " " + AllTrim(1->ansp_name) + CRLF
cAdresse += AllTrim(1->eh_str) + CRLF
cAdresse += AllTrim(1->eh_ort) + CRLF
ELSEIF nArt == 2
cAdresse += AllTrim(1->eh_anr) + " " + AllTrim(1->eh_vname) + " " + AllTrim(1->eh_name) + ", " + AllTrim(1->eh_str) + ", " + AllTrim(1->eh_ort)
ELSEIF nArt == 3
cAdresse += AllTrim(1->eh_anr) + " " + AllTrim(1->eh_vname) + " " + AllTrim(1->eh_name) + " " + AllTrim(1->eh_str) + " " + AllTrim(1->eh_ort)
ENDIF
ELSE
IF Len(cVerskz) < 6 .AND. Len(AllTrim(cVerskz)) > 0
IF !(nA)->(DbSeek(cVerskz,.F.))
RETURN cVerskz
ENDIF
ELSE
(nA)->(DbGotop())
IF Len(AllTrim(cVerskz)) == 0 .OR. !(nA)->(DBLocate( {|| cVerskz $ ((nA)->name1 + (nA)->name2) .OR. cVerskz $ (AllTrim((nA)->name1) +" "+ AllTrim((nA)->plz_ort)) } ))
RETURN cVerskz
ENDIF
ENDIF
IF nArt == 1
cAdresse += AllTrim((nA)->name1) + CRLF
cAdresse += AllTrim((nA)->name2) + CRLF
cAdresse += AllTrim((nA)->strasse) + CRLF
cAdresse += AllTrim((nA)->plz_ort) + CRLF
ELSEIF nArt == 2
cAdresse += AllTrim((nA)->name1) + " " + AllTrim((nA)->name2) + ", " + AllTrim((nA)->strasse) + ", " + AllTrim((nA)->plz_ort)
ELSEIF nArt == 3
cAdresse += AllTrim((nA)->name1) + " " + AllTrim((nA)->name2) + " " + AllTrim((nA)->strasse) + " " + AllTrim((nA)->plz_ort)
ENDIF
ENDIF
RETURN cAdresse
//29.10.2022 17:56 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//FUNCTION ModalFen( cString, cTitle, oDlg1, nXsize, nYsize )
FUNCTION ButtonFenster( aInditxt, oDlg1 )
LOCAL nEvent, mp1, mp2, oXbp, lExit
LOCAL oDlg, oSle, oMle, oFocus, aPos, nSemi := 0 //, drawingArea
LOCAL drawingArea := oDlg1:drawingArea //*
LOCAL aSize := drawingArea:currentSize()
LOCAL nXsize := ASize[1]*0.6
LOCAL nYsize := 200 + Len(aInditxt) * 25
LOCAL nText := 0
LOCAL cTitle := "W„hlen Sie einen Brief aus ! - (Edit mit ALT-Taste)"
// cString := IIf( cString<>NIL, cString, "Datensatz "+LTrim(Str(Recno()))+" ist z.Zt. gesperrt!" )
oDlg1 := IIf( oDlg1<>NIL, oDlg1, AppDesktop() )
drawingArea := oDlg1:drawingArea //*
aSize := drawingArea:currentSize()
aPos := { ( aSize[1]-nXsize )/2, ( aSize[2]-nYsize+20 ) / 2 }
oDlg := AKDialog():new( AppDesktop(), oDlg1, aPos, {nXsize,nYsize} )
oDlg:title := cTitle
oDlg:taskList := .T.
oDlg:minButton := .F.
oDlg:maxButton := .F.
oDlg:create()
// oDlg:drawingArea:setColorBG( GRA_CLR_YELLOW )
oFocus := SetAppFocus( oDlg )
aSize := oDlg:drawingArea:currentSize()
nAnztxt := Len(aInditxt)
FOR i:=1 TO nAnztxt
aPos := { 10, 30 * (nAnztxt-i+1) }
oButt := ("oXbpB"+LTrim(Str(i)))
&oButt:= XbpPushbutton():new( oDlg:drawingArea,, aPos, {aSize[1]-10,24} )
&oButt:caption := aInditxt[i]
&oButt:TabStop := .T.
&oButt:create()
&oButt:activate := {|| PostAppEvent( xbeP_Close, i,, &oButt ) }
&oButt:cargo := i
NEXT
oDlg:setModalState( XBP_DISP_APPMODAL )
oDlg:show()
nEvent := xbe_None
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
IF nEvent == xbeM_LbDown
nText := oXbp:cargo
ENDIF
IF nEvent == xbeP_Keyboard
DO CASE
CASE mp1 == xbeK_ESC
cString := "ESC"
PostAppEvent( xbeP_Activate,,, &oButt )
CASE mp1 == xbeK_RETURN .OR. mp1 == xbeK_F10
cString := "!"
PostAppEvent( xbeP_Activate,,, &oButt )
ENDCASE
ENDIF
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
oDlg:setModalState( XBP_DISP_MODELESS )
oDlg:destroy()
// SetAppFocus( oFocus )
RETURN nText
//^^ButtonFenster^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//16.03.2023 16:45 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//FUNCTION ModalFen( cString, cTitle, oDlg1, nXsize, nYsize )
FUNCTION ListboxFenster( aInditxt, oDlg1, cFormName, nBreite)
LOCAL nEvent, mp1, mp2, oXbp, lExit
LOCAL oDlgLF, oFocus, aPos //, drawingArea
LOCAL drawingArea := oDlg1:drawingArea, oDlgDA //* 16.03.2023 18:34 oDlgDA
LOCAL aSize := drawingArea:currentSize()
LOCAL nXsize := ASize[1]* IIf(Empty(nBreite), 0.6, nBreite) //08.01.2024 11:51
LOCAL nYsize := ASize[2]*0.8
LOCAL nText := 0
LOCAL cTitle := "W„hlen Sie ein Formular aus ! - (zum Editieren mit ALT-Taste in den Editor laden)"
oDlg1 := IIf( oDlg1<>NIL, oDlg1, AppDesktop() )
drawingArea := oDlg1:drawingArea //*
aSize := drawingArea:currentSize()
aPos := { ( aSize[1]-nXsize )/2, ( aSize[2]-nYsize+20 ) / 2 }
oDlgLF := AKDialog():new( AppDesktop(), oDlg1, aPos, {nXsize,nYsize} )
oDlgLF:title := cTitle
oDlgLF:taskList := .T.
oDlgLF:minButton := .F.
oDlgLF:maxButton := .F.
oDlgLF:create()
oDlgLF:lockupdate(.T.) //+27.11.2011 09:20
oDlgDA = oDlgLF:drawingArea
oDlgDA:setColorBG( GRA_CLR_YELLOW )
oFocus := SetAppFocus( oDlgLF )
aSize := oDlgDA:currentSize()
oListBox := XbpListBox():new( oDlgDA,,{Int(12*nV),Int(12*nV)},{aSize[1]-Int(20*nV),aSize[2]-Int(20*nV)})
Sleep(2) //+16.08.2012 10:56 Vista-Problem !
oListBox:setFontCompoundName( cBFont )
oListBox:create()
Sleep(2) //+16.08.2012 10:56 Vista-Problem !
FOR i := 1 TO Len(aInditxt)
oListBox:addItem(ConvToOEMCP(aInditxt[i]))
// oListBox:addItem(aInditxt[i])
Sleep(2) //+23.02.2010 08:58 Vista-Problem !
NEXT
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
oListBox:setData( {1}, .T. )
oDlgLF:lockupdate(.F.) //+27.11.2011 09:20
oDlgLF:invalidateRect() //+27.11.2011 09:30
oDlgLF:setModalState( XBP_DISP_APPMODAL )
oDlgLF:show()
SetAppFocus(oListBox)
nEvent := xbe_None
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
IF nEvent == xbeM_LbDblClick .and. oXbp:isDerivedFrom( "XbpListBox" )
cFormName := oListBox:getItem( oListBox:getData()[1] )
nText := oListBox:getData()[1]
nEvent := xbeP_Close
ENDIF
IF nEvent == xbeM_LbClick .and. oXbp:isDerivedFrom( "XbpListBox" )
cFormName := oListBox:getItem( oListBox:getData()[1] )
nText := oListBox:getData()[1]
nEvent := xbeP_Close
ENDIF
IF nEvent == xbeP_Keyboard
DO CASE
CASE mp1 == xbeK_ESC
cString := "ESC"
cFormName := ""
nText := 0 //oListBox:getData()[1]
nEvent := xbeP_Close
CASE mp1 == xbeK_RETURN .OR. mp1 == xbeK_F10
cString := "!"
cFormName := oListBox:getItem( oListBox:getData()[1] )
nText := oListBox:getData()[1]
nEvent := xbeP_Close
// CASE mp1 == xbeK_DOWN //.and. oXbp:isDerivedFrom( "XbpListBox" )
// PostAppEvent( xbeP_User )
// CASE mp1 == xbeK_UP //.and. oXbp:isDerivedFrom( "XbpListBox" )
// PostAppEvent( xbeP_User )
ENDCASE
ENDIF
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
oDlgLF:setModalState( XBP_DISP_MODELESS )
// oListBox:destroy()
sleep(5)
oDlgLF:destroy()
// SetAppFocus( oFocus )
RETURN nText
//^^ListboxFenster^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FUNCTION DateiStruktur(nA)
LOCAL nOldArea := SELECT()
LOCAL aStruktur := {}, cText := ""
SELECT &nA
aStruktur := ASort(DbStruct(),,,{|a1,a2|a1[1]",cVariable))
cVar := SubStr(cVariable,At(">",cVariable)+1,Len(cVariable)-Len(cA)-2)
ELSE
cA := SubStr(cVariable,1,At("->",cVariable)+1)
cVar := SubStr(cVariable,At(">",cVariable)+1,Len(cVariable)-Len(cA))
ENDIF
nFLD[1] := &cA->(FieldInfo(&cA->(FieldPos(cVar)),FLD_LEN))
nFLD[2] := &cA->(FieldInfo(&cA->(FieldPos(cVar)),FLD_DEC))
// FieldInfo(FieldPos(SubStr(cVariable,At(">",cVariable)+1,nVarLen-3)),FLD_LEN), ;
// FieldInfo(FieldPos(SubStr(cVariable,At(">",cVariable)+1,nVarLen-3)),FLD_DEC) ;
RETURN nFLD
//gewinnt die genaue Fontbreite aus der GraQueryTextBox
FUNCTION FontBreite(cFontName,cFontPt,cBuchstabe) //10.02.2024 16:19
LOCAL nFBreite, oPSb, oFontb, aTextBox, cFont := LTrim(Str(Val(cFontPt)))+"."+cFontName
//11.02.2024 13:37 LOCAL oPrinter := XbpPrinter():New() //02.01.2024 12:33 speziell fr KSO
LOCAL cDruckerName := IIf(isMEMVAR("cDruckerName").AND.!Empty(cDruckerName),cDruckerName,XbpPrinter():New():Create():devName) //02.01.2024 12:34 fr KSO
aMark := {"","","","","",""} //18.03.2024 18:30
DEFAULT cBuchstabe TO " " //10.02.2024 16:19
//18.03.2024 18:31 l”scht die MarkUp-Befehle fr die Berechnung der nFBreite: ^^^^^^^^^^^^^^
DO WHILE ""$cBuchstabe .OR. ""$cBuchstabe .OR. ""$cBuchstabe
AEval(aMark,{|x,i|IIf(x$cBuchstabe,cBuchstabe := Stuff(cBuchstabe,At(x,cBuchstabe),Len(x),""),)})
ENDDO
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
oPSb := PrinterPS(cDruckerName) //27.08.2023 cDruckerName LOCAL !!
oFontb := XbpFont():new(oPSb)
oFontb:CREATE(cFont)
GraSetFont(oPSb,oFontb)
// aTextBox := GraQueryTextBox(oPSb,Space(10)) //18.09.2023 16:03 Space(10) ist aber identisch mit " " !!
IF Len(cBuchstabe)>1
aTextBox := GraQueryTextBox(oPSb,cBuchstabe) //15.02.2024 10:37 in cBuchstabe steckt der Text, dessen Breite gesucht wird
ELSE
aTextBox := GraQueryTextBox(oPSb,Replicate(cBuchstabe,10)) //10.02.2024 16:22
ENDIF
nFBreite := aTextBox[5,1]/100
RETURN nFBreite // in mm, weil 10-Buchstaben-breit in cm !!
//06.11.2022 10:37 Suche in offener Auftragsdatei
FUNCTION SucheInDatei(nA,cFeld,cInhalt)
LOCAL nOldArea := SELECT()
LOCAL cAntwort := "nein"
LOCAL cAuf := Str(1->auftrnr,6,0)
LOCAL nRec
PRIVATE cF := cFeld
SELECT(nA)
nRec := RecNo()
DbSuspendNotifications()
DbSeek(cAuf,.F.) //13.11.2018 18:48 statt: FIND &cAuf
DO WHILE 3->auftrnr=Val(cAuf) .and. .not. eof()
IF Upper(cInhalt)$Upper(3->&cF)
cAntwort := "ja"
ENDIF
DbSkip()
ENDDO
DbGoto(nRec)
DbResumeNotifications()
SELECT(nOldArea)
RETURN cAntwort
//12.09.2023 21:17 Prompt abtrennen
FUNCTION OhnePrompt(cText,cTrenner)
DEFAULT cTrenner TO ":"
RETURN AllTrim(SubStr(cText,At(cTrenner,cText)+1))
//02.11.2023 10:54 wofr wird das noch gebraucht??:
//28.09.2023 09:40 Seitenumbruch fr weitere Seiten mit Formular
FUNCTION NeuesFormular(cHintergrund)
DEFAULT cHintergrund TO ""
RETURN cHintergrund
//02.11.2023 10:50 berechnet width/height des Formulars (==> portrait oder landscape)
FUNCTION FormSize(cFormular)
LOCAL oBitmap, cXCM, cYcm
IF (FExists(cDatver+cFormular) .AND. Upper(Right(cFormular,4))==".PNG") //21.02.2024 13:55
oBitmap := XbpBitmap():new():CREATE(XbpPresSpace():new())
oBitmap:loadFile(cDatver + cFormular)
cXCM := IIf(oBitmap:xsize < oBitmap:ysize,"21cm","29.7cm")
cYCM := IIf(oBitmap:ysize < oBitmap:xsize,"21cm","29.7cm")
ELSE //24.01.2024 19:01 wenn in Inditext~.txt kein Formular eingetragen ist:
cXCM := "21cm"
cYCM := "29.7cm"
ENDIF
RETURN {cXCM,cYCM}
//02.11.2023 13:20 um CodeBl”cke im inditext einzusparen: vvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//02.11.2023 13:26 zum Ankreuzen der richtigen Bestattungsart
FUNCTION EFzuX(bestart)
RETURN IIf(1->best_art==bestart,"X","")
//02.11.2023 13:16
FUNCTION EF_Friedhof()
RETURN IIf(!Empty(1->&TO2),1->&TO2,1->&TO4)
//02.11.2023 13:16
FUNCTION EF_Wochentag()
RETURN IIf(!Empty(oBest:TW2),oBest:TW2,oBest:TW4)
//02.11.2023 13:16
FUNCTION EF_Datum()
RETURN IIf(!Empty(1->&TD2),1->&TD2,1->&TD4)
//02.11.2023 13:16
FUNCTION EF_Uhrzeit()
RETURN IIf(!Empty(1->&TZ2),1->&TZ2,1->&TZ4)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//19.12.2023 18:33 speziell fr Mller/Grnfl„chenamt-Formular
// holt sich die Betr„ge zu den Leistungs-Zeilen aus der auftr.dbf
FUNCTION GruenBetraege(cFill,nSumZeile) //11.02.2024 18:16
LOCAL nOldArea := SELECT()
LOCAL nRec := 3->(RecNo())
DEFAULT cFill TO "_" //11.02.2024 18:16
DEFAULT nSumZeile TO 17 //11.02.2024 18:16
aGruen := AFill(Array(nSumZeile),0) // 16 + Summe - das ist eine PRIVATE von VariPosition_1()
SELECT 3
DbSuspendNotifications()
DbSetFilter({|| 1->auftrnr == 3->auftrnr })
DbGotop()
DO WHILE !Eof()
IF 3->neu = "g" // wenn der erste Buchstabe ein kleines g ist
nGruen := IIf(Val(3->neu[2])>0 .AND. Val(3->neu[2])<10,Val(3->neu[2]),Asc(3->neu[2])-87)
aGruen[nGruen] += 3->betrageu
ENDIF
DbSkip()
ENDDO
DbClearFilter()
DbGoto(nRec)
DbResumeNotifications()
SELECT(nOldArea)
// AEval( aGruen, {|a,i| a := Str(a,6,2) },,,.T.)
cPicture := "@L"+cFill+" 99,999,999.99"
AEval( aGruen, {|a,i| aGruen[17]+=a, a := Transform(a,cPicture) },,,.T.)
RETURN ""
// hilft bei solchen KommaVerbindungen: (UND spart Trim() und Str() und DtoC())
//$(Trim(1->eh_name),1850,130,1610) $(',') $(Trim(1->eh_vname)) $(',')
//$(Trim(1->eh_str)) $(',') $(1->eh_ort)
//15.11.2023 18:46
FUNCTION AkommaB(aFelder,cF2,cF3,cF4,cF5,cF6,cF7,cF8,cF9,cF10)
LOCAL x, cFelder:=""
IF ValType(aFelder)=="A" // cF2 == NIL
FOR x:=1 TO Len(aFelder)
cFelder += IIf(x>1,", ","")
cFelder += Trim(aFelder[x])
NEXT
ELSE
cFelder := TrimVT(aFelder) + ", " + TrimVT(cF2)
IF cF3 != NIL
cFelder += ", " + TrimVT(cF3)
IF cF4 != NIL
cFelder += ", " + TrimVT(cF4)
IF cF5 != NIL
cFelder += ", " + TrimVT(cF5)
IF cF6 != NIL
cFelder += ", " + TrimVT(cF6)
IF cF7 != NIL
cFelder += ", " + TrimVT(cF7)
IF cF8 != NIL
cFelder += ", " + TrimVT(cF8)
IF cF9 != NIL
cFelder += ", " + TrimVT(cF9)
IF cF10 != NIL
cFelder += ", " + TrimVT(cF10)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN cFelder
//16.12.2023 09:27 Trim gem„á ValType
FUNCTION TrimVT(xVar,nL,nD,cN,cE)
LOCAL nPkt := nL // zwischenspeichern von nL
LOCAL cVar := nD // wird noch nicht gebraucht...
DEFAULT nL TO 0
DEFAULT nD TO 0
DEFAULT cN TO ""
IF ValType(xVar)=="C" .AND. Len(xVar)>2 .AND. xVar[1]=="(" .AND. xVar[Len(xVar)]==")" //01.04.2024 19:03 Len
cVariable := "TrimVT"+xVar
RETURN &cVariable
ENDIF
IF ValType(xVar)=="C"
nL := IIf(ValType(nL)=="C",Val(nL),nL)
nD := IIf(ValType(nD)=="C",Val(nD),nD)
cN := IIf(ValType(cN)=="C",Val(cN),cN)
IF nL==1 // vor dem 1. Leerschritt
cVar := SubStr(xVar,1,At(" ",xVar)-1)
xVar := cVar
ELSEIF nL==2 // nach dem ersten Leerschritt
cVar := SubStr(xVar,At(" ",xVar)+1)
xVar := cVar
ENDIF
IF nD>0 // gesperrt um nD Leerschritte
cVar := ""
FOR n:=1 TO Len(xVar)
cVar += xVar[n] + Space(nD)
NEXT
xVar := cVar
ENDIF
IF !Empty(cN)
IF cN==1
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==2
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==3
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==4
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==5
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==6
cVar := "" + AllTrim(xVar) + ""
ELSEIF cN==7
cVar := "" + AllTrim(xVar) + ""
ELSE
cVar := Trim(xVar)
ENDIF
ELSE
cVar := Trim(xVar)
ENDIF
ELSEIF ValType(xVar)=="N" // s.o.
cVar := Str(xVar)
IF "."$cVar .AND. nPkt == NIL //nPkt ist die bergebene nL
nPkt := At(".",cVar) //Punkt in der Zahl aber keine nL
nL := Len(cVar)
nD := nL - nPkt
ELSEIF nPkt == NIL //Kein Punkt in der Zahl und keine nL
nL := Len(cVar) // dann ist nL die L„nge von cVar
nD := 0
ENDIF
IF ValType(cE)=="C"
cVar := IIf(Len(cN)>0,PadL(LTrim(Str(xVar,nL,nD)),nL,cN)+cE,LTrim(Str(xVar,nL,nD))+cE)
ELSE
cVar := IIf(Len(cN)>0,PadL(LTrim(Str(xVar,nL,nD)),nL,cN),LTrim(Str(xVar,nL,nD)))
ENDIF
ELSEIF ValType(xVar)=="D"
nD := IIf(ValType(nD)=="N",", ",nD)
IF nL==2
cVar := Str(Day(xVar))+". "+CMonth(xVar)+" "+Str(Year(xVar))
ELSEIF nL==3
cVar := CDoW(xVar)+nD+DtoC(xVar)
ELSEIF nL==4
cVar := CDoW(xVar)+nD+Str(Day(xVar))+". "+CMonth(xVar)+" "+Str(Year(xVar))
ELSE
cVar := DtoC(xVar)
ENDIF
ENDIF
RETURN IIf(ValType(xVar)=="C", cVar,;
IIf(ValType(xVar)=="N", cVar,;
IIf(ValType(xVar)=="D", cVar,"")))
//04.03.2024 13:12 Text fr Trauerkarten
FUNCTION Trauerfeier(cTFTag,cTFDat,cTFZeit,cTFOrt, cOrtart)
LOCAL cText
DEFAULT cTFTag TO AllTrim(1->messetag)
DEFAULT cTFDat TO DtoC(1->messedat)
DEFAULT cTFZeit TO Str(1->messezeit,5,2)
DEFAULT cTFOrt TO AllTrim(1->messewo)
DEFAULT cOrtart TO "" //12.03.2024 18:01
cTFTag := AllTrim(cTFTag)
cTFDat := IIf(ValType(cTFDat)=="C",cTFDat,DtoC(cTFDat))
cTFZeit := IIf(ValType(cTFZeit)=="C",cTFZeit,Str(cTFZeit,5,2))
cTFOrt := AllTrim(cTFOrt)
cOrtart += IIf(Len(cOrtart)>0," ",IIf("St."$cTFOrt .OR. "San"$cTFOrt,"Kirche ","")) //12.03.2024 18:01
RETURN cText := "Die Trauerfeier ist am "+cTFTag+", dem "+cTFDat+", um "+cTFZeit+" Uhr in der "+cOrtart + cTFOrt+"."
//====================================================
/**
* Parameter nAI, nAE = Area-in, Area-ex z.B. 1, 7
* Parameter cFI, cFE = Filename-in, Filename-ex z.B. BEST, FExBEST
* Parameter nAnz = Anzahl der in cFE zu erstellenden gleichen Datens„tze (=Trauerdruck-Stckzahl)
* kopiert den aktuellen Datensatz von cFI auf neu erstelltes cFE, so oft, wie es nAnz angibt
*/
FUNCTION SwapDB(nAI, nAE, cFI, cFE, nAnz)
LOCAL nOldArea := SELECT()
LOCAL n, aData
DEFAULT nAnz TO 1
IF Empty((nAI)->(Alias())) .OR. (nAI)->(Alias()) != Upper(cFI)
msgbox(cFI+" ist nicht ge”ffnet in Area "+Str(nAI))
RETURN .F.
ENDIF
IF (nAE)->(Alias()) == Upper(cFE) // darf eigentlich nicht sein...
(nAE)->(DbCloseArea())
ELSEIF Empty((nAE)->(Alias()))
(nAI)->(DbCopyStruct("C:\HDBE\"+cFE))
Sleep(100) // fr alle F„lle ...
ENDIF
(nAE)->(DbUseArea(,,"C:\HDBE\"+cFE,,.F.)) // exclusive
SELECT(nAI)
aData := Array(FCount())
For n := 1 to FCount()
aData[n] := FieldGet( n )
NEXT
SELECT(nAE)
ZAP // fr alle F„lle
DO WHILE nAnz > 0 // erzeugt nAnz Datens„tze
APPEND BLANK
FOR n := 1 to FCount()
FieldPut( n, aData[n] )
NEXT
nAnz--
ENDDO
(nAE)->(DbCloseArea())
SELECT(nOldArea)
RETURN .T.
/** 26.02.2024 10:00
* Parameter nAI, cFI z.B. 1, "best"
* wenn NIL, dann die Datei in der aktuellen Area
*
*/
FUNCTION FExport(nAI, cFI)
LOCAL nOldArea := SELECT()
LOCAL aStruktur, aFelder := {}
LOCAL cFSTRU
LOCAL cFEx, nFE := 17
PRIVATE cI //, cE
DEFAULT nAI TO nOldArea
DEFAULT cFI TO (nAI)->(Alias())
cFSTRU := "C:\HDBE\FExSTRU_"+cFI+".DBF"
IF !FExists( "C:\HDBE\_DB","D" ) //12.11.2024 18:21
RunShell( "/C MD "+"C:\HDBE\_DB",, .T. )
sleep(200)
ENDIF
cFEx := "C:\HDBE\_DB\FEx_"+cFI+".DBF" // 'NeueDB' als Datenbank einrichten im Verzeichnis C:\HDBE\_DB
// fr die offene Datei der Verwaltung in einer 'Struktur'.dbf:
// zuerst die Struktur so ver„ndern, dass alle N und D zu C werden:
IF !FExists(cFSTRU)
(nAI)->(DbCopyExtStruct(cFSTRU)) // erzeugt eine Datei der Strukturdatein von nAI/cFI
Sleep(10) // 28.02.2024 15:19 weil DbCreateFrom manchmal aussteigt
DbUseArea(.T.,,cFSTRU,"FS",.F.)
DO WHILE !FS->(Eof()) // wandelt alle Datens„tze so um, ...
IF FS->FIELD_TYPE == "N"
FS->FIELD_TYPE := "C"
FS->FIELD_DEC := 0
ELSEIF FS->FIELD_TYPE == "D" // ... dass auch N & D zu C werden
FS->FIELD_TYPE := "C"
FS->FIELD_LEN := 10
ENDIF
DbSkip()
ENDDO
FS->(DbCloseArea())
ELSE
SELECT(nFE)
ENDIF
// aus der 'Struktur'.dbf die šbergabeDatei fr den aktuellen Datensatz kreieren:
DbCreateFrom(cFEx,,cFSTRU)
aStruktur := (nAI)->(DbStruct())
AEval(aStruktur,{|a|AAdd(aFelder,a[1])})
DbCloseArea()
// der Methode SwapInachE nachempfunden:
// den aktuellen Datensatz der Verwaltung in die šbergabeDatei kopieren:
DbUseArea(.T.,,cFEx,"fe",.F.)
fe->(DbAppend())
FOR n:=1 TO Len(aFelder)
cI := aFelder[n]
// wandelt N und D in C um: (wenn leer, dann fllen mit einem *)
DO CASE
CASE ValType((nAI)->&cI) == "C"
fe->&cI := IIf(Empty((nAI)->&cI),"*",(nAI)->&cI) //27.02.2024 09:44 IIf (Empty...
CASE ValType((nAI)->&cI) == "N"
IF (nAI)->&cI != Int((nAI)->&cI) // wenn dezimal, dann mit 2 Stellen
fe->&cI := IIf(Empty((nAI)->&cI),"*",LTrim(Str((nAI)->&cI,10,2)))
ELSE
fe->&cI := IIf(Empty((nAI)->&cI),"*",Str((nAI)->&cI)) // Zahl in String verwandeln
ENDIF
CASE ValType((nAI)->&cI) == "D"
fe->&cI := IIf(Empty((nAI)->&cI),"*",DtoC((nAI)->&cI)) // Datum in String verwandeln
ENDCASE
NEXT
fe->(DbSkip())
fe->(DbCloseArea())
SELECT(nOldArea)
RETURN .T.
//05.01.2024 cPPLinks aus: FExists("C:\HDBE\PdfProgLinks.txt")
// speziell fr B~X, weil ein PC keinen AdobeReader kann
//18.05.2026 18:57 jetzt eine eigene Funktion:
FUNCTION ZeigePDF(cPPLinks, nMaxLines)
LOCAL aPPLinks := {}, cPPLinksZ, n
IF Len(cPPLinks)>0
FOR n := 1 TO nMaxLines
AAdd(aPPLinks, Trim(MemoLine(cPPLinks, 100, n)))
NEXT
FOR n := 1 TO Len(aPPLinks)
cPPLinksZ := aPPLinks[n] // cPPLinksZ ist die erste gefundene AufrufZeile aus dem Text cPPLinks
IF FExists(cPPLinksZ)
RunShell ("&cFilePDF",cPPLinksZ,.T.)
EXIT
ENDIF
NEXT
IIf(n>len(aPPLinks), Alertbox(oCB,"Das PDF-Programm ist nicht ordentlich installiert!",,,"A C H T U N G",3),)
ELSE
IF FExists('C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe') //64bit Reader
RunShell ("&cFilePDF","C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe",.T.)
ELSEIF FExists('C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe') //32bit Reader
RunShell ("&cFilePDF","C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe",.T.)
ELSEIF FExists('C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\AcroRd32.exe') // Test nur fr B~X
RunShell ("&cFilePDF","C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\AcroRd32.exe",.T.)
ELSE
Alertbox(oCB,"Der Adobe Reader DC ist nicht ordentlich installiert!",,,"A C H T U N G",3)
ENDIF
ENDIF
RETURN .T.