Seite 1 von 1

XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 13:48
von Lutz Rübe
Moin, moin allerseits und frohe Ostern.

Ich habe mal wieder ein Verständnisproblem mit den xBase-Parts.

In meiner Funktion (Eingabe von Daten) werden zuerst anhand von (mindestens) einem XbpSle-Part Daten abgefragt. Anhand dieser Daten sollen in nachfolgenden Xbase-Parts Änderungen vorgenommen werden. Hier der Code des SLE's, anhand dessen das Array aTisch für die Verarbeitung in den nachfolgenden Parts aufgebaut werden soll:

Code: Alles auswählen

   oSLE_TiNr := XbpGet():new( drawingArea, , {o_Cols[2],o_Lines[2]}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSLE_TiNr:clipSiblings := .T.
   oSLE_TiNr:Picture := "@K 999"
   oSLE_TiNr:Datalink:= varBlock(@TiNr)
   oSLE_TiNr:postBlock        := { ||  TiNr <= MaxTi }
   oSLE_TiNr:preBlock         := { |o| MaxTi := Max_Tisch(ergSer),o:setData(),.t.}
   oSLE_TiNr:killinputfocus   := { ||  oCtrl:getData(),Basis_Browse_Array(aTisch), aTisch := Sel_Tisch(aTischLeer, ergSer, TiNr) }
   oSLE_TiNr:tabStop := .T.
   oSLE_TiNr:create()
Über killInputFocus soll das Array aTisch mit Daten gefüllt werden, die in den nachfolgenden SLE-Parts geändert und später wieder in der Dbf gespeichert werden sollen. Innerhalb der Funktion Sel_Tisch(aTisch, ergSer, TiNr) wird das Array korrekt aufgebaut. Aber wie bekomme ich jetzt das Array ausserhalb dieser Funktion, damit es in den folgenden Xbase-Parts korrekt (als Vorgabe) verarbeitet werden kann ?

:banghead: :banghead: :banghead:

Viele Grüße
Lutz

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 14:55
von Werner_Bayern
Servus Lutz,

Dir auch frohe Ostern :)

Ich gehe davon aus, dass aTisch ein lokales Array ist? Damit brauchst Du im KillinputFocus nur mittels setData() die anderen XbpSLEs füttern.

Code: Alles auswählen

oSLE_TiNr:killinputfocus   := { ||  oCtrl:getData(),Basis_Browse_Array(aTisch), aTisch := Sel_Tisch(aTischLeer, ergSer, TiNr), eval({||oSLE_TIFrei1:setData(aTisch[1]), oSLE_TIFrei2:setData(aTisch[2])}) }

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 16:58
von Lutz Rübe
Hallo Werner,

Super ! :hello1: :hello1: :hello1:
Das klappt wunderbar, genau wie gewünscht.

Hast Du vielleicht noch einen Idee bzw. einen Tip zu diesem Punkt: Ich möchte Teile des Array nur als Information anzeigen, aber nicht editieren. Normalerweise übergebe ich die Werte über die :cargo-Instanz in einem Static-xBase-Part.

Als "unsaubere" Lösung empfände ich es, wenn ich die Variable in einem nicht editierbaren SLE übergeben würde..... Gibt es da eine elegantere Lösung ?

Danke nochmal mit dem Hinweis. Er hat das Hauptproblem gelöst.

Gruß
Lutz

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 17:58
von Dominik Krebs
Hallo,
Ist die XbpGet Klasse eine eigene? Die sagt mir nämlich gar nichts? 😮

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 18:07
von Lutz Rübe
Hallo Dominik,
die XbpGet-Klasse ist abgeleitet vom XbpSle und unter "SOURCE\Samples\Solution" als fertig abgeleitet Klasse zu finden.

Ich versuche immer gerne die unter den Samples angebotenen Lösungen zu nutzen und zu implementieren.

Gruß
Lutz

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 19:20
von Werner_Bayern
Bitte. 8)
Lutz Rübe hat geschrieben: Mo, 05. Apr 2021 16:58 Hast Du vielleicht noch einen Idee bzw. einen Tip zu diesem Punkt: Ich möchte Teile des Array nur als Information anzeigen, aber nicht editieren. Normalerweise übergebe ich die Werte über die :cargo-Instanz in einem Static-xBase-Part.
Vermutlich verstehe ich Dich falsch, aber dafür gibt's doch das XbpStatic und :setCaption()? Oder XbpFormattedLabel() aus dem Xbppack2.

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 19:36
von Lutz Rübe
Hallo Werner,

sorry, mein Fehler: ich habe statt :caption() :cargo() geschrieben. Das hat sicherlich zur Verwirrung geführt.

Ja, ich möchte einem XbpStatic-Part über :caption einen Anzeigewert zuweisen. Der anzuzeigende Wert wurde aber über die killInputFocus-Funktion im Objekt oSLE_TINr ermittelt und in die Variable aTisch eingefügt. Hier die Umsetzung wie sie mit Deinem Hinweis für SLE's umgesetzt wird und erfolgreich funktioniert:

Code: Alles auswählen

   oSLE_TiNr:killinputfocus   := { ||  oCtrl:getData(), aTiVis := Sel_Tisch(aTischLeer, ergSer, TiNr, aTiVis),eval({|| ;
         oSLE_STNR_1:setData(aTisch[2,1]),;
         oSLE_STNR_2:setData(aTisch[2,2]),;
         oSLE_STNR_3:setData(aTisch[2,3]),;
         oSLE_STNR_4:setData(aTisch[2,4]),;
         oCombo_Name_1:setData(AllTrim(aTisch[5,1])),;
         oCombo_Name_2:setData(AllTrim(aTisch[5,2])),;
         oCombo_Name_3:setData(AllTrim(aTisch[5,3])),;
         oCombo_Name_4:setData(AllTrim(aTisch[5,4])),;
         o_1_GPkte:setData(aTisch[15,1]),;
         o_2_GPkte:setData(aTisch[15,2]),;
         o_3_GPkte:setData(aTisch[15,3]),;
         o_4_GPkte:setData(aTisch[15,4]);
         }) }
Das Array aTisch enthält aber auch Werte (in der Funktion Sel_Tisch() ermittelt), die per XbpStatic angezeigt werden sollen:

Code: Alles auswählen

   oStat_Status_1 := XbpStatic():new( drawingArea, , {o_Cols[2]+40,o_Lines[5]}, {36,24}, { { XBP_PP_BGCLR, -255 }, { XBP_PP_COMPOUNDNAME,   } } )
   oStat_Status_1:caption := AllTrim(aTisch[3,1])+AllTrim(aTisch[4,1])
   oStat_Status_1:clipSiblings := .T.
   oStat_Status_1:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_CENTER
   oStat_Status_1:create()
Brauche ich dafür auch einen Codeblock ? Wenn ja, wie sieht dieser aus ? Das Arbeiten mit Codeblöcken ist mein Schwachpunkt...


Gruß
Lutz

Re: XbpSle und killInputFocus

Verfasst: Mo, 05. Apr 2021 20:37
von Werner_Bayern
Servus Lutz,

Code: Alles auswählen

oStat_Status_1:setCaption("was immer Du willst!")

Re: XbpSle und killInputFocus

Verfasst: Di, 06. Apr 2021 22:30
von Dominik Krebs
Hallo Lutz,
Danke für die Info. Schaue ich mir doch glatt mal an!

Re: XbpSle und killInputFocus

Verfasst: Mi, 07. Apr 2021 10:35
von Lutz Rübe
Hallo Werner,
ich sehe schon, ich habe mich mal wieder total mißverständlich ausgedrückt. :banghead: :banghead:

Ich versuche es einmal anders zu erklären:

Ich habe folgende 3 xBase-Parts:

Part 1: Hier wird ein Parameter abgefragt (z. B. eine Kundennummer). Anhand dieses Parameters werden alle Datensätze, die den Kriterien in einer DBF gesucht und bestimmte Werte werden in ein 2 dimensionales Array eingefügt (killInputFocus). Teile dieses Arrays sollen in einem SLE-Part angezeigt werden und editierbar sein, andere Teile in einem Static-Part nur angezeigt werden.

Part 2: in diesem Objekt (SLE), Combobox etc.) wird über DataLink ein Wert aus dem Array angezeigt und ist editierbar.

Part3: in diesem Objekt (XbpStatic) sollen Werte des Arrays über die Funktion :caption angezeigt werden.

Part 1 und Part 2 funktionieren dank Deiner Hilfe einwandfrei. Nur wenn ich beim Static-Part unter :caption := Array[x,y] angebe, wird mir der Inhalt des Arras[x,y] nicht angezeigt. Was mache ich hier falsch ?

Ich hoffe, dass ich mich jetzt deutlicher ausgedrückt habe.

Viele Grüße
Lutz

Re: XbpSle und killInputFocus

Verfasst: Mi, 07. Apr 2021 11:06
von Martin Altmann
Lutz,
wenn du die Caption ändern willst, nachdem das Static erzeugt wurde, musst du SetCaption() dafür nehmen (wie Werner in seinem Source-Schnipsel). Ansonsten müsstest du nach dem ändern der Caption noch ein Configure() für das Static absetzen.

Viele Grüße,
Martin

Re: XbpSle und killInputFocus

Verfasst: Mi, 07. Apr 2021 11:35
von Lutz Rübe
Oh da bitte ich vielmals um Entschuldigung. Das 'set' von setcaption habe ich doch glatt überlesen.

Vielen Dank an alle Mitwirkenden.
Damit kann dann dieser threat geschlossen werden.

Einen schönen Tag noch
Lutz