Schleife?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Schleife?

Beitrag von Jan »

Mal 'ne Frage von einem Dummy. Aber ich komme da rein logisch nicht wirklich weiter, dreh mich irgendwie im Kreis.

Ich erstelle auf einem Bildschrim mehrer Buttons. Die sind mit Werten beschriftet, die miteinander in logischer Abhängigkeit stehen. Klicke ich nun einen der Buttons an, so soll der komplette Bildschirm neu aufgebaut werden. Mit Werten, die wiederum miteineinader in logischer Abhängigkeit stehen, und als Ausgang Werte hinter dem gedrückten Button haben.

Das kann also im Prinzip fast endlos so weitergehen. Button klicken, Bildschirm neu aufbauen mit neuen Beschriftungen und Aktionen hinter den Buttons. Davon einen auswählen, und wieder alles von vorne.

Aber wie mache ich das logisch? Diese Schleife zu programmieren?

Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt. Ansonsten: Nachfragen.

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

Beitrag von Martin Altmann »

:?: :?:
Ich verstehe nichts - aber das ist ja nichts Neues :D
Schau Dir mal die paint-Methode an:

Code: Alles auswählen

::XbpDialog:drawingArea:paint := { | a, b, c | a := c:lockPS(), ;
		                                  ::Satzanzeige( a ), ;
		                                  c:unlockPS( a ) }
in der o.g. Funktion Satzanzeige() müsstest Du die entsprechenden Captions neu setzen.
Beim Klicken auf einen der Knöpfe rufst Du einfach ein ::invalidateRect() auf, dadurch wird die o.g. Methode ausgeführt...

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
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Martin,
Martin hat geschrieben:Ich verstehe nichts - aber das ist ja nichts Neues
... wenn ich ein Problem zu beschreiben versuche.

Das Problem liegt nicht darin, die Buttons neu zu beschriften oder neu zu erzeugen. Und zwar wie gesagt in einer (Endlos-)Schleife.

Irgendwie kann ich den Bildschirm zwar aufbauen. Aber ich bekomme das nicht hin, daß der selbe Code in sich geschlossen ist.

Bitte nicht zu kompliziert denken! Das Problem ist wahrscheinlich garnicht so kompliziert zu lösen. Ich brauche einfach nur einen Ansatz.

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

Beitrag von Martin Altmann »

Hallo Jan,
Jan hat geschrieben:
Martin hat geschrieben:Ich verstehe nichts - aber das ist ja nichts Neues
... wenn ich ein Problem zu beschreiben versuche.
nein - sondern wenn ich versuche, etwas zu verstehen :!: :D
Wieso willst Du das unbedingt in einer Schleife lösen? Die Beschriftung soll doch nur geändert werden, wenn einer der Knöpfe gedrückt wird, oder?

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
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Im Prinzip ja. Beschriftung und Aktion hinter dem Button.

Die Logig, wie der Zusammenhang zwischen den Buttons ist, ist immer die gleiche.

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

Beitrag von Martin Altmann »

Hallo Jan,
schon klar, aber die Schleife darf bei zehn Knöpfen ja nur einmal (und nicht zehnmal) durchlaufen werden oder?
Und je nach gedrücktem Knopf muss eine von zehn Beschriftungsvarianten genommen werden - also wäre doch sicherlich ein Case-Konstrukt sinnvoller, oder :?:

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
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Ups.

Ja. Die Schleife soll pro Bildschirmaufbau nur 1 x durchlaufen werden.

Und irgendwie Nein. Das Erstellen des 1. Bildschirms ist kein Problem. Funktioniert tadellos.

Meine Schwierigkeit ist: Alles funktioniert perfekt. In der 1. Runde. Aber wie komme ich in die 2.? Und 3.? In de 1. Runde komme ich von extern. Klar. Aber 2. und 3. und n. laufen intern. Wie gesagt auf Button-Klick innerhalb der jeweils vorherigen Runde.

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

Beitrag von Martin Altmann »

Hallo Jan,
wie gesagt:
In der Satzanzeige setzt Du Deine Captions entsprechend in einer DO CASE-Anweisung!
In einer Klassenvariable (die Du in o.g. CASE-Anweisung auswertest) legst Du ab, welcher Knopf gedrückt wurde (damit Du dann weißt, welche Captions gesetzt werden sollen).
Und die activate-Blöcke Deiner Knöpfe belegst Du dann (z.B.) so:

Code: Alles auswählen

::Button1:activate := { || ::ClassVariable := 1, ::invalidateRect()}
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: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

schreibe doch in dieser Manier hier das gewünschte Verhalten auf :

Code: Alles auswählen

1. Durchlauf:
[P1]
[P2] -> click
[P3]
[P4]
...
2. Durchlauf nach [P2] click:
[P2-1]
[P2-2]
[P2-3] -> click
[P2-4]
...
3. Durchlauf nach [P2-3] click:
[P2-3-1]
[P2-3-2]
[P2-3-3] -> click
[P2-3-4]
.....
wenn ich es recht verstanden habe.
die Zustände [P2] - [P2-2] etc. kann man entweder direkt an der Caption Beschriftung abfragen oder ein FLAG-System einführen.

Was man nicht braucht, ist eine extra Schleife.
Je nach Verhalten braucht man entweder eine Methode oder eine Methode je Button, die aktivate zugeordnet wird und den Schritt tiefer bzw. höher in der Reihenfolge regelt. Die Schleife ist wie immer die normale do while ! N_Close ... appevent ... handleevent ... enddo Konstruktion, die sich um alle Eingaben kümmert.
Gruß
Hubert
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hallo Jan

vor längerer Zeit hab ich mal was programmiert wo man über einen Button nacheinander mehrere Funktionen aufrufen kann.

Code: Alles auswählen

//-- beim erstellen des Button 
::oBtnSave:activate     := {|| ::save() }

/********************************************************************
          Name :  save       
           Does :  EVENT Reagiert auf den Button Speichern
  Parameters :  ::iRunPos Position der Funktion die als nächstes
                aufgerufen werden soll
********************************************************************/
METHOD clsDlgConv:save()    
	do case
	        //** STEP 1 
		case ::iRunPos == 1
			::iRunPos := ::iRunPos +  1
	        //** STEP 2
		case ::iRunPos == 2
			::iRunPos := ::iRunPos +  1
	endcase
RETURN ::iRunPos
vielleicht hilft es ja

Gruß Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

So, ich versuche mal das zusammenzufassen:

Beim 1. mal die Buttons erzeugen mit Beschriftung und Ausführung bei Click.

Beim Anklicken "nur" die Beschriftung und das Auszuführende ändern. Und ev. nicht einmal das Auszuführende, denn das ist ja im Prinzip immer das gleiche, nur mit unterschiedlichen Übergabewerten.

Soweit korrekt?

Dann müsste ich also eigentlich immer "nur" auf eine externe Funktion mit CASE zurückgreifen um z. B. ein Array mit den neuen Werten für die Buttons zu erzeugen. Und das dann zum :configure entsprechend auslesen.

Korrekt verstanden?

Was mir zu hoch ist ist das mit dem Flag, appevent, handleevent, ClassVariable. Aber ich werde am Samstag mal versuchen, ob ich da weiter komme.

Erstmal Danke für die Hinweise. Ich brauche halt einfach ersteinmal den korrekten Einstieg.

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

Beitrag von Martin Altmann »

Hallo Jan,
ist im Prinzip korrekt.
Machst Du das mit Classcode oder mit Funktionscode?

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
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

*grins*

Funktionscode. Ich habe noch immer Probleme, mich mit Klassen anzufreunden. Zu lange Clipper pur gemacht, und zu wenig Zeit mich in Xbase ordentlich einzuarbeiten. Ich würde gerne mehr machen, aber es gibt da noch mein Weib und meine Gören. Das würde leichten Unmut fabrizieren wenn ich so viel programmieren würde ich ich gerne wollte.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

ein FLAG ist ein Merker, im Funktionscode mußt du bei EINER Funktion sowohl den Status als auch den Button merken (bei einer Funktion je Button reicht der Status ... ist Geschmackssache):

Code: Alles auswählen

...
oXbp:cargo := "PB01_1" // Button PB01 im Zustand 1
oXbp:activate := {|n1,n2,oXbp| Aktion(oXbp)}
oXbp:cargo := "PB02_1" // Button PB01 im Zustand 1
oXbp:activate := {|n1,n2,oXbp| Aktion(oXbp)}
...
function Aktion(oXbp)
     local cPB       := upper(left(oXbp:cargo,4))
     local nStatus := val(substr(oXbp:cargo,6))
     do case 
          case cPB = "PB01"
                  do case
                       case nStatus=1
                             oXbp:SetCaption("TEST")
     ....
     oXbp:cargo := cPB+"_"+alltrim(str(nStatus))
     ...
Gruß
Hubert
Antworten