Seite 1 von 1

SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Fr, 14. Mär 2014 14:03
von DelUser01
Hallo

habe da ein kleines Problem
(eher eine Unschönheit für die User):
Wenn ein SLE den Focus bekommt markiere ich den gesamten Text.
Wenn aber der angezeigte Bereich kleiner ist als die gesamte Text-Länge wird der Text zwar markiert aber der Cursor ans Textende gesetzt und somit der hintere Teil des Textes angezeigt und nicht der Anfang.
z.B. der Text hat eine Länge von 40 Zeichen,
die Anzeige-Breite des SLE beträgt aber nur 20 Zeichen:
gesamter Beispiel-Text: "Dieser Text soll nicht verschoben werden"
Anzeige ohne SetMarked: "Dieser Text soll nic"
Anzeige mit SetMarked: "ht verschoben werden"
Habe es mit diesen Varianten versucht:

Code: Alles auswählen

(1)
GsGuiSleVar(  , dnGuiSleObject ):SetInputFocus  := { | uNIL1 , uNIL2 , oSle | GsGuiSleFocusSet( oSle ) , oSle:SetMarked( { 1 , oSle:BufferLength + 1  } ) }
(2)
GsGuiSleVar(  , dnGuiSleObject ):SetInputFocus  := { | uNIL1 , uNIL2 , oSle | GsGuiSleFocusSet( oSle ) , oSle:SetMarked( { oSle:BufferLength + 1 , 1  } ) }
(3)
(funktioniert nicht, nur wenn man es manuell macht, dann sogar richtig!)
GsGuiSleVar(  , dnGuiSleObject ):SetInputFocus  := { | uNIL1 , uNIL2 , oSle | GsGuiSleFocusSet( oSle ) , PostAppEvent( xbeP_Keyboard , xbeK_END , , oSle ) ,
PostAppEvent( xbeP_Keyboard , xbeK_SH_HOME , , oSle ) }
(4)
GsGuiSleVar(  , dnGuiSleObject ):SetInputFocus  := { | uNIL1 , uNIL2 , oSle | GsGuiSleFocusSet( oSle ) , PostAppEvent( xbeP_Keyboard , xbeK_CTRL_A , , oSle ) }
Vielleicht hat jemand eine Idee oder sogar Lösung?

Gruß
Roland

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Fr, 14. Mär 2014 22:19
von georg
Hallo, Roland -


hast Du mal versucht, ein xbeK_END gefolgt von einem xbeK_SH_HOME via AppEvent() an das SLE zu schicken? Das könnte die Tastatureingabe simulieren, die Du brauchst.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Sa, 15. Mär 2014 9:55
von brandelh
Versuche mal die Werte für Anfang und Ende der Markierung auf höherer Wert zu niedrigem Wert einzustellen, also so als ob du per Hand von hinten nach vorne markiert hättest.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Sa, 15. Mär 2014 16:54
von georg
Hallo, Hubert -


wenn ich das recht sehe, hat Roland das im zweiten Beispiel in seinem Code bereits versucht.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: So, 16. Mär 2014 19:01
von DelUser01
Hallo Georg und Hubert,

beides habe ich bereits versucht (siehe Code im ersten Eintrag).
Das mit _END und _SH_HOME brachte keine Markierung.

Habe das Problem auch an Alaska gegeben.
Mal sehen, vielleicht gibt es noch weitere Möglichkeiten...

Grüße,
Roland

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Mo, 17. Mär 2014 11:01
von Dieter
Hallo Roland,

jedes xbpSle hat eine :handleEvent(nEvent,mp1,mp2)-Methode in der das Standardverhalten im Falle eines Setinput-Ereignisses abgehandelt wird. Wenn man ein anderes Verhalten wünscht, dann muss man eine eigene Klassen-Methode MeinSle:handleEvent schreiben.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Mo, 17. Mär 2014 11:18
von DelUser01
Hallo Dieter,

ich bin nach vielen Jahren immer noch dabei meine Hybrid-Anwendung Schritt für Schritt auf GUI umzustellen. Da bin ich noch weit weg solche speziellen Anpassungen machen zu können bzw. mir einfällt wie das zu bewerkstelligen wäre.
Es kommt halt immer wieder einmal vor, dass mir bzw. meinen Anwendern Differenzen zwischen CRT und GUI auffallen bzw. Probleme bereiten.
So eben hier beim beschriebenen Problem.
Da denke ich, ist das bestimmt auch schon anderen aufgefallen und ich benütze die vorhandenen Möglichkeiten nur nicht richtig.

Gruß
Roland

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Mo, 17. Mär 2014 13:46
von brandelh
das beschriebene Verhalten ist normal, wenn ein SLE kürzer als der angezeigte Text ist und du es von links markierst, wird das Ende angezeigt (das habe ich eben im FireFox probiert.).
Wenn ich dort aber an das Ende gehe und von hinten nach vorne markiere, dann wird der Anfang gezeigt, denn dort ist der cursor !

Daher mein Vorschlag mit den von/ bis Parametern experimentieren, es kann aber sein, dass die Markierung bei Xbase++ immer von links nach rechts geht, das habe ich noch nicht probiert.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Mo, 17. Mär 2014 14:22
von brandelh
so ich habe es mal jetzt versucht und kann nur bestätigen, dass Xbase++ beim Markieren immer von links nach Rechts markiert:

Code: Alles auswählen

::sleTest_1:setData("ANFANG123456789bcdefghijklB123456789erddfgnmjhujhjgjC123456789ENDE")
::sleTest_1:setFirstChar(1) }
::pbSave:activate := {|p1,p2,p3,oXbp| oXbp := ::sleTest_1,;
                                         oXbp:setMarked( { len(oXbp:getData())+1 , 1 },;
                                         oXbp:setFirstChar(1) }
wenn man nach dem Markieren auf Pos1 drückt, ist die Markierung weg.

oXbp:setFirstChar(1) hätte sowas vielleicht unter OS/2 gerichtet, aber für Win32 ist diese Methode nicht verfügbar.

Die einzige Lösung die mir einfällt ist, das SLE größer zu machen, bis alles angezeigt wird.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Mo, 17. Mär 2014 17:40
von DelUser01
Hallo Hubert,

zur Info die Antwort vom techn. Support Alaska Software:
Es ist leider so, dass wenn Text im Sle markiert wird, der Text Buffer vom Betriebssystem nach links gescrollt wird.
Das geschieht unabhängig davon ob der Text vorwärts oder rückwärts markiert wurde.
Die Klasse XbpSle hat eine Methode :setFirstChar(), die genau das tut, was sie fordern würden - nämlich den ersten Buchstaben in der Anzeige bestimmen zu können - leider wird diese Funktionalität auf der Windows Plattform nicht unterstützt.
Insofern kann ich leider keine Lösung bieten um nach der Markierung eines langen Textes trotzdem den Anfang zu zeigen.
Dann muss ich eben damit leben...

Gruß
Roland

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Di, 18. Mär 2014 16:43
von brandelh
Das geschieht unabhängig davon ob der Text vorwärts oder rückwärts markiert wurde.
aber nur bei XbpSLE() im FireFox habe ich das anders gesehen :-)

Das nützt aber natürlich nichts, du mußt dafür sorgen, dass die SLE lang genug sind oder eventuell die Schriftgröße senken.

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Di, 18. Mär 2014 20:26
von DelUser01
Hallo Hubert,

auch im SLE funktioniert das manuell rückwärts:
Taste "Ende"
danach
Taste "Shift" + ""Pos1"
Dann ist das Feld markiert und der Cursor steht an erster Position.

Das habe ich versucht nachzuvollziehen mit xbeK_END und xbeK_SH_HOME.
Der Cursor steht dann zwar an erster Position aber das Feld ist nicht markiert.

Gruß
Roland

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Fr, 21. Mär 2014 22:37
von AUGE_OHR
brandelh hat geschrieben:oXbp:setFirstChar(1) hätte sowas vielleicht unter OS/2 gerichtet, aber für Win32 ist diese Methode nicht verfügbar.
hm ... c:\ALASKA\XPPW32\Source\samples\solution\xbpget\XBPGET.PRG

Code: Alles auswählen

METHOD XbpGet:home
   LOCAL aMarked, lClear := ::get:clear

   IF ::Get:hasFocus
      ::get:home()
   ELSE
      ::Get:pos := 1
   ENDIF

   ::get:clear := lClear
   ::XbpSle:setFirstChar( ::get:pos )

   IF Set( _SET_INSERT )
      aMarked := { ::Get:Pos, ::Get:Pos }
   ELSE
      aMarked := { ::Get:Pos, ::Get:Pos + 1 }
   ENDIF

   ::SetMarked( aMarked )
RETURN self

Re: SLE Text Markieren und Cursor am Text-Anfang

Verfasst: Do, 20. Jul 2017 23:08
von Werner_Bayern
Die Lösung:

Code: Alles auswählen

::delete(1, 0)
Macht das, was

Code: Alles auswählen

::SetFirstChar(1)
machen sollte.

Code: Alles auswählen

SetFirstChar
kann aus allen Quellcodes gestrichen werden...