beispiel xbpsle() [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

beispiel xbpsle() [ERLEDIGT]

Beitrag 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?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: beispiel xbpsle()

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

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: beispiel xbpsle()

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

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag 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......
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: beispiel xbpsle()

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

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: beispiel xbpsle()

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

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag 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 )
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: beispiel xbpsle()

Beitrag von Martin Altmann »

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

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag von Manfred »

ovtpara ist ein PUBLIC Objekt, in dem alle Programparameter stehen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: beispiel xbpsle()

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

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle()

Beitrag von Manfred »

scheint zu klappen. Programmiere es eben zuende. Und ichd achte ich käme nur auf so schräge Ideen.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: beispiel xbpsle()

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

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag von georg »

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 S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: beispiel xbpsle() [ERLEDIGT]

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

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: beispiel xbpsle() [ERLEDIGT]

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten