Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

SLE Text Markieren und Cursor am Text-Anfang

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Roland Gentner » Fr, 14. Mär 2014 14:03

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
Gruß
Roland

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1934
Registriert: Fr, 08. Feb 2008 21:29

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von georg » Fr, 14. Mär 2014 22:19

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.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von brandelh » Sa, 15. Mär 2014 9:55

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.
Gruß
Hubert

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1934
Registriert: Fr, 08. Feb 2008 21:29

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von georg » Sa, 15. Mär 2014 16:54

Hallo, Hubert -


wenn ich das recht sehe, hat Roland das im zweiten Beispiel in seinem Code bereits versucht.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Roland Gentner » So, 16. Mär 2014 19:01

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
Gruß
Roland

Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 198
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Dieter » Mo, 17. Mär 2014 11:01

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.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Roland Gentner » Mo, 17. Mär 2014 11:18

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
Gruß
Roland

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von brandelh » Mo, 17. Mär 2014 13:46

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.
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von brandelh » Mo, 17. Mär 2014 14:22

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.
Gruß
Hubert

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Roland Gentner » Mo, 17. Mär 2014 17:40

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
Gruß
Roland

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von brandelh » Di, 18. Mär 2014 16:43

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.
Gruß
Hubert

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Roland Gentner » Di, 18. Mär 2014 20:26

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
Gruß
Roland

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von AUGE_OHR » Fr, 21. Mär 2014 22:37

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
gruss by OHR
Jimmy

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von Werner_Bayern » Do, 20. Jul 2017 23:08

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...
es grüßt euch

Werner

Antworten