PushButton

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

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

PushButton

Beitrag von Manfred »

Hi,

im Moment brummt mir der Kopf.

Bevor ich jetzt unendlich viel Zeit verheize, eine Frage:

Ich lade die gesamten Felder einer DB in Speichervariablen, bearbeite sie und speichere sie dann wieder zurück in die DB. So weit, so gut.

Jetzt habe ich mein neues Steckenpferd entdeckt, die GUI. :-)

Also versuche ich es jetzt auf dem Weg. Ich habe SLE Spinbutton und Comboboxen gebaut. Alles möchte ich jetzt über Pushbutton regeln, komme aber nicht weiter. Ich möchte z.B. bei dem Button vorwärts einen Skip durch die DB machen und dann die Daten wieder in die Varias einlesen und sie dann am Bildschirm anzeigen lassen. Die Beispiele arbeiten immer direkt mit den Feldern und erfordern einen Exclusivezugriff.

Bevor jetzt hier die große Diskussion los geht, möchte ich zuerst einmal wissen, ob das überhaupt so geht, wie ich es vorhabe? Ich habe im Moment keinen Plan, wie ich das bauen muß, damit es so klappt, wie es im Textmodus klappt -> Skip, Felder einlesen, anzeigen.

Stell ich mich wieder blöd an? :-(
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: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Manfred,

wenn ich Dich richtig verstehe möchtest Du wissen, wie Du mit dem Druck auf einen PushButton eine Aktion ausführst?

Das ist eigentlich relativ einfach: oButton:activate := {|| funktion1, funktion2,...}. Wobei Funktion1, 2 und... beliebige Funktionen sind, eigene oder eingebaute.

Das könnte also bei so aussehen:
oButton:activate := {|| MeinFunc()}. Und in MeinFunc() schreibst Du das rein, was da passieren soll. Ist jedenfalls übersichtlicher wenn Du mehrere Sachen machen möchtest. Einfach nur ein Skippen geht besser so: oButton:activate := {|| DBSkip()}

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
dafür gibt es die internen Funktionen gather() und scatter(), denen Du ein Array mit Deinen Xbase++-Parts übergibst! Erstere schreibt in die Datenbank und letztere liest aus der Datenbank.
Siehe dazu auch das Beispiel zu gather() in der Doku:

Code: Alles auswählen

oXbp1 := XbpStatic():new( drawingArea, , {12,48}, {300,96} ) 
oXbp1:caption := "Customer" 
oXbp1:type := XBPSTATIC_TYPE_GROUPBOX 
oXbp1:create() 

oXbp := XbpStatic():new( oXbp1, , {12,48}, {72,24} ) 
oXbp:caption := "Lastname:" 
oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT 
oXbp:create() 

oXbp := XbpSLE():new( oXbp1, , {96,48}, {192,24} ) 
oXbp:bufferLength := 20 
oXbp:tabStop := .T. 
oXbp:dataLink := {|x| IIf( PCount()==0, ; 
                           Trim( CUSTOMER->LASTNAME ), ; 
                           CUSTOMER->LASTNAME := x ) } 

oXbp:create():setData()

AAdd( ::aEditControls, oXbp )

oXbp := XbpPushButton():new( drawingArea, , {12,12}, {72,24} ) 
oXbp:caption := "Vor" 
oXbp:create() 
oXbp:activate := {|| Gather( ::aEditControls ), ; 
                     CUSTOMER->( DbSkip( 1) ), ; 
                     Scatter( ::aEditControls ) }
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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jan,

ich bin ein bisschen blöd. Kann ich "beliebig" viele Funcs hintereinander mit Komma getrennt eingeben? Ich habe das beispiel mit gather und Scatter gefunden, blicke aber nicht wirklich da durch, sondern lebe nur von Vermutungen. :roll:

Ich komme nicht drauf, wie ich alle Felder wieder angezeigt bekomme. Muß ich die alle einzeln aufrufen (über eben eine Func), oder gibt es da einen Refresh Befehl, oder wie darf ich das verstehen?
Die Felder sind ja in einem Parent. Muß man damit irgendwas machen?

Frage über Fragen.
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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hier mal der Code

Code: Alles auswählen

METHOD ankaufpreisparameter:maskeGui()
       LOCAL nEvent, mp1, mp2
       LOCAL nPBAbstand    := 20
       LOCAL nPBAnfang     := 35
       LOCAL nAbzugHoehe
       LOCAL nDlgBreite    := 900
       LOCAL nDlgHoehe     := 470
       LOCAL nGruppeBreite := nDlgBreite - 10
       LOCAL nGruppeHoehe  := nDlgHoehe - 10
       LOCAL nTextbreite
       LOCAL nPBBreite
       LOCAL oXbp

       ::oAKPDlg          := XbpDialog():new(SetAppWindow(),,,{nDlgBreite,nDlgHoehe},,.F.)
       ::oAKPDlg:titlebar := .F.
       ::oAKPDlg:create()
       CenterControl(::oAKPDlg)
       ::oAKPDlg:show()                                                           // nachdem es positioniert wurde

       ::oButtonGroup         := XbpStatic():new(::oAKPDlg,,{0,0},{nGruppeBreite,50})
       ::oButtonGroup:type    := XBPSTATIC_TYPE_GROUPBOX
       ::oButtonGroup:create()

       nPbBreite        := 70
       ::oPbNeu         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbNeu:caption := "~Neu"
       ::oPBNeu:tabStop := .T.
       ::oPbNeu:create()

       nPBAnfang           += nPBBreite + nPBAbstand
       ::oPbSuchen         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbSuchen:caption := "~Suchen"
       ::oPBSuchen:tabStop := .T.
       ::oPbSuchen:create()
       ::oPbSuchen:activate := {|| ::oSle1:disable()}

       nPBAnfang         += nPBBreite + nPBAbstand
       ::oPbEdit         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbEdit:caption := "Ä~ndern"
       ::oPBEdit:tabStop := .T.
       ::oPbEdit:create()

       nPBAnfang        += nPBBreite + nPBAbstand
       ::oPbTop         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbTop:caption := "<<"
       ::oPBTop:tabStop := .T.
       ::oPbTop:create()

       nPBAnfang     += nPBBreite + nPBAbstand
       ::oPbvw         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbvw:caption := "<"
       ::oPBvw:tabStop := .T.
       ::oPbvw:create()

       nPBAnfang     += nPBBreite + nPBAbstand
       ::oPbrw         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbrw:caption := ">"
       ::oPBrw:tabStop := .T.
       ::oPbrw:create()

       nPBAnfang         += nPBBreite + nPBAbstand
       ::oPbBottom         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbBottom:caption := ">>"
       ::oPBBottom:tabStop := .T.
       ::oPbBottom:create()

       nPBAnfang       += nPBBreite + nPBAbstand
       ::oPbSave         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbSave:caption := "S~peichern"
       ::oPBSave:tabStop := .T.
       ::oPbSave:create()

       nPBAnfang          += nPBBreite + nPBAbstand
       ::oPbEnde          :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbEnde:caption  := "~Ende"
       ::oPBEnde:tabStop  := .T.
       ::oPbEnde:create()

       ::oGruppe         := XbpStatic():new(::oAKPDlg,,{1,1},{nGruppeBreite,nGruppeHoehe})
       ::oGruppe:caption := "Parametereingabe für Ankaufpreisermittlung über das System"
       ::oGruppe:type    := XBPSTATIC_TYPE_GROUPBOX
       ::oGruppe:create()

       nTextbreite       := 200
       nAbzughoehe       := 50
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Bezeichnung des Parameters:"
       ::oStatic:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSle1              := XbpSLE():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe,},{650,20})
       ::oSle1:bufferlength := 80
       ::oSle1:tabStop      := .T.
       ::oSle1:dataLink     := {|x| IIF(x==NIL , ::bez, ::bez := x)}
       ::oSle1:create():setData()

       nTextbreite     := nDlgBreite-20
       nAbzugHoehe     += 30
       ::oBlock          := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,25})
       ::oBlock:options  := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oBlock:type     := 1+13
       ::oBlock:create()

      ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,25})
      ::oStatic:caption := "Es werden zuerst die vergangenen Tage seit der Veröffentlichung des Titels geprüft:"
      ::oStatic:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
      ::oStatic:create()

       nTextBreite     := 700
       nAbzugHoehe     += 30
      ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
      ::oStatic:caption := "Wenn das Veröffentlichungsdatum des VO 1) weniger, oder 2) mehr als diese Tage zurückliegt:"
      ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
      ::oStatic:create()

      ::oSB1              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
      ::oSB1:tabStop      := .T.
      ::oSb1:setNumLimits( 1, 999 )
      ::oSB1:dataLink     := {|x| IIF(x==NIL , ::tagevoe, ::tagevoe := x)}
      ::oSB1:create()
      ::oSB1:setData()

       nAbzugHoehe     += 20
      ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
      ::oStatic:caption := "Dann wird bei 1) vom VKGBR/HAP ein Prozentsatz geboten, von:"
      ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
      ::oStatic:create()

      ::oSB2              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
      ::oSB2:tabStop      := .T.
      ::oSb2:setNumLimits( 1, 99 )
      ::oSB2:dataLink     := {|x| IIF(x==NIL , ::prozent1,::prozent1 := x)}
      ::oSB2:create()
      ::oSB2:setData()

       nAbzugHoehe     += 20
      ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
      ::oStatic:caption := "oder wird bei 2) vom VKGBR/HAP ein Prozentsatz geboten, von:"
      ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
      ::oStatic:create()

      ::oSb3              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
      ::oSb3:tabStop      := .T.
      ::oSb3:setNumLimits( 1, 99 )
      ::oSb3:dataLink     := {|x| IIF(x==NIL , ::prozent2,::prozent2 := x)}
      ::oSb3:create()
      ::oSb3:setData()

       nAbzugHoehe     += 30
       nTExtBreite     := nDlgBreite-20
       ::oBlock          := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,25})
       ::oBlock:options  := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oBlock:type     := 1+13
       ::oBlock:create()

       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,25})
       ::oStatic:caption := "Als nächstes wird der aktuelle Bestand geprüft:"
       ::oStatic:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       nAbzugHoehe     += 30
       nTExtBreite     := 700
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Wenn der VO-Bestand 3) bei einer maximalen Stückzahl liegt von:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSB4              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
       ::oSB4:clipSiblings := .T.
       ::oSB4:tabStop      := .T.
       ::oSb4:setNumLimits( 1, 999 )
       ::oSB4:dataLink     := {|x| IIF(x==NIL , ::bestand3, ::bestand3 := x)}
       ::oSB4:create()
       ::oSB4:setData()

       nAbzugHoehe     += 20
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Dann wird entweder von 1) oder von 2) ein Prozentsatz geboten von:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSb5              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
       ::oSb5:tabStop      := .T.
       ::oSb5:setNumLimits( 1, 99 )
       ::oSb5:dataLink     := {|x| IIF(x==NIL , ::prozent3,::prozent3 := x)}
       ::oSb5:create()
       ::oSb5:setData()

       nAbzugHoehe     += 20
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "4) Wenn der VO-Bestand höher liegt als bei 3), dann wird von 3) ein Prozentsatz geboten von:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSb6              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
       ::oSb6:tabStop      := .T.
       ::oSb6:setNumLimits( 1, 99 )
       ::oSb6:dataLink     := {|x| IIF(x==NIL , ::prozent4,::prozent4 := x)}
       ::oSb6:create()
       ::oSb6:setData()

       nAbzugHoehe     += 20
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Dieser Prozentsatz 4) wird dann bei jedem weiteren VO-Gebot von dem vorherigen VO-Gebot solange"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       nAbzugHoehe     += 20
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "folgend abgezogen, bis ein Mindestbetrag in CENT erreicht ist, in Höhe von:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSB7              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
       ::oSB7:tabStop      := .T.
       ::oSb7:setNumLimits( 1, 99 )
       ::oSB7:dataLink     := {|x| IIF(x==NIL , ::mingebot, ::mingebot := x)}
       ::oSB7:create()
       ::oSB7:setData()

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hier der Rest

