beispiel xbpsle() [ERLEDIGT]
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
beispiel xbpsle() [ERLEDIGT]
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!!
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!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: beispiel xbpsle()
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:
Später arbeite ich aEntries (analog zu GETLIST) ab.
Hilft das, den Knoten im Kopf zu lösen?
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)
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: beispiel xbpsle()
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...
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...
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.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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......
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!!
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!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: beispiel xbpsle()
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
Du kannst auch (wie von Georg vorgeschlagen) dich von oben kommend durchhangeln.
Viele Grüße,
Martin
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.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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.
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!!
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!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: beispiel xbpsle()
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:
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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.
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
Bevor wir uns jetzt total verhaspeln hier der Code
zuerst der, in dem ich die Daten für die Eingabemaske zusammenbaue.
jetzt der, in dem die Eingabemaske erzeugt wird.
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
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!!
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!!
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: beispiel xbpsle()
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: beispiel xbpsle()
Was ist oVtPara? Ein Objekt? Kannst Du damit was anfangen?
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.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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!!
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!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: beispiel xbpsle()
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.
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.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle()
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle() [ERLEDIGT]
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!!
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!!
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: beispiel xbpsle()
oder mit :setname()
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: beispiel xbpsle() [ERLEDIGT]
Hallo, Werner -
das ist korrekt, aber ich habe nur eine Instanzvariable (neben etlichen abgeleiteten Methoden) als Beispiel aufgeführt.
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: beispiel xbpsle() [ERLEDIGT]
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: beispiel xbpsle() [ERLEDIGT]
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.
: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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: beispiel xbpsle() [ERLEDIGT]
... 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]
gruss by OHR
Jimmy
Jimmy
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: beispiel xbpsle() [ERLEDIGT]
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.
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!!
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!!