Realisierung von Shortcut-Keys in reinem GUI

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo,


gegeben ist ein Thread, in dem ein Dialog angezeigt wird. Nun möchte ich verschiedene Short-Cuts definieren, z.B.

Strg-A => wenn die Taste in einem in einem SLE oder MLE gedrückt wird, soll der komplette :editBuffer() des Xbase-Parts markiert werden;
Alt-L => springe zu einem bestimmten Xbase-Part

Entsprechend habe ich den Event-Loop angepasst:

Code: Alles auswählen

   nEvent := xbe_None
   WHILE nEvent <> xbeP_Close
      nEvent := AppEvent(@mp1, @mp2, @oXbp)
      DO CASE
      CASE nEvent = xbeP_Keyboard
         DO CASE
         CASE mp1 = xbeK_CTRL_A      // mark ALL in MLE7/SLE, target object is referred to in oXbp
            cType := oXbp:className()
            IF cType = "XbpSLE" .OR. cType = "XbpMLE"
               nChars := Len(oXbp:editBuffer())
               nChars := Max(nChars, 1)
               oXbp:setMarked({1, nChars})
            ELSE
               oXbp:handleEvent(nEvent, mp1, mp2)
            ENDIF
         CASE mp1 = xbeK_ALT_A       // AUTO publish, target object is XbpPushButton from TabPage
            ProcessAltCommand(nEvent, mp1, mp2, oXbp)
            ...
         OTHERWISE
            oXbp:handleEvent(nEvent, mp1, mp2)
         ENDCASE
      OTHERWISE
         oXbp:handleEvent(nEvent, mp1, mp2)
      ENDCASE
   END
Also, das Ctrl-A kann ich recht einfach abfangen, da es nur innerhalb von zwei verschiedenen Xbase-Parts zum Tragen kommen kann bzw. soll.

Kommen wir zur Struktur des Dialogs:

Code: Alles auswählen

XbpDialog()
+---> :drawingArea
      +---> XbpTabPage
            +---> XbpStatic
                  +---> Xbase-Part
Pro Tabpage gibt es ein beliebige Anzahl von XbpStatic (Groupbox), die dann ein oder mehrere Xbase-Parts enthalten.

Um das Xbase-Part zu ermitteln, zu dem der Fokus gehen soll, gehe ich in ProcessAltCommand() von oXbp aus und hole mir solange über :setParent() den Parent, bis ich auf ein XbpIWindow stosse (ich fange ab, dass oXbp bereits das XbpIWindow sein könnte). Meine Annahme ist, dass es sich dabei um die :drawingArea meines XbpDialog handelt.

Danach arbeite ich rekursiv die :childList() ab, bis ich das Xbase-Part finde, dem der Fokus übergeben werden soll. Die Xbase-Parts enthalten eine Kennzeichnung (abgeleitete Klassen), anhand derer das korrekte Xbase-Part identifiziert wird.

Auf dem Weg durch die :childList()s ignoriere ich alle XbpTabPage, die :minimized sind (in diesem Fall ist der Aufbau xbpTabPage identisch, und den Fokus soll das entsprechende Xbase-Part auf der maximierten XbpTabPage erhalten).

Von der Geschwindigkeit her ist das akzeptabel, aber ich frage mich, ob es eventuell einen eleganteren Weg gibt, das entsprechende Xbase-Part zu lokalisieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Tom »

Hallo, Georg.

Mmh. Hört sich nicht unpfiffig an, aber eigentlich könnte das Strg-A-Verhalten von SLE und MLE auch simpel über die HandleEvent-Methode bzw. den Slot der jeweiligen Parts erledigt werden.

Die Funktionsweise Deines Alt-L verstehe ich zwar nicht ganz, glaube aber, dass es darum geht, von einem Part bei Betätigung dieser Tastenkombination zu einem ganz bestimmten anderen zu springen. Was spricht also dagegen, dieses Ziel gleich als iVar bei der jeweiligen Quelle zu hinterlegen?
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo, Tom -


könntest Du diesen Teil ein wenig deutlicher ausführen:
Was spricht also dagegen, dieses Ziel gleich als iVar bei der jeweiligen Quelle zu hinterlegen?
Das Problem ist ja, dass das aktive Xbase-Part zum Zeitpunkt des xbeK_ALT_L jedes beliebige Element des Dialogs sein kann, es kann also die XbpTabPage sein, auf der sich das Xbase-Parts als Child eines XbpStatic befindet, oder ein beliebiges Xbase-Part auf der XbpTabPage. Ich müsste dann ja allen Xbase-Parts entsprechende Anweisungen in den :keyboard-Slots mitgeben, was mir deutlich komplexer erscheint (immer verbunden mit der Gefahr, es beim Hinzufügen von neuen Xbase-Parts mal zu vergessen).

Daher habe ich ja auch beim Event-Loop angesetzt, wohl wissend, dass dies Einfluss auf die Performance haben kann.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

Das Problem ist, dass du nie weißt wo genau der Event ankommt (also was gerade den Focus hatte) aber zumindest in der EventSchleife immer weißt, wer den verursacht hat.
Wenn du eine Tastenkombination nutzt, die beim aktuellen Control eine Bedeutung hat, dann wird es diesen schlucken, ENTER in MLE geben keinen keyboard event weiter wenn sie diesen als neue Zeile interpretieren (deine Wahl dürfte da kein Problem haben).

Falls du aber mit einer sonst unbenutzten Taste in dem Fenster auf genau ein Control willst, müsste es reichen dem keyboard slot des Fensters die Verarbeitung zu überlassen, denn ein unverarbeiteter Event müsste jeweils an den Parent übergeben werden ... zumindest habe ich das damals beim Hilfeevent nach F1 erlebt (bei Tasten aber nie ausprobiert).

Wenn du innerhalb einer Gruppe z.B. SLE mit einer Tastenkombination zu einem anderen dieser Art springen willst, würde ich das auch über den Keyboardslot aber dieser Controls erledigen, so habe ich z.B. ENTER auf TAB umgesetzt bei einigen gruppierten SLE ...

Für die Bestimmung des Fensters bei verschachtelten Controls gibt es eine (neue) Funktion: GetParentForm() - Abfragen des Parent-Dialogs eines Xbase Parts.

Grundsätzlich würde ich lieber z.B. beim Programmstart einmalig die Ziele ermitteln und merken, als dauernd durch die Objekt-Listen zu springen, gerade in der EventLoop.

Aber es kommt halt darauf an, was genau du brauchst.

Zu dem Einwand, FALLS das Fenster den Event bekommt, dann weiß es immer wer den verursacht hat !
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo, Hubert -


das Ermitteln des XbpIWindow ist meine gerinste Sorge, es kann maximal vier Stufen geben:

XbasePart
XbpStatic
XbpTabPage
XbpIWindow (die :drawingArea des XbpDialog)

Trotzdem hat GetParentForm() schon seinen Reiz, ich werde das mal ausprobieren.

Es geht mir auch nicht um die Bearbeitung von Standard- Events wie Enter, sondern spezielle Tasten, die sonst nicht verwendet werden.

Dann habe ich einen Thread, der genau diesen Dialog bearbeitet. Ich muss aber, um das Xbase-Part zu finden, von oben nach unten alles durchlaufen. Bei den XbpTabPage ist das flott zu Ende, wenn :minimized = .T.

Da - in diesem Fall vorsichtig geschätzt - eine von tausend Tastatureingaben einer der Shortcuts ist, mit denen bestimmte Elemente angesprungen werden sollen, möchte ich nicht jedem Xbase-Part entsprechende Informationen hinterlegen.

Und: dieser Dialog wird im Programmablauf mehrfach erstellt und nicht statisch am Programmbeginn.

Und, nein, ich weiss nicht, wo der Fokus gerade ist, wenn Alt-L gedrückt wird. Oder Alt-P oder Alt-S etc. Ich brauche also eine generische Lösung. Die habe ich gefunden, aber ich überlege einfach, ob es einen Weg gibt, das Ganze zu vereinfachen/verschlanken.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Tom »

Hallo, Georg.
könntest Du diesen Teil ein wenig deutlicher ausführen:
Wenn ich Dich richtig verstanden habe, kann man in Deinen Dialogen ALT-L drücken, woraufhin der Fokus zu einem (bestimmten) anderen Element wandert, abhängig davon, wo er derzeit steht. Du machst es derzeit so, dass Du erst den Parent des Objekts, in dem das Event ausgelöst wurde, zu finden versuchst, in dessen Childlist dann wiederum das ausführenden Element und dann irgendwie das Ziel. Wenn Du Dir diese Mühe ersparen willst, kannst Du natürlich beides (Parent und Ziel) auch gleich direkt beim/im Objekt speichern - notfalls im Cargo, falls es Dir zu aufwendig wäre, lauter Subklassen zu bauen. Falls Du es mal vergisst oder vergessen hast, kannst Du ja zusätzlich/alternativ Deine bisherige Methode verwenden.

Du kannst natürlich auch einfach in der Childlist des fraglichen Dialog-Objekts nach dem aktuellen Objekt scannen (aScan) und dann einfach von dieser Stelle aus weitersuchen.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

OB und WIE es einfacher geht hängt davon ab, WIE du entscheidest von WO du WOHIN gehen willst.

Angenommen es ist immer ein Control dieses Fensters, das so angesprungen werden soll, würde ich dieses Control direkt in einer iVAR des Fensters speichern.
Wenn nur die Controls selbst entscheiden können wohin es geht, dann mach was TOM gesagt hat (CARGO) ...
Wenn das Ziel irgendwo in der Anwendung ist, kannst du das AppObjekt oder eine Funktion (funktion wie SetAppWindow()) ...

Du kannst auch oControl:setName() nutzen um ein Objekt zu finden
Die Methode :setName() dient dazu, einem Xbase-Part einen eindeutigen numerischen Wert zuzuordnen. Anhand dieses Werts kann der XBP später mit der Methode :childFromName() aus der Child-Liste geholt werden. Dadurch braucht ein XBP nur in der Child-Liste eines Parent referenziert werden und nicht zusätzlich in Speichervariablen.
Falls die Regeln complexer werden rufe eine Funktion auf ...
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo, Tom -


der Fokus soll unabhängig davon, wo er gerade ist, auf ein bestimmtes Objekt gesetzt werden. Ich habe also keine Paarbeziehung in dem Sinne Element-A geht nach Element-F, und Element-B geht nach Element-M.

Und auch aufgrund der Struktur (auf der XbpTabPage)

Code: Alles auswählen

XbpTabPage
+--->XbpStatic
    +--->XbpSLE
liefert mir die :childList() der XbpTabPage nur {XbpStatic, XbpStatic, XbpStatic...} Das führt ja dazu, dass ich rekursiv diese :childLists durchlaufen muss, um das "passende" Element zu finden.

Aber ... ich führe ein Array mit den Dialog-Elementen, das ich im Aufruf mitgeben kann - dann brauche ich nur diese Liste zu durchsuchen.

Danke, das war der Gedankenanstoss, den ich gebraucht habe.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Martin Altmann »

Moin Georg,
in dem Static vor dem SLE, das Du mit ALT-L anspringen willst, kommt kein L vor?

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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

und wenn dieses
georg hat geschrieben:der Fokus soll unabhängig davon, wo er gerade ist, auf ein bestimmtes Objekt gesetzt werden. Ich habe also keine Paarbeziehung in dem Sinne Element-A geht nach Element-F, und Element-B geht nach Element-M.
Die Frage ist doch woher du weißt wohin es springen soll !

wenn es z.b. ein SLE wie z.B. STRG+F => Suchen SLE ist, dann kannst du das Objekt selbst im Fenster als iVar hinterlegen und es geht super schnell.
Oder du nutzt eine Funktion wie diese um das Ziel ohne iVar zu speichern.

Code: Alles auswählen

function MySprungZiel_L(oXbp)
    STATIC oControl := NIL
    local oReturn := oControl
    if PCount() > 0
      oControl := oXbp
    endif
return oControl
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

Die Xbase-Parts enthalten eine Kennzeichnung (abgeleitete Klassen), anhand derer das korrekte Xbase-Part identifiziert wird.
da stand es ja oben, wenn du bei diesem Control mit oControl:setName( nID ) einen Wert setzt, kannst du mit :childFromName( nID ) die komplette Childlist des Fensters durchsuchen,
das geht auch sehr schnell ! Falls es mehrere sind, eine Schleife mit nID bis nID+n ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

eine andere Möglichkeit besteht darin für verschiedene Zustände eigene Arrays von Controls anzulegen.
Ich nutze Class code und dort wurde immer schon aadd( ::EditControls , oXbp ) verwendet.
Bei bestimmten Controls könntest du beim Aufbau schon diese in bestimmten Arrays sammeln:

Code: Alles auswählen

...
if oXbp = ??? 
   aadd( ::SpezialSprungAdresse , oXbp )
endif
...
da Array könnte auch ein LOCAL sein, das in einer funktion gesichert wird.
So wären nur sehr kurze Arrays zu durchsuchen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Jan »

brandelh hat geschrieben:
Die Xbase-Parts enthalten eine Kennzeichnung (abgeleitete Klassen), anhand derer das korrekte Xbase-Part identifiziert wird.
da stand es ja oben, wenn du bei diesem Control mit oControl:setName( nID ) einen Wert setzt, kannst du mit :childFromName( nID ) die komplette Childlist des Fensters durchsuchen,
das geht auch sehr schnell ! Falls es mehrere sind, eine Schleife mit nID bis nID+n ...
... was wäre mit dem Cargo-Slot? Den kann man recht universell und frei belegen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo,


wie muss man eine Frage formulieren, damit sie entsprechend verstanden wird? Ich muss wohl noch extrem üben ...

Wenn Alt-L gedrückt wird, dann soll das 14. Element den Focus erhalten. Das HEUTIGE 14. Element. Es ist möglich, das in absehbarer Zeit andere Elemente davor eingefügt oder entfernt werden, so dass ein

SetAppFocus(aEntries[14])

NICHT das ist, was ich umsetzen will. Klar ist, dass Alt-L mit einem BESTIMMTEN Xbase-Part in Verbindung steht. Egal, wo sich der Focus befindet (bitte, auch auf der Tab-Page oder der :drawingArea!), beim Drücken von Alt-L soll der Focus zu immer dem gleichen Element gehen. Es ist aber auch absehbar, dass andere Elemente mit solchen Shortcuts angesprungen werden sollen.

Bei der Bearbeitung muss der Dialog im zweiten, dritten etc. Durchlauf nicht mehr komplett bearbeitet werden, sondern es müssen nur bestimmte Felder aktualisiert werden. Diese sollen durch einen Shortcut angesprungen werden, so dass im Optimalfall der Dialog aufgerufen, mit Alt-L das Feld angesprungen, aktualisiert und dann mit Alt-U gespeichert und Strg-F4 der Dialog geschlossen wird. Deutlich schneller als mit der Tab-Taste durch die Felder zu gehen, oder die Hand zur Maus zu bewegen ...


@Martin: Deine Idee mit der Caption des XbpStatic ist gut, aber die Caption kann unterschiedlich sein, bzw. ändert sich schon mal. Der einzige "feste" Anker ist die iVar :dataLinkName, in der definiert ist, welches Tabellenfeld mit diesem Xbase-Part verknüpft ist.


@Hubert: Da ich aber zum späteren Schreiben alle Dialog-Element in einem Array sammle, übergebe ich zusätzlich dieses Array an die Funktion und brauche nur das Array zu durchlaufen, um das entsprechende Element zu finden. Mein erster Ansatz war eben, es "nur" mit den Standardparametern zu machen, die AppEvent() liefert.

Das ist zwar nicht die "elegante" Lösung, die ich mir gewünscht habe, es sollte aber auf jeden Fall schneller sein als das rekursive Abarbeiten der diversen ChildLists.

Vielen Dank für Eure Hilfe!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

georg hat geschrieben: wie muss man eine Frage formulieren, damit sie entsprechend verstanden wird? Ich muss wohl noch extrem üben ...
Wenn Alt-L gedrückt wird, dann soll das 14. Element den Focus erhalten. Das HEUTIGE 14. Element.
Es ist möglich, das in absehbarer Zeit andere Elemente davor eingefügt oder entfernt werden, so dass ein

SetAppFocus(aEntries[14])

NICHT das ist, was ich umsetzen will. Klar ist, dass Alt-L mit einem BESTIMMTEN Xbase-Part in Verbindung steht.
wenn das so ist, warum hinterlegst du dieses bestimmte Element nicht einfach in einer iVar des Fensters ?
Dem wäre die Position und auch die tatsächliche Unterseite egal !

So hinterlege ich z.B. Aktenzeichen, spezial Drucker, Sachbearbeiter-ID etc. alles in iVars des Fensters.
So muss man nicht suchen, sondern weiß wo es steht, aber wenn du es anders möchtest kein Problem, es ist dein Programm ;-)

@ JAN

cargo ist ja ganz nett, aber es gibt nur eines, bei der nächsten Erweiterung muss man dann ein Array hinterlegen ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Jan »

brandelh hat geschrieben:@ JAN

cargo ist ja ganz nett, aber es gibt nur eines, bei der nächsten Erweiterung muss man dann ein Array hinterlegen ...
Hubert,

ja und? :setName() kann auch nur einen Inhalt aufnehmen. Der auch nur numerisch sein kann, während :cargo alles mögliche sein kann.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von georg »

Hallo, Hubert -


warum ich nicht eine iVar im Dialog definiere und diese benutze? Weil - aufgrund von Anforderungen - der Dialog erweitert oder verkleinert werden kann, und nicht jedes Feld über einen Shortcut angesprungen werden muss. Und weil ich versuche, meinen Programmcode so zu gestalten, dass ich neue Felder relativ einfach einfügen oder entfernen kann und nicht jedesmal über Spezialbedingungen nachdenken will. Werden solche Änderungen unter Termindruck durchgeführt, tendiere ich dazu, solche Sonderfälle nicht immer zu beachten. Daher suche ich nach einer Lösung, die auf dem Standard "greift".

Ich habe inzwischen ja eine Lösung mit meinem Array von Xbase-Parts gefunden (wobei ich auch mit der vorhergehenden nicht unzufrieden war, nur erscheint sie mir halt recht aufwändig durch die ganzen Rekursionen), um die Lokalisierung zu beschleunigen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

georg hat geschrieben:Hallo, Hubert -
warum ich nicht eine iVar im Dialog definiere und diese benutze? Weil - aufgrund von Anforderungen - der Dialog erweitert oder verkleinert werden kann, und nicht jedes Feld über einen Shortcut angesprungen werden muss. Und weil ich versuche, meinen Programmcode so zu gestalten, dass ich neue Felder relativ einfach einfügen oder entfernen kann und nicht jedesmal über Spezialbedingungen nachdenken will. ...
da hast du mich jetzt aber völlig falsch verstanden, eine iVar im Fenster (der Klasse) hat gar nichts mit der Oberfläche oder anderen Controls zu tun.
Beispiel, ich habe eine HBRootDialog() Klasse, die von der normalen XbpDialog-Klasse abgeleitet ist, es könnte aber z.B. auch vom XppFD erstellt worden sein (CLASS-CODE).
Nun möchte ich in dem speziellen Programm einige Infos zentral halten und schnell darauf zugreifen:

Code: Alles auswählen

CLASS MyHBRootDialog FROM HBRootDialog
   Exported
   VAR IsCitrixAktiv
   VAR SB
ENDCLASS
das war alles was nötig ist !

Im jeweiligen Code kann ich dann schnell zufreifen oder setzen:

Code: Alles auswählen

   // RootDialog() so ähnlich wie SetAppWindow() aber wird nie geändert
   if RootDialog():IsCitrixAktiv
      ... nimm die Citrix Werte
   else
      ...

   // welcher SB ist angemeldet
   in der User-Anmeldung
      RootDialog():SB := field->SB


in deinem Fall (dass es nur ein spezielles Fenster geht oder aber jedes Fenster seine Infos braucht) wäre es besser es in die Fensterklasse des Dialoges einzufügen:

Code: Alles auswählen

CLASS MyDialog FROM XbpDialog  // ODER von der Klasse die der XppFD erstellt hat
   Exported
   VAR AktiverDrucker // für dieses Fenster
   VAR AktenZeichen
   VAR SpezialFeld // hier könnte das Fenster dann das Control einmalig hinterlegen (init, create)
ENDCLASS
SetAppWindow():SpezialFeld oder oDlg:SpezialFeld je nachdem wie SetAppWindow() belegt ist, liefern dann das richtige Control sofort !

ist das kompliziert ?

Falls das spezielle Control schon beim Aufbau bekannt ist, ist das die einfachste und schnellste Methode ;-)

Aber wie gesagt, wenn du eine Lösung hast ist das gut so.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von brandelh »

Jan hat geschrieben:
brandelh hat geschrieben:@ JAN

cargo ist ja ganz nett, aber es gibt nur eines, bei der nächsten Erweiterung muss man dann ein Array hinterlegen ...
Hubert,

ja und? :setName() kann auch nur einen Inhalt aufnehmen. Der auch nur numerisch sein kann, während :cargo alles mögliche sein kann.

Jan
im aktuellen Fall ging es darum ein SLE zu KENNZEICHNEN, damit es schnell in der ChildList gefunden werden kann.
EIN SLE EIN Kennzeichen, daher setName beim zu kennzeichnenden SLE und die function nutzen, die Xbase++ vorsieht 8)

Für andere Zwecke (ich gebe Infos mit) hauptsächlich als Parameter sieht das ganze natürlich anders aus, da kann man mit cargo ein array oder ein Objekt mit Infos übergeben.
Ich habe ja auch nicht gesagt es ist falsch, aber anders ist für die obere Aufgabe schneller !
Gruß
Hubert
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von Dieter »

Hallo,
bei Einsatz von Class-Code ist die Realisierung von Shortcuts relativ einfach.
So sieht zum Beispiel eine meiner Steuerungsprozeduren für die Shortcuts eines Fenster aus:

Code: Alles auswählen

PROCEDURE r_Auswahl_SC(oDlg,nDefine)
	DO CASE
		CASE  nDefine==xbeK_ALT_D
			SetAppFocus(oDlg:Tab1)
		CASE  nDefine==xbeK_ALT_A
			SetAppFocus(oDlg:Tab2)
		CASE  nDefine==xbeK_ALT_B
			SetAppFocus(oDlg:Tab3)
		CASE  nDefine==xbeK_F7 .AND. !oDlg:Tab1:minimized
			oDlg:bvb_position(1)
		CASE  nDefine==xbeK_SH_F7 .AND. !oDlg:Tab1:minimized
			oDlg:bvb_position(-1)
	ENDCASE
RETURN
Der Anschluß dieser Prozedur geschieht über einen shortcut-Codeblock (Instanzvariable des Dialoges). Außerdem ist eine Instanzvariable für das Array mit allen für den Dialog relevanten Shortcut-Konstanten notwendig. Allerdings müssen alle Xbase-Parts, die den Focus erhalten können, folgende Modifizierung in der handleEvent-Methode erhalten.

Code: Alles auswählen

Method MeinSle:handleEvent(nEvent,mp1,mp2)
LOCAL oDlg:=GetParentForm(self)
...
CASE nEvent == xbeP_Keyboard
			DO CASE
				CASE ::scan(oDlg,mp1)
					oDlg:shortcut(mp1)
...
In oDlg:shortcut(mp1) wird die Klassenmethode ausgeführt, die den Codeblock :shortcut auflöst.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Realisierung von Shortcut-Keys in reinem GUI

Beitrag von AUGE_OHR »

georg hat geschrieben:@Martin: Deine Idee mit der Caption des XbpStatic ist gut, aber die Caption kann unterschiedlich sein, bzw. ändert sich schon mal. Der einzige "feste" Anker ist die iVar :dataLinkName, in der definiert ist, welches Tabellenfeld mit diesem Xbase-Part verknüpft ist.
wenn du das ~ CHR(126) Zeichen für ALT - Kombinationen verwendest gibt es doch
c:\ALASKA\XPPW32\Source\samples\solution\ShortCut\scmanage.prg
gruss by OHR
Jimmy
Antworten