Code: Alles auswählen

       nAbzugHoehe     += 20
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Höhe des Rundungsbetrages nach dem Komma in CENT eingeben:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSB8              := XbpSpinButton():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{40,20})
       ::oSB8:tabStop      := .T.
       ::oSb8:setNumLimits( 10, 50 )
       ::oSB8:dataLink     := {|x| IIF(x==NIL , ::rundenauf, ::rundenauf := x)}
       ::oSB8:create()
       ::oSB8:setData()

       nAbzugHoehe     += 30
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "System, für das dieser Parameter gelten soll:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oComboBox          := XbpComboBox():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{100,20})
       ::oComboBox:markMode := XBPLISTBOX_MM_SINGLE
       ::oComboBox:create()

       nAbzugHoehe     += 30
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Genre, für die dieser Systemparameter gelten soll:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       nAbzugHoehe     += 30
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Soll dieser Parameter deaktiviert werden?:"
       ::oStatic:options := XBPSTATIC_TEXT_RIGHT+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oChkBox          := XbpCheckBox():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe},{20,20})
       ::oChkBox:dataLink := {|x| IIF(x==NIL , ::gesperrt, ::gesperrt := x)}
       ::oChkBox:create()
       ::oChkBox:setData()

       nEvent := 0
       DO WHILE .T.
          nEvent := AppEvent( @mp1, @mp2, @oXbp)
          oXbp:HandleEvent( nEvent, mp1, mp2 )
       ENDDO .T.
       altd()
       ::oAkPDlg:destroy()
RETURN self
Das teil als solches klappt, alles initialisiert, mit init usw. usw. Ich komme in die Felder rein, wenn ich sie mit der Maus anwähle. Die Pushbuttons kriege ich aber nicht mit der Maus, oder mit den Hotkeys angesprochen.
Zuletzt geändert von Manfred am Mi, 31. Mai 2006 20:32, insgesamt 1-mal geändert.
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:Ich komme nicht drauf, wie ich alle Felder wieder angezeigt bekomme. Muß ich die alle einzeln aufrufen (über eben eine Func), oder gibt es da einen Refresh Befehl, oder wie darf ich das verstehen?
im Prinzip musst Du einfach nur alle Deine Xbase++-Parts, die Daten aus Deiner Datenbank enthalten in das Array schreiben. Wann immer Du die Daten aus Deinem Array in die Datenbank schreiben willst, nimmst Du dafür die Funktion gather(). Wann immer Du Deine Editierfelder mit den Daten aus Deiner Datenbank füllen willst, nimmst Du dafür die Funktion scatter().
Schau Dir in dem Beispiel den Knopf "Vor" an: Er schreibt die Eingaben in den aktuellen Satz, geht auf den nächsten Satz und liest die Daten in die Editierfelder ein.

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi martin,

das hatte ich schon mal probiert, aber wie kriege ich die Daten wieder auf den Bildschirm?
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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Werden die ganzen Sle und Spinbutton und Combobox Objekte in das Array geschrieben?
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
definiere Dir eine Klassenvariable (Bsp.: aEditControls).
In Deiner Methode maskeGUI() initialisierst Du sie am Anfang:

Code: Alles auswählen

::aEditControls := {}
Nach jeder einzelnen Zeile mit einem :SetData() fügst Du das entsprechende Objekt Deinem Array hinzu:

Code: Alles auswählen

aadd( ::aEditControls, ::oSle1 )
aadd( ::aEditControls, ::oSB1 )
Für Deine Knöpfe zum Blättern nutzt Du den o.g. Code.
Wichtig! Du gehst momentan in Deinen Datalinks auf Variablen - Du musst aber in dem Fall direkt auf die Felder in der Datenbank gehen (s. a. in dem von mir geposteten Beispiel)!!!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,
Martin Altmann hat geschrieben:Hallo Manfred,
definiere Dir eine Klassenvariable (Bsp.: aEditControls).
In Deiner Methode maskeGUI() initialisierst Du sie am Anfang:

Code: Alles auswählen

::aEditControls := {}
Nach jeder einzelnen Zeile mit einem :SetData() fügst Du das entsprechende Objekt Deinem Array hinzu:

Code: Alles auswählen

aadd( ::aEditControls, ::oSle1 )
aadd( ::aEditControls, ::oSB1 )
Für Deine Knöpfe zum Blättern nutzt Du den o.g. Code.
Wichtig! Du gehst momentan in Deinen Datalinks auf Variablen - Du musst aber in dem Fall direkt auf die Felder in der Datenbank gehen (s. a. in dem von mir geposteten Beispiel)!!!

Viele Grüße,
Martin
Das habe ich schon so gemacht, hatte aber eine fehlermeldung danach und dann war ich mir nicht mehr sicher.

Stimmt, ich gehe auf die Variablen. Geht das nicht so? oder verstehe ich das jetzt falsch?
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:das hatte ich schon mal probiert, aber wie kriege ich die Daten wieder auf den Bildschirm?
mit der Funktion scatter()! Wenn das nicht hilft, musst Du danach einfach ein ::invalidateRect() aufrufen, dann wird die Anzeige aktualisiert. Dies ist aber bei Eingabefeldern eigentlich nicht nötig!!
Manfred hat geschrieben:Werden die ganzen Sle und Spinbutton und Combobox Objekte in das Array geschrieben?
Ja - siehe mein Beispiel. Natürlich nur die, die auch einen Datalink in die Datenbank haben!

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:Stimmt, ich gehe auf die Variablen. Geht das nicht so? oder verstehe ich das jetzt falsch?
das geht im Prinzip schon, nur hat das nicht das Ergebnis, das Du Dir wünscht!!
Was macht gather() in Deinem Fall? Es liest den Inhalt der Editierfelder in Deine Variablen!
Was macht scatter() in Deinem Fall? Es liest den Inhalt der Variablen in Deine Editierfelder!
Es gibt also keinerlei Abgleich zwischen der Datenbank und den Variablen!
Du musst also selber dafür sorgen, dass Deine Variablen aktuell sind und damit im Prinzip gather() und scatter() selber programmieren!
Mach es Dir einfach und gehe in Deinen :datalinks direkt auf die Felder!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

ich glaube wir kommen der Sache näher....
Martin Altmann hat geschrieben:Hallo Manfred,
Manfred hat geschrieben:Stimmt, ich gehe auf die Variablen. Geht das nicht so? oder verstehe ich das jetzt falsch?
das geht im Prinzip schon, nur hat das nicht das Ergebnis, das Du Dir wünscht!!
Was macht gather() in Deinem Fall? Es liest den Inhalt der Editierfelder in Deine Variablen!
Die Editierfelder sind doch meine Variablen.. Muß ich bei gather dann nicht die Methode einsetzen, die die Felder der DB in die Variablen liest?
Was macht scatter() in Deinem Fall? Es liest den Inhalt der Variablen in Deine Editierfelder!
also hier müßte dann das Schreiben in die DB aus den Variablen rein?
Es gibt also keinerlei Abgleich zwischen der Datenbank und den Variablen!
Du musst also selber dafür sorgen, dass Deine Variablen aktuell sind und damit im Prinzip gather() und scatter() selber programmieren!
Mach es Dir einfach und gehe in Deinen :datalinks direkt auf die Felder!

Viele Grüße,
Martin
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
die Funktionen scatter() und gather() kümmern sich um alles!!
Bedenke: Du übergibst ihnen ja das Array mit den Objekten als Parameter! In den Funktionen werden dann die :datalink-Methoden der einzelnen Objekte (=Arrayelemente) ausgeführt - entweder schreibender- oder lesenderweise!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

verstehe ich nicht :-(
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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Ich habe das hier gemacht, das klappte nicht

Code: Alles auswählen

       ::oPbTop:activate := {|| (::nArea)->(DBGOTOP()), Gather(::readRecord(self)), ::oAKPDlg:invalidateRect() }
die Methode ::readREcord(self) wurde aufgerufen, das konnte ich sehen im Debugger, aber es tat sich danach nichts am Bildschirm.

und das klappt auch nicht

Code: Alles auswählen

::oPbTop:activate := {|| (::nArea)->(DBSKIP()), Gather( aEditControls ), ::oAKPDlg:invalidateRect() }
Ich habe natürlich alle Objekte in aEditControls geschrieben.

Ich bin gefrustet. Was mache ich falsch?
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Keine Sorge, probiere es einfach aus - es klappt!!

Statt:

Code: Alles auswählen

::oSle1:dataLink     := {|x| IIF(x==NIL , ::bez, ::bez := x)}
schreibst Du halt:

Code: Alles auswählen

::oSle1:dataLink     := {|x| IIF(x==NIL , dbffile->bez, dbffile->bez := x)}
(vorausgesetzt Dein Alias() heißt dbffile und das feld in der Datenbank heißt bez)
Analog bei allen anderen :datalink-Methoden.
Und bei den Knöpfen zum Blättern nicht die activate-Methode vergessen!! Z.B.:

Code: Alles auswählen

::oPbrw:activate := {|| Gather( ::aEditControls ), ; 
                     dbffile->( DbSkip( 1) ), ; 
                     Scatter( ::aEditControls ) }
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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

grundsätzlich erhält ein oSle:setData(cDaten) so seine Daten, während man mit oSle:getData() den Inhalt auslesen kann. Falls ein codeblock in datalink hinterlegt ist wird der auch ausgeführt. Im Prinzip entspricht das dem bisherigen SAY deiner nicht GUI Anwendung.

Martins scatter/gather Beispiel lädt die SLE automatisch, wenn diese sauber definiert wurden (da gibt es ein Beispiel unter datalink ...). Der direkte Weg entspricht eher dem bisherigen Clipperverhalten, da hast du auch immer eine Anzeige nach der Satzbewegung durchlaufen müssen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:Ich bin gefrustet. Was mache ich falsch?
einiges :wink:
Du musst vor der Bewegung des Satzzeigers ein gather() machen (und nicht Deine selbstgestrickte Funktion als Parameter übergeben, sondern das Array mit den Objekten!!!) und nach der Bewegung des Satzzeigers ein scatter()!!
Bedenke: Erst wegschreiben, dann bewegen, dann neu einlesen!!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Martin,

ich verstehe das nicht. Kann ich nicht Skippen, dann Varia einlesen aus DB und dann anzeigen machen?
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Klar kannst Du das!
Nur willst Du doch sicherlich vor dem Skippen erstmal die Änderungen in die Datenbank zurückschreiben!
Und ausserdem hattest Du nach dem Skippen gather() aufgerufen! Gather liest aber nicht aus der Datenbank - das macht scatter()!
Gather schreibt in die Datenbank!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Aaah, jetzt verstehe ich unser Missverständnis.

Ich möchte nus Skippen und lesen und Anzeigen.Mehr nicht. Schreiben oder so, würde anders laufen.

Also, ich gehe mal davon aus, die Funktionen werden der Reihe nach abgearbeitet.
Skippen werde ich gleich nochmals kurz testet, Auslesen macht das Programm, jetzt muß ich nur noch irgendwie den Unsinn am Bildschirm angezeigt bekommen.
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

OK!
Dann musst Du nach dem Skip() ein Scatter() machen!
Und Du solltest Deine :datalink-Methoden ändern:

Code: Alles auswählen

::oSle1:dataLink     := {|| dbffile->bez }
Und Du solltest Deine Xbase++-Parts nicht editierbar machen!!
Also z.B.:

Code: Alles auswählen

::oSle1:editable     := .f.
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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:Ich habe das hier gemacht, das klappte nicht

Code: Alles auswählen

       ::oPbTop:activate := {|| (::nArea)->(DBGOTOP()), Gather(::readRecord(self)), ::oAKPDlg:invalidateRect() }
:invalidateRect() ist unnötig, wenn du nur den Inhalt von SLE etc. änderst. Diese geben selbst die Bereiche an, in denen die Anzeige erscheinen soll.
Sonst wirst du unnötiges Flackern erhalten. (alles löschen und neu aufbauen)
Gruß
Hubert
Antworten