DCPUSHBUTTON in Schleife erstellen

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

DCPUSHBUTTON in Schleife erstellen

Beitrag von Manfred »

folgendes Szenario:
ich brauche einen Block mit Pushbutton. Insgesamt sind es 22 PB. Dieser Block ist imer gleich aufgebaut, aber die Beschriftung, Action Block, Hide usw. sind verschieden. Also dachte ich mir, ich baue diesen Block in einer For Next Schleife auf fülle die Pushbutton mit Standardwerten um sie dann später im Menue mit aktuell gewünschten Werten zu aktualisieren.

Code: Alles auswählen

METHOD vt_dialog:init(nWindowWidth,nWindowHeight,cVersion,oParent,cArt,nPbReihen,getlist)
.....
       FOR nI := 1 TO 22                                                        // jetzt wird das grundarray für die Pushbuttonleiste gefüllt
           ::doPbLeiste:stelle  := nI
           ::doPbLeiste:text    := ""
           ::doPbLeiste:aktion  := {|| NIL}
           ::doPbLeiste:inaktiv := {|| .T.}
           AAdd(::aPbLeiste,::doPbLeiste:copy())
       NEXT
       ::aPbLeiste[16]:text    := "~Anfang"
       ::aPbLeiste[16]:aktion  := ""
       ::aPbLeiste[16]:inaktiv := {|| .F.}
       ::aPbLeiste[17]:text    := "~nächster"
       ::aPbLeiste[17]:aktion  := ""
       ::aPbLeiste[17]:inaktiv := {|| .F.}
       ::aPbLeiste[18]:text    := "~Ende"
       ::aPbLeiste[18]:aktion  := ""
       ::aPbLeiste[18]:inaktiv := {|| .F.}
       ::aPbLeiste[19]:text    := "~Info"
       ::aPbLeiste[19]:aktion  := ""
       ::aPbLeiste[19]:inaktiv := {|| .F.}
       ::aPbLeiste[19]:text    := "~TG"
       ::aPbLeiste[19]:aktion  := ""
       ::aPbLeiste[19]:inaktiv := {|| .F.}
       ::aPbLeiste[21]:text    := "~Jahr"
       ::aPbLeiste[21]:aktion  := "{|| oDialogZusatz:wechseljahr()}" <-- hier z.B. oDialogZusatz ist ja hier nicht bekannt und würde dann angemeckert werden wenn ich es nicht in Anführungszeichen setzen würde. Dann klappt es aber nicht im Action Block des PB
       ::aPbLeiste[21]:inaktiv := {|| .F.}
       ::aPbLeiste[22]:text := "verlassen"
       ::aPbLeiste[22]:aktion  := {|| DC_ReadGuiEvent(DCGUI_EXIT_ABORT,GetList)}
       ::aPbLeiste[22]:inaktiv := {|| .F.}
RETURN self       

Code: Alles auswählen

METHOD vt_dialog:standardPbLeiste(getlist)
       LOCAL nDurch  := 0
       LOCAL nI
       LOCAL nLinks  := 5
       LOCAL nOben   := 15
       LOCAL nZusatz := 60

       MEMVAR cNi
       MEMVAR oVtPara

       FOR nI := 1 TO 22
           cNi := Alltrim(STr(nI))
           @ nOben,nLinks DCPUSHBUTTON;
                                ACTION IF(Valtype(::aPbLeiste[nI]:aktion) == "B",::aPbLeiste[nI]:aktion,{|| ::aPbLeiste[nI]:aktion});
                          ALIGNCAPTION BS_LEFT;
                               CAPTION ::aPbLeiste[nI]:text;
                                  HIDE ::aPbLeiste[nI]:inaktiv;
                                OBJECT ::oPbLeiste&cNi;
                                PARENT ::oRahmenPbLeiste;
                                  SIZE ::nPblaenge + nZusatz,::nPbHoehe;
                               TABSTOP
           nDurch++
           nOben += ::nPbHoehe
           IF nDurch = 3
              nDurch := 0
              nLinks += ::nPbLaenge + nZusatz
              nOben  := 15
           ENDIF
       NEXT
RETURN self
hier würde dann der spezifische Eintrg in die entsprechenden Arrayfelder erfolgen um die Anpassung zu machen.

Code: Alles auswählen

METHOD DialogArchivMenue:initvaria()
       MEMVAR oVtPara

       ::aArchivDaten    := {}
       ::doArchivDaten   := DataObject():new()
       ::oArchiv         := archive():new()
       ::x_jjjj          := StrZero(Year(Date()),4,0)
       ::oArchiv:cDbank += ::x_jjjj
// ob das die beste Lösung ist? (30.12.2018)
       ::aPbLeiste[1]:text     := "~Fehlerprotokoll"
       ::aPbLeiste[1]:aktion   := ""
       ::aPbLeiste[1]:inaktiv  := {|| .F.}
RETURN self
Eigentlich alles Data Driven wenn man es genau nimmt, aber irgendwie wollen die Action Blocks nicht klappen.
Meine Frage ist nun, wie wird der Action Codeblock vernünftig aus dem Array an den Pushbutton übergeben? Trage ich den Codeblock im Array ein, oder trage ich dort nur einen Text ein, der dann in einen Codeblock eingefügt wird? Es kommt vor, das dort Variablen stehen, die in der INIT Datei noch nicht bekannt sind. Und alle übergeben, oder Public/Private machen ist auch nicht die Lösung.
Weiterhin habe ich noch das Problem, wenn ich denn die Pushbutton ordentlich versorgt habe und sie klappen, dann kommt eine Fehlermeldung, die besagt, ich wäre außerhalb des Arrays. Es wird angeblich versucht Element 23 anzusprechen, was aber nicht vorhanden ist.
Für den Anfang wäre erstmal ein Tipp bzgl. der Codeblocks gut, der mir weiterhelfen würde.
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: DCPUSHBUTTON in Schleife erstellen

Beitrag von Martin Altmann »

Manfred,
ernsthaft? Das war doch nun schon so oft Thema hier! Dazu gibt es diverse Hinweise: Du darfst den Schleifenzähler nicht so nutzen, sonder musst tricksen!
Z.B. :arrow: https://www.xbaseforum.de/viewtopic.php ... 89#p122789

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: DCPUSHBUTTON in Schleife erstellen

Beitrag von Manfred »

verstehe ich trotzdem nicht. Der Ende Button klappt. Da ist ja auch ein Codeblock drin.
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