SLE Text Markieren und Cursor am Text-Anfang

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
DelUser01

SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
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: SLE Text Markieren und Cursor am Text-Anfang

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

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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.
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: SLE Text Markieren und Cursor am Text-Anfang

Beitrag von georg »

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 S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
DelUser01

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
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: SLE Text Markieren und Cursor am Text-Anfang

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

Dieter

Was man nicht versteht, besitzt man nicht.
DelUser01

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

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

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SLE Text Markieren und Cursor am Text-Anfang

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

Re: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
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: SLE Text Markieren und Cursor am Text-Anfang

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: SLE Text Markieren und Cursor am Text-Anfang

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

Werner

<when the music is over, turn off the lights!>
Antworten