Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

beispiel xbpsle() [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

beispiel xbpsle() [ERLEDIGT]

Beitrag von Manfred » Fr, 18. Aug 2017 8:19

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?
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: beispiel xbpsle()

Beitrag von georg » Fr, 18. Aug 2017 8:25

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?
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Martin Altmann » Fr, 18. Aug 2017 8:26

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...
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 8:32

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......
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Martin Altmann » Fr, 18. Aug 2017 8:36

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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 8:36

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.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: beispiel xbpsle()

Beitrag von georg » Fr, 18. Aug 2017 9:14

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)
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 9:27

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.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 9:37

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 )
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12298
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Jan » Fr, 18. Aug 2017 9:44

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Martin Altmann » Fr, 18. Aug 2017 9:46

Was ist oVtPara? Ein Objekt? Kannst Du damit was anfangen?
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 9:47

ovtpara ist ein PUBLIC Objekt, in dem alle Programparameter stehen.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Martin Altmann » Fr, 18. Aug 2017 9:56

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.
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 10:05

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.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle()

Beitrag von Manfred » Fr, 18. Aug 2017 10:13

scheint zu klappen. Programmiere es eben zuende. Und ichd achte ich käme nur auf so schräge Ideen.....
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von Manfred » Fr, 18. Aug 2017 12:24

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.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1293
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: beispiel xbpsle()

Beitrag von Werner_Bayern » Fr, 18. Aug 2017 13:06

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()
es grüßt euch

Werner

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von georg » Fr, 18. Aug 2017 15:01

Hallo, Werner -


das ist korrekt, aber ich habe nur eine Instanzvariable (neben etlichen abgeleiteten Methoden) als Beispiel aufgeführt.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12298
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von Jan » Fr, 18. Aug 2017 15:30

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von georg » Fr, 18. Aug 2017 16:47

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.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10573
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von AUGE_OHR » Sa, 19. Aug 2017 20:49

Manfred hat geschrieben:
Fr, 18. Aug 2017 12:24
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.
... 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.
gruss by OHR
Jimmy

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von Manfred » So, 20. Aug 2017 8:56

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.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Antworten