Schleife?
Moderator: Moderatoren
- Jan
- 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?
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
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Ich verstehe nichts - aber das ist ja nichts Neues
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 ) }
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
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.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Martin,
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
... wenn ich ein Problem zu beschreiben versuche.Martin hat geschrieben:Ich verstehe nichts - aber das ist ja nichts Neues
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Jan,
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
nein - sondern wenn ich versuche, etwas zu verstehenJan hat geschrieben:... wenn ich ein Problem zu beschreiben versuche.Martin hat geschrieben:Ich verstehe nichts - aber das ist ja nichts Neues
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
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
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
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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:
Viele Grüße,
Martin
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()}
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.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Jan,
schreibe doch in dieser Manier hier das gewünschte Verhalten auf :
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.
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]
.....
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
Hubert
Hallo Jan
vor längerer Zeit hab ich mal was programmiert wo man über einen Button nacheinander mehrere Funktionen aufrufen kann.
vielleicht hilft es ja
Gruß Rolf
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
Gruß Rolf
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
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
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Jan,
ist im Prinzip korrekt.
Machst Du das mit Classcode oder mit Funktionscode?
Viele Grüße,
Martin
ist im Prinzip korrekt.
Machst Du das mit Classcode oder mit Funktionscode?
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.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
*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
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
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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):
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
Hubert