Seite 1 von 1

beispiel xbpsle() [ERLEDIGT]

Verfasst: Fr, 18. Aug 2017 8:19
von Manfred
in dem Alaska Beispiel werden 2 SLE nacheinander in oXbp geschrieben. Irgendwie habe ich ein Brett vor dem Kopf und verstehe nicht, wie ich an die einzelnen SLE später drankomme? Wo steht dieses Paket drin? Also, wie könnte ich z.B. den Inhalt eines SLE von "außen" ändern, wenn ich gar nicht weiß, wie ich es ansprechen soll/muß? Steht ja alles in oXbp drin, oder?

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 8:25
von georg
Hallo, Manfred -


die beiden XbpSLE-Objekte existieren in ihrem Kontext, d.h. sie haben z.B. einen Parent. Wenn Du den Parent nimmst und die Methode :childList() ausführst, bekommst Du eine Referenz auf die beiden XbpSLE.

Alaska hätte sicherlich mit oXbp1 und oXbp2 arbeiten können, aber der Ansatz, immer wieder das gleiche LOCAL zu verwenden zeigt, dass ein Objekt nicht an die Variable gebunden ist, mittels derer das Objekt erzeugt wurde.

Ich gehe normalerweise hin und erzeuge ein Array aEntries, zu dem ich nach dem Erzeugen eines Xbase-Parts die Objekt-Referenz hinzufüge:

Code: Alles auswählen

aEntries := {}
oXbp := XbpSLE():new(...)
...
oXbp:create()
AAdd(aEntries, oXbp)
oXbp := XbpMLE():new(...)
...
oXbp:create()
AAdd(aEntries, oXbp)
Später arbeite ich aEntries (analog zu GETLIST) ab.

Hilft das, den Knoten im Kopf zu lösen?

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 8:26
von Martin Altmann
Moin,
ich weiß jetzt nicht von welchem Beispiel Du genau sprichst - aber Alaska macht das i.A. in den Beispielen so, dass sie die editierbaren Controls (also auch die XbpSle) einem Array zuweisen (editcontrols). Darüber kämst Du dann ran.

Viele Grüße,
Martin

Georg war ein Tick schneller...

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 8:32
von Manfred
ich meine das direkte Beispiel für XbpSle() 1.90 was unten aufgeführt wird. Da sehe ich nichts von einem Array. Das mit dem parent dachte ich auch schon, aber da ist keiner explizit zugeordnet.
Ich habe der Zeit das Problem, dass ich in einer Pauschalroutine, (die ein Array übergeben bekommt, aus dem dann Xbp erstellt werden) Eingabefelder habe, die ich von außerhalb ändern möchte und dann mit Setdata() aktualisiert werden sollen. Ich weiß aber nicht, wie ich an das jeweilige Eingabefeld kommen soll. Bisher war ich gewohnt sowas in einem getlist zu haben, aber......

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 8:36
von Martin Altmann
Die getlist entspricht der von Georg und mir erwähnten Array-Variante - ist nichts anderes damals gewesen!
Du kannst auch (wie von Georg vorgeschlagen) dich von oben kommend durchhangeln.

Viele Grüße,
Martin

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 8:36
von Manfred
OK,
Du hast gewonnen. Das mit dem Parent bin ich wohl falsch angegangen. Das scheint aber zu klappen. Ich muß mir nur ausklamüsern, an welcher Stelle die stehen. Also erst den Parent ermitteln und dann über Childlist() den rest und dann suchen.
OOPs, habe in der Hektik gar nicht Georgs Beitrag gesehen. Quark, habe ich doch, aber Dir zugeordnet und erst gar nicht verstanden.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:14
von georg
Hallo, Manfred -


der Weg über die childList() ist aus meiner persönlichen Sicht nicht optimal, besonders dann, wenn Du andere Elemente wie XbpStatic einsetzt, oder mal eine XbpTabPage, dann wird es schnell unhandlich.

Ich habe eine eigene Klasse MyXbpSLE, in der es z.B. eine Instanzvariable gibt, die mir den Namen der Datenbank-Spalte liefert. Dadurch bin ich von der Reihenfolge unabhängig.

Also etwa so:

Code: Alles auswählen

aEntries := {}
oXbp := MyXbpSLE():new()
...
oXbp:fieldName := "Kundenname"
oXbp:create()
AAdd(aEntries, oXbp)

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:27
von Manfred
Hi Georg,
ich habe im Moment keine andere Wahl. Das Projekt war fertig und muß jetzt nach und nach umgebaut werden. Da stehe ich manchmal vor einem Scherbenhaufen und muß vorsichtig ohne Handschuhe die Sachen einsammeln.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:37
von Manfred
Bevor wir uns jetzt total verhaspeln hier der Code
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 )

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:44
von Jan
Manfred,

ich selber mache das so, wie Georg erwähnt hatte: Jedes XbPart bekommt seinen eigenen Namen, wenn ich da später nochmal irgendwie drauf zugreifen muß. Ich finde das so einfacher mit den persönlichen Namen. Aber das ist natürlich eine Frage der Gewohnheit.

Wenn ich einfach nur eine Reihe von Statics untereinander anzeigen möchte, dann bekommen die alle entweder den gleichen Namen, oder überhaupt keinen. Da mach ich dann keinen großen Verwaltungsakt drum.

Jan

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:46
von Martin Altmann
Was ist oVtPara? Ein Objekt? Kannst Du damit was anfangen?

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:47
von Manfred
ovtpara ist ein PUBLIC Objekt, in dem alle Programparameter stehen.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 9:56
von Martin Altmann
Erweitere das oVtPara um eine Membervariable (z.B. oXbp) und weißt ihr beim Erzeugen das von Dir gewünschte Objekt zu (wenn Du in deinem Array im siebten Element (bisher sind es nur sechs!) ein true steht. Dann kannst Du oVtPara:oXbp als Parameter nutzen.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 10:05
von Manfred
greife ich denn dann direkt auf das Objekt zu, wenn ich z.B. den Wert davon ändern möchte? Ich will ihn ja von "außen" manipulieren.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 10:13
von Manfred
scheint zu klappen. Programmiere es eben zuende. Und ichd achte ich käme nur auf so schräge Ideen.....

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: Fr, 18. Aug 2017 12:24
von Manfred
ich habe das mal auf erledigt gesetzt, auch wenn mir der Weg nicht so ganz gefällt. Aber der Weg ist ja bekanntlich das Ziel.

Re: beispiel xbpsle()

Verfasst: Fr, 18. Aug 2017 13:06
von Werner_Bayern
georg hat geschrieben: Fr, 18. Aug 2017 9:14 Ich habe eine eigene Klasse MyXbpSLE, in der es z.B. eine Instanzvariable gibt, die mir den Namen der Datenbank-Spalte liefert.
oder mit :setname()

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: Fr, 18. Aug 2017 15:01
von georg
Hallo, Werner -


das ist korrekt, aber ich habe nur eine Instanzvariable (neben etlichen abgeleiteten Methoden) als Beispiel aufgeführt.

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: Fr, 18. Aug 2017 15:30
von Jan
Ich hab solche individuellen Bezeichnungen früher immer gerne über :cargo geregelt, ähnlich wie eine Parameter-Übergabe. Natürlich nicht so elegant wie :setname(), aber das gibt es glaube ich auch noch nicht ganz so lange.

Jan

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: Fr, 18. Aug 2017 16:47
von georg
Hallo, Jan -


:cargo gibt es schon seit .... Xbase/2?

Aber wie auch schon vorher geschrieben, ich leite in meinen Klassen auch Methoden wie :handleEvent() ab.

:cargo ist nett, aber wenn man an zu vielen Stellen mit unterschiedlichen Definitionen ("gewachsener Code") auf :cargo zugreift, wird es wuschelig. Das vermeide ich mit eigenen Klassen. Aber wir schweifen ab.

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: Sa, 19. Aug 2017 20:49
von AUGE_OHR
Manfred hat geschrieben: Fr, 18. Aug 2017 12:24ich habe das mal auf erledigt gesetzt, auch wenn mir der Weg nicht so ganz gefällt. Aber der Weg ist ja bekanntlich das Ziel.
... und was ich mit einer 3th Person die sich in den Code einlesen soll ... :-"

o:Cargo / o:Setname() (seit 1.9x) oder jedes Object anders benennen finde ich einfacher "zu suchen" als wenn ich so was debuggen soll.

Code: Alles auswählen

aChild := o:Childlist
nPosi  := ASCAN(aChild,oObject)
oXbp   := aChild[nPosi]
... aber ich will dich nicht belehren wenn es auch so funktioniert.

Re: beispiel xbpsle() [ERLEDIGT]

Verfasst: So, 20. Aug 2017 8:56
von Manfred
Hi Jimmy,
Du hast da vollkommen recht. Aber es ist ein Projekt, was ich übernommen habe (also 3th Person bin ich dan in dem Fall, die sich manchmal echt wundert und ärgert) und was nach und nach umgebaut wird. Aber eben sehr langsam.