zuerst der, in dem ich die Daten für die Eingabemaske zusammenbaue.
Code: Alles auswählen
FUNCTION edi_kondat(oGiro)
LOCAL ar_get := {}
LOCAL apush := {}
LOCAL x_txt1 := oVtPara:N_FIBU + " :: Kassenwirksamkeit für TG " + oVtPara:m_mtg_nr + " " + oVtPara:m_mtg_nam2+ " im BJ " + oVtPara:m_mtg_jahr
LOCAL x_txt2 := "Bank : " + (oGiro:nArea)->bank + " BLZ : " + (oGiro:nArea)->blz + " Konto : " + (oGiro:nArea)->kt_nr
MEMVAR oVtPara // Public
oVtPara:x_sammler := .F.
IF SubStr( ((oGiro:nArea)->bank) ,1,7) = DSZ + "STORNO"
oVtPara:k_k_ausz := 9999
ENDIF
#define NACH( BBB ) "-> "+PadR( BBB , 16 , " ")
AAdd(apush,{0,0,NACH(oVtPara:N_JOURNAL ) ,{||al_aus21("JJJJ_TTTT" )},.T.})
AAdd(apush,{0,0,NACH(oVtPara:N_FIBU ) ,{||al_aus23( .F. )},.T.})
AAdd(apush,{0,0,NACH("Teilnehmer") ,{||he_ver11(,"ohne_wechsel")},.T.})
AAdd(apush,{0,0,NACH("offene U-Weisungen"),{||offeneUeberweisungen(oXbp)},.T.}) [b]<----------------------- hier der Codeblock den ich meine[/b]
DO WHILE .T.
ASize( ar_get , 0 )
**** Eingabe Kasse
ar_get := al_edit_var( ;
{{270,400,oVtPara:k_k_soll ,EDI_Z(15,2), PadL(oVtPara:N_SOLL + " EUR",15," "), 15} ,; // 1
{430,400,oVtPara:k_k_haben ,EDI_Z(15,2), PadL(oVtPara:N_HABEN + " EUR",15," "), 15} ,; // 2
{270,300,oVtPara:k_dat_kont,PIC_DATUM , "Wertstellung" , 10} ,;
{430,300,oVtPara:k_k_ausz , "9999" , "Nr. Auszug" , 4} ,;
{270,250,oVtPara:dat_dtaus ,PIC_DATUM , "SEPA Datum" , 10} ,;
{430,250,oVtPara:x_sammler ,PIC_LOGI , "Sammler J/N" , 2} ,;
{010,400,,, "Mandant :" + oVtPara:m_mtg_nr ,1000},;
{010,375,,, " :" + oVtPara:m_mtg_nam2 ,1000},;
{010,350,,, "Jahr :" + oVtPara:m_mtg_jahr ,1000},;
{010,300,,, "Bank :" + (oGiro:nArea)->bank ,1000},;
{010,275,,, "Konto :" + (oGiro:nArea)->kt_nr ,1000},;
{010,250,,, "SALDO :" + zeig_zahl((oGiro:nArea)->saldo,12,2,"BE"),1000},;
{010,225,,, " " ,1000} ;
} , {40,40} ,;
{{ 1 , 1 , x_txt2 , x_txt1 }},apush;
)
**** Abbruch / fertig
IF Len(ar_get) = 0
BREAK()
ENDIF
IF Abs(ar_get[1,3]) + Abs(ar_get[2,3]) = 0
BREAK()
ENDIF
oVtPara:k_k_soll := Round( ar_get[1,3] ,2)
oVtPara:k_k_haben := Round( ar_get[2,3] ,2)
oVtPara:k_dat_kont := ar_get[3,3]
oVtPara:k_k_ausz := ar_get[4,3]
oVtPara:dat_dtaus := ar_get[5,3]
oVtPara:x_sammler := ar_get[6,3]
IF oVtPara:k_k_soll = 0.00
oVtPara:x_sammler := .F. // nur für Ausgaben
ENDIF
DO CASE
CASE ( oVtPara:k_k_soll = 0 .AND. oVtPara:k_k_haben = 0 )
BREAK() //--- ohne Wwert
CASE oVtPara:k_dat_kont < CtoD( "01.01." + oVtPara:m_mtg_jahr)
MsgBox("Wertstellung außerhalb des Buchungsjahres - bitte korrigieren")
LOOP
CASE oVtPara:k_dat_kont > CtoD( "31.12." + oVtPara:m_mtg_jahr)
MsgBox("Wertstellung außerhalb des Buchungsjahres - bitte korrigieren")
LOOP
CASE oVtPara:k_k_ausz = 9000
MsgBox("AZ 9000 reserviert für Auto_Storno - bitte neu !!!")
LOOP
CASE oVtPara:k_k_ausz < 1
MsgBox("Auszugsnummer ist Pflichteingabe - bitte neu !!!")
LOOP
CASE ( oVtPara:k_k_soll # 0 .and. oVtPara:k_k_haben # 0 )
MsgBox( oVtPara:N_SOLL + " und " + oVtPara:N_HABEN + " enthalten eine Betragsangabe")
LOOP
CASE oVtPara:k_k_soll < 0
MsgBox("AUSGABE :: Minusbeträge nicht zugelassen.")
LOOP
CASE oVtPara:k_k_haben < 0
MsgBox("EINNAHME :: Minusbeträge nicht zugelassen.")
LOOP
OTHERWISE
EXIT // das wars
ENDCASE
ENDDO
ASize( ar_get , 0 )
RETURN NIL
jetzt der, in dem die Eingabemaske erzeugt wird.
Code: Alles auswählen
FUNCTION al_edit_var( ar_get , apos , agruppe , xpush , abig , ex_ok , x_syspush )
LOCAL oDlx
LOCAL oXbp
LOCAL oXbpu
LOCAL drawingArea
LOCAL oCtrl := NIL
LOCAL oXbp1
LOCAL x_fact
LOCAL y_fact
LOCAL oLocal_style := Local_style():new():initvaria(oVtPara:us_font_input)
LOCAL oOwner := SetAppWindow()
LOCAL oParent := AppDesktop()
LOCAL i := 1
LOCAL y_min := 1000
LOCAL apush := {}
LOCAL p_gross := {0,0}
LOCAL abig_st := {0,0}
LOCAL astart_st := {8,8}
LOCAL astart_e := {0,0}
LOCAL abig_me := {0,0}
// LOCAL sta_max := 0 // Trimme + wenn Text zu breit
LOCAL amax := { AppDesktop():currentsize()[1] - oVTpAra:us_scrm_li - oVTpAra:us_scrm_re,AppDesktop():currentsize()[2] - oVTpAra:us_scrm_ob - oVTpAra:us_scrm_un }
LOCAL ar_clo := {} // für Schriftverkleinerung
LOCAL x_korr := 0 // für Schriftverkleinerung
LOCAL zbig := {}
LOCAL zzbreit := 8
LOCAL zzhoch := 16
MEMVAR oVTpAra // Public
MEMVAR x_skip // hier unbekannt
MEMVAR xx_font_input // hier unbekannt
// UnUsed(sta_max) // Dummy keine Ahnung wofür sta_max benötigt wird (06.05.2013)
xx_font_input := oVTpAra:us_font_input
#define X_TEST PadR( xx_font_input , 10 , " ") + Str(zzbreit,5,0) + Str(zzhoch,5,0) +CRLF +Space(10)+ Str(x_fact ,5,0) + Str(y_fact,5,0)
**** Erst mal Standardgrößen feststellen
*
*
*
zbig := string_big_text( Replicate("M",100) , xx_font_input )
zzhoch := zbig[2]
zzbreit := Round( (zbig[1] / 100 ) ,0)
x_fact := zbig[1] / 100 / 8
y_fact := zzhoch / oVTpAra:us_edit_y
p_gross := { zzbreit*20 , zzhoch }
x_skip := zzhoch * 1.5 // für y-Push
BEGIN SEQUENCE
IF Len(ar_get) = 0
BREAK()
ENDIF
**** suche kleinsten Y-Wert
* rtrim in Textfeldern
* Y-Wert neu setzen
* X/Y-Wert in ar_clo merken
* rechne Faktor X/Y-Wert
AEVal( ar_get ,{|a,xi|ar_get[xi,5] := RTrim( ar_get[xi,5] )+" ", y_min := min( y_min , ar_get[xi,2] ) } ) // y_min
AEVal( ar_get ,{|a,xi|ar_get[xi,2] := ar_get[xi,2] - y_min + 8 }) // y_min
AEVal( ar_get ,{|a,xi| AAdd(ar_clo ,{ ar_get[xi,1],ar_get[xi,2],"dummy",{0,0} } ),; // Merke Vorgabe
IF(ar_get[xi,6] = 300,ar_clo[xi,4,1] := ar_get[xi,4,1],) ,;
IF(ar_get[xi,6] = 300,ar_clo[xi,4,2] := ar_get[xi,4,2],);
};
)
AEVal( ar_get ,{|a,xi|ar_get[xi,2] := ar_get[xi,2] * y_fact, ar_get[xi,1] := ar_get[xi,1] * x_fact} ) // // Rechne Faktor
DEFAULT xpush TO {}
DEFAULT apos TO {49,49}
DEFAULT agruppe TO {{1,1,"Eingabefelder"," Eingabe" }}
DEFAULT abig TO {100,100}
DEFAULT ex_ok TO .T.
DEFAULT x_syspush TO {"Übernehmen","Abbruch"}
IF ValType(abig) # "A"
abig := {0,0}
ENDIF
IF Len(abig) # 2
abig := {0,0}
ENDIF
IF apos[1] # 49
apos[1] += oVTpAra:us_scrm_li
ENDIF
IF apos[2] # 49
apos[2] += oVTpAra:us_scrm_un
ENDIF
DO WHILE .T.
**** Paßt nicht --> Schrift -1
* Werte zurück für Folgedurchlauf mit kleinerer Schrift
*
IF x_korr > 0
xx_font_input := AllTrim(Str( Val(BeforAtNum(".",xx_font_input,1))-1 ,2,0)) + "." + AfterAtNum(".",xx_font_input,1)
**** -1 rechnen
zbig := string_big_text( Replicate("M",100) , xx_font_input )
zzhoch := zbig[2]
zzbreit := Round( (zbig[1]/100) ,0)
x_fact := zbig[1] / 100 / 8
y_fact := zzhoch / oVTpAra:us_edit_y
p_gross := { zzbreit*20 , zzhoch }
ASize( abig , 0 )
ASize( apush , 0 )
ASize( abig_st , 0 )
ASize( astart_st, 0 )
ASize( astart_e , 0 )
**** alte Kordinaten zurück von ar_clo --> ar_get
* und mit neuem faktor rechnen
AEVal( ar_clo , {|a,xi| ar_get[xi,1] := ar_clo[xi,1] * x_fact,ar_get[xi,2] := ar_clo[xi,2] * y_fact,;
IF(ar_get[xi,6] = 300,ar_get[xi,4,1] := ar_clo[xi,4,1],),;
IF(ar_get[xi,6] = 300,ar_get[xi,4,2] := ar_clo[xi,4,2],);
};
)
i := 1
apush := {}
abig_st := {0,0}
astart_st := {8,8}
astart_e := {0,0}
x_skip := zzhoch * 1.5
// sta_max := 0 // Trimme + wenn Text zu breit
oLocal_style:initvaria(xx_font_input)
abig := {0,0}
ENDIF
x_korr++
**** abig_st - Editbereich innen errechnen
* x_max in Static
* y_max in Static
FOR i := 1 TO Len( ar_get )
DO CASE
CASE ar_get[i,6] < 300 // get
abig_st[2] := max( abig_st[2] , ar_get[i,2] + (zzhoch*3) )
abig_st[1] := max( abig_st[1] , ar_get[i,1] + ar_get[i,6]*zzbreit )
abig_st[1] := max( abig_st[1] , ar_get[i,1] + Len(ar_get[i,5])*zzbreit )
CASE ar_get[i,6] = 300 // memo COL/ROW wird Pixel
ar_get[i,4,1] := ar_get[i,4,1] * zzbreit + 22
ar_get[i,4,2] := ar_get[i,4,2] * zzhoch
abig_st[1] := max( abig_st[1] , ar_get[i,1] + ar_get[i,4,1])
abig_st[2] := max( abig_st[2] , ar_get[i,2] + 4 + ar_get[i,4,2] + zzhoch)
CASE ar_get[i,6] = 500 // Text mit Var zweizeilig
abig_st[2] := max( abig_st[2] , ar_get[i,2] + (zzhoch * 3) )
abig_st[1] := max( abig_st[1] , ar_get[i,1] + Len(RTrim(ar_get[i,4])) * zzbreit )
abig_st[1] := max( abig_st[1] , ar_get[i,1] + Len(ar_get[i,5]) * zzbreit )
CASE ar_get[i,6] = 1000 // nur Text einzeilig
abig_st[2] := max( abig_st[2] , ar_get[i,2]+(zzhoch*2) )
abig_st[1] := max( abig_st[1] , ar_get[i,1]+Len(ar_get[i,5]) * zzbreit + zzbreit + 4 )
ENDCASE
NEXT i
**** abig_st - max errechnen
* x_max 8 + XXX + 8
* y_max 8 + 16*zzbreit + 8
abig_st[1] += (8+8+8+8+8)
abig_st[2] += (8+32)
**** abig - max errechnen aus abig_st
* x_max 8 + XXX + 8 + push
* y_max 8 + XXX + 8
abig[1] := max( abig[1] , abig_st[1] + 8 + 8 + p_gross[1] + 8 + 12 )
abig[2] := max( abig[2] , abig_st[2] +25 + 8 + zzhoch + 8 + 12 )
**** Push
* SysPush zuerst
AAdd( apush , { abig[1] - (8+p_gross[1]+8) , 0, x_syspush[1],{|| printValues( oCtrl:getList() ) } , .T. } ) //"ÜBERNEHMEN" ,;
AAdd( apush , { abig[1] - (8+p_gross[1]+8) , 0, x_syspush[2],{|| ar_get := quit_edit( ar_get , oCtrl:getlist()),PostAppEvent(xbeP_Close)}, ex_ok } ) //"ABBRUCH" ,;
* ggf ini Push
AEVal(xpush,{|a,xi|AAdd( apush , xpush[xi] )})
FOR i := 1 TO Len( apush )
apush[i,1] := abig[1] - 8+p_gross[1] + 8
**** abfangen auswählbar nicht angegeben
IF Len( apush[i] ) < 5
AAdd( apush[i] , .T. )
ENDIF
NEXT i
**** y_max_Höhe ggf für Push erhöhen
abig[2] := max( abig[2] , 32 + Len(apush)* (p_gross[2]*1.5) + 8 + 32 )
**** y_Start Push festlegen
FOR i := 1 TO Len( apush )
apush[i,2] := ( Len(apush)*(p_gross[2]*1.5) ) - i*(p_gross[2]*1.5) + 8
NEXT i
**** Static innen festlegen
astart_st := {08,08}
abig[1] := int(abig[1])
abig[2] := int(abig[2])
***** Trimme Screenanzeige
IF apos[1] = 49 .AND. apos[2] =49
apos := Pos_AppWindow( {} , abig , "CENTER" )
ELSE
apos := trim_screen( apos , abig )
ENDIF
**** ggf Schrift verkleinern, wenn über Bildschirmrand
*
* FIXEDSYS dann zwangsweise umstellen
*
DO CASE
CASE abig[1] + apos[1] - oVTpAra:us_scrm_li > amax[1]
IF NumAt( "FIXEDSYS" , Upper(xx_font_input) ) # 0
xx_font_input := "12.COURIER NEW FETT"
ENDIF
LOOP
CASE abig[2] + apos[2] - oVTpAra:us_scrm_un > amax[2]
IF NumAt( "FIXEDSYS" , Upper(xx_font_input) ) # 0
xx_font_input := "12.COURIER NEW FETT"
ENDIF
LOOP
OTHERWISE
EXIT
ENDCASE
ENDDO
oDlx := XbpDialog():new( oParent , oOwner , aPos, abig , oLocal_style:sty_user , .T.)
oDlx:taskList := .T.
oDlx:sysmenu := .F.
oDlx:minButton := .F.
oDlx:maxButton := .F.
oDlx:clipChildren := .F.
oDlx:border := XBPDLG_SIZEBORDER
oDlx:title := agruppe[1,4] + oVtPara:cVersion
oDlx:setFontCompoundName( "&xx_font_input." )
oDlx:visible := .T.
oDlx:close := {|mp1,mp2,obj| obj:destroy() }
oDlx:create() // fenster wird angezeigt
oDlx:setModalState( XBP_DISP_APPMODAL )
CenterControl(oDlx)
drawingArea := oDlx:drawingArea
drawingArea:setFontCompoundName( "&xx_font_input." )
drawingArea:setColorBG( oVTpAra:us_scrbg )
drawingArea:setColorFG( oVTpAra:us_scrfg )
**** 1.
oXbp1 := XbpStatic():new( drawingArea , ,astart_st , abig_st , oLocal_style:sty_user)
oXbp1:caption := agruppe[1,3]
oXbp1:clipSiblings := .T.
oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
oXbp1:create() // Rahmen wird angezeigt
FOR i := 1 TO Len( ar_get )
DO CASE
CASE ar_get[i,6] < 299 // Editiere
***** Text setzen
IF ! Empty( ar_get[i,5] ) // nur wenn Inhalt
oXbp := XbpStatic():new( oXbp1, ,{ ar_get[i,1] , ar_get[i,2] + zzhoch *1.2 },{ zzbreit * Len(ar_get[i,5])+zzbreit , zzhoch } , oLocal_style:sty_user)
oXbp:caption := ar_get[i,5]
oXbp:clipSiblings := .T.
oXbp:options := XBPSTATIC_TEXT_VCENTER + XBPSTATIC_TEXT_LEFT
oXbp:create()
ENDIF
**** GET setzen
oXbp := XbpGet():new( oXbp1, ,{ ar_get[i,1] ,ar_get[i,2] },{ zzbreit * ar_get[i,6]+zzbreit , zzhoch * 1.2 } , oLocal_style:sty_sc_we)
oXbp:clipSiblings := .T.
oXbp:Picture := ar_get[i,4]
oXbp:Datalink := varBlock( @ar_get[i,3] )
IF Trim(ar_get[i,5]) == "Name"
oXbp:editable := .F.
ENDIF
oXbp:create()
CASE ar_get[i,6] = 300 // MemoString
abig_me[1] := ar_get[i,4,1]
abig_me[2] := ar_get[i,4,2]
oXbp := XbpStatic():new( oXbp1, ,{ ar_get[i,1] , ar_get[i,2] },{ abig_me[1]+8+zzbreit , abig_me[2]+8+zzhoch }, oLocal_style:sty_user)
oXbp:caption := ar_get[i,5]
oXbp:clipSiblings := .T.
oXbp:type := XBPSTATIC_TYPE_GROUPBOX
oXbp:options := XBPSTATIC_TEXT_TOP + XBPSTATIC_TEXT_LEFT
oXbp:create()
**** Memosetzen
oXbp := XbpMle():new( oXbp1, ,{ ar_get[i,1]+4, ar_get[i,2]+4},{ abig_me[1]+zzbreit , abig_me[2] } , , .T. )
oXbp:border := .T.
oXbp:editable := .F.
oXbp:horizScroll:= .F.
oXbp:vertScroll := .T.
oXbp:wordWrap := .T.
oXbp:ignoreTab := .F.
oXbp:undo := .T.
oXbp:Datalink := varBlock( @ar_get[i,3] )
oXbp:clipSiblings := .T.
oXbp:create():setData( ar_get[i,3] )
CASE ar_get[i,6] = 500 // nur Anzeige in EditFeld
***** Stat setzen
IF ! Empty(ar_get[i,5] )
oXbp := XbpStatic():new( oXbp1, ,{ ar_get[i,1] ,ar_get[i,2] + zzhoch *1.2},{ zzbreit * Len(ar_get[i,5])+zzbreit , zzhoch } , oLocal_style:sty_user)
oXbp:caption := ar_get[i,5]
oXbp:clipSiblings := .T.
oXbp:options := XBPSTATIC_TEXT_VCENTER + XBPSTATIC_TEXT_LEFT
oXbp:create()
ENDIF
***** Stat setzen
oXbp := XbpStatic():new( oXbp1, ,{ ar_get[i,1] ,ar_get[i,2]},{ zzbreit * Len(ar_get[i,4])+zzbreit , zzhoch } , oLocal_style:sty_sc_we )
oXbp:caption := ar_get[i,4]
oXbp:clipSiblings := .T.
oXbp:options := XBPSTATIC_TEXT_VCENTER + XBPSTATIC_TEXT_LEFT
oXbp:create()
CASE ar_get[i,6] = 1000 // nur Text zum anzeigen
***** Stat setzen
oXbp := XbpStatic():new( oXbp1, ,{ ar_get[i,1] ,ar_get[i,2]},{ zzbreit * Len(ar_get[i,5])+zzbreit , zzhoch } , oLocal_style:sty_user)
oXbp:caption := ar_get[i,5]
oXbp:clipSiblings := .T.
oXbp:options := XBPSTATIC_TEXT_VCENTER + XBPSTATIC_TEXT_LEFT
oXbp:create()
ENDCASE
NEXT i
**** Pushbutton einlesen
*
FOR i := 1 TO Len(apush)
oXbpu := XbpPushButton():new( drawingArea,,{abig[1]-8-p_gross[1]-8 , apush[i,2] },{p_gross[1],p_gross[2]*1.3} , oLocal_style:sty_user , apush[i,5] )
oXbpu:caption := apush[i,3]
oXbpu:clipSiblings := .T.
oXbpu:tabStop := .T.
oXbpu:create()
oXbpu:activate := apush[i,4]
NEXT i
**** XbpGetController-Objekt erzeugen
*
oCtrl := XbpGetController():new( oDlx )
oCtrl:create()
* READ beenden wenn Applikationsfenster geschlossen wird
* HINWEIS:
* Wenn ein XbpGetController Objekt mit einem Fenster verbunden ist,
* braucht das Fenster die :killRead() Methode nicht im :close Codeblock
* aufrufen. An dieser Stelle ist es erforderlich, weil oCtrl keine
* Kenntnis von SetAppWindow() hat. Wird der X-Button vom Applikations-
* fenster gedrückt, muß die Applikation beendet werden. :killRead()
* terminiert die Event-Schleife, die in oCtrl:read() läuft.
*SetAppWindow():close := {|| oCtrl:killRead() }
**** Beginne Eingabe in modalem Fenster bei 1. XbpGet
oCtrl:READ( 1 )
END SEQUENCE
oDlx:setModalState( XBP_DISP_MODELESS )
oCtrl:destroy()
oDlx:destroy()
SetAppWindow( oOwner )
SetAppFocus ( oOwner )
ASize(apush , 0 )
ASize(abig_st , 0 )
ASize(astart_st , 0 )
ASize(astart_e , 0 )
RETURN( ar_get )