Cursor bei SLE und MLE ändern?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
DelUser01

Cursor bei SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo

Sicher ist das schon irgendwo zum x-ten Mal diskutiert - habe es aber nicht gefunden:
Kann die Darstellung des Cursors bei SLE und MLE geändert werden?

Grund:
Habe Kunden die wollen weiterhin im Überschreiben-Modus arbeiten (Umstellung CRT->GUI). Das geht soweit auch danke Alaska-Support, aber es wird bemängelt dass es eben nicht ersichtlich ist wenn der Überschreibmodus aktiv ist.

Das mit :SetMarked(,) zu machen ist nicht so der richtige Weg. Und mit :SetPointer() ich es nicht geschafft.

Vielleicht gibt es doch noch eine Möglichkeit?

Gruß
Roland
Zuletzt geändert von DelUser01 am Sa, 12. Apr 2014 21:15, insgesamt 1-mal geändert.
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

:SetPointer() würde das Aussehen des Mauszeigers ändern, z.B. wenn du willst, dass beim "überfahren" eines Kontrols ein anderer Mauszeiger kommt.

Ich habe irgendwo gelesen, dass Windows KEINEN Überschreibemodus kann. OS/2 konnte das !
In Windows wird dieser tatsächlich dadurch simmuliert, dass beim Tippen auf Einfg das nächste Zeichen markiert wird.
Bei der Eingabe wird dieses dann durch das neue Zeichen ersetzt und man müsste das nächste Zeichen markieren.

In meinem GUI Beispielprogramm mit dem ich mein Framework teste zeigt aber weder das SLE noch das MLE dieses Verhalten.
Die können nur mit AUTOMARK komplett markieren, dann wird aber der komplette Inhalt durch ein neues Zeichen ersetzt.

Es gibt ein Beispiel, das GET simmuliert ... dort könntest du nachsehen aber vielleicht weiß jemand eine einfacher Lösung ;-)

Eventuell könnte man mit sendMessage() dem Control das Standard Windows Verhalten beibringen aber das habe ich noch nie gemacht.
Gruß
Hubert
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Hubert,

die Überschreiben-Funktion klappt soweit, nur haben die User damit Probleme dass die "Optik" nicht stimmt.
In der Vergangenheit haben die den Überschreib-Modus dadurch gesehen, dass ich den Blockcursor angezeigt habe:

Code: Alles auswählen

   If ReadInsert()
      SetCursor( SC_NORMAL )
   Else
      SetCursor( SC_SPECIAL1 )
   EndIf
Und das bringt eben jetzt nichts mehr - nur das fehlt denen.
(Mir fehlt es nicht aber Kunde ist König...)

Wie gesagt, Alaska-Support hat mir geholfen den Überschreibmodus zu integrieren. Es wird einfach ein Trick angewandt.
Mein Entwicklungs-Editor "Multi-Edit" zeigt im Einfüge-Modus einen Block-Cursor.
Notepad++ schaltet zwischen senkrechtem und waagrechtem Cursor um.

Gruß
Roland
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: Cursor bie SLE und MLE ändern?

Beitrag von Tom »

Der "Cursor" in einem SLE ist kein Pointer. Den kann man ändern, also das Aussehen des Mauszeigers, wenn er über ein SLE bewegt wird, aber die "Zeichenmarkierung" hat damit nichts zu tun.
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

SET CURSOR - Bildschirm-Cursor ein- oder ausschalten

ist ja ganz nett, wirkt aber leider nur bei GET bzw. XbpCrt() Anwendungen.
Der Strich im SLE ist weder ein Mauszeiger noch ein alter CURSOR ...

aber wie ich erwähnt hatte, gibt es ein Beispiel das deinen Wünschen entspricht:

...\XPPW32\source\samples\solution\xbpget

starte dort mal die Test.EXE
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

In xbpget.prg findet man dann die Klasse die das alte Tastaturverhalten erzwingen soll.
Der Überschreiben-Modus wird so simmuliert und optisch dargestellt !

Code: Alles auswählen

      /*
       * XbpGet hat den Fokus, Markierung setzen
       */
      IF Set( _SET_INSERT )
         ::SetMarked ( { ::Get:Pos, ::Get:Pos } )
      ELSE
         ::SetMarked ( { ::Get:Pos, ::Get:Pos + 1 } )
      ENDIF
Aber man muss natürlich alle möglichen Tasten und Situationen abfangen, daher besser diese Klasse verwenden.
Gruß
Hubert
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Tom

trotzdem fehlt mir jeglicher Ansatz um da was zu tun...

Gruß
Roland
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Hubert,

so wie mit dem test.exe wäre ja OK, gelöst mit :SetMarked().
Das klappt aber nicht richtig bei mir. Liegt vermutlich an meiner Eventverarbeitung.
Das springt der Cursor gleich zwei Zeichen oder läuft nicht mehr rückwärts.
Liegt daran, dass bei aktiver Markierung der Cursor eben hinter dem Markierten Zeichen sitzt.

Deshalb die Frage nach der Veränderung des Cursor-Zeichens.

Sonst werde ich mich in die Sache mit SetMarked() nochmal reinknien müssen.

Dann habe ich noch einen seltsamen Effekt:
Wenn ich in meiner Event-Schleife bei der Taste "Einfg" SetCursor(...) verwende, verschwindet der Cursor auf dem MLE.
Teile der Event-Schleife sind bei CRT und GUI in Betrieb.

Gruß
Roland
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

Wie du in dem Beispiel sehen kannst, reicht es NICHT einfach nur diese setMarked() zu setzen, man muss die Klasse ableiten (in den Slots kommt die Verarbeitung zu spät)
und daher hatte ich ja empfohlen statt XbpSLE() direkt die abgeleitete Klasse wie in TEST.PRG zu verwenden.

Ansonsten bleibt nur zu hoffen, dass es in Windows mit sendMessage eine entsprechende message gibt UND hier einer ist, der weiß wie es geht ;-)

:arrow: Pablo fragen ... :wink:
Gruß
Hubert
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Da muss ich schauen wie das reinpasst. Ich habe MLE und SLE abgeleitet und angepasst.

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: Cursor bie SLE und MLE ändern?

Beitrag von AUGE_OHR »

hi,

der Text Modus Cursor ist unter GUI der Maus Pointer (Zeiger) welche bei SLE / MLE in Form "Textauswahl" vom Betriebssystem dargestellt wird.
Eine Unterscheidung Einfügen / Überschreiben gibt es "so" nicht ... auch Word / Write / Notepad zeigen keine anderen Pointer an.



hast du so was wie eine Statusbar in deiner Maske ?

ich zeige die Zustände der 3 Tasten (CAPS,INS,NUM) in der Statusbar wie folgt an

Code: Alles auswählen

PROCEDURE KBSTATUS( oStatbar )
...
STATIC lCAPS := .F.
STATIC lINS  := .F.
STATIC lNUM  := .F.
...
   IF AppKeyState( VK_CAPITAL, .t. ) == APPKEY_TOGGLED
      IF lCAPS
      ELSE
         oStatbar:oCaps:SetcolorBG( GRA_CLR_RED )
         oStatbar:oCaps:InvalidateRect()
         lCAPS := .T.
      ENDIF
   ELSE
      IF lCAPS
         oStatbar:oCaps:SetcolorBG( GRA_CLR_BACKGROUND )
         oStatbar:oCaps:InvalidateRect()
         lCAPS := .F.
      ENDIF
   ENDIF

   IF AppKeyState( VK_INSERT, .t. ) == APPKEY_TOGGLED
      IF lINS
      ELSE
         oStatbar:oIns:SetcolorBG( GRA_CLR_RED )
         oStatbar:oIns:InvalidateRect()
         lINS := .T.
      ENDIF
   ELSE
      IF lINS
         oStatbar:oIns:SetcolorBG( GRA_CLR_BACKGROUND )
         oStatbar:oIns:InvalidateRect()
         lINS := .F.
      ENDIF
   ENDIF

   IF AppKeyState( VK_NUMLOCK, .t. ) == APPKEY_TOGGLED
      IF lNUM
      ELSE
         oStatbar:oNum:SetcolorBG( GRA_CLR_BACKGROUND )
         oStatbar:oNum:InvalidateRect()
         lNUM := .T.
      ENDIF
   ELSE
      IF lNUM
         oStatbar:oNum:SetcolorBG( GRA_CLR_RED )
         oStatbar:oNum:InvalidateRect()
         lNUM := .F.
      ENDIF
   ENDIF
...
das ganze läuft als Thread und ich rufe es so auf

Code: Alles auswählen

   oMSG := Thread() :new()
   oMSG:setInterval( 100 )
   oMSG:start( "KBSTATUS", oStatbar )
p.s. mit XbpStatusBar(), welches MsComCtl.OCX benötigt, kann man bei o:addItem() die <nStyle> Konstanten verwenden und benötigt keinen Thread.
p.s.p.s. mit dem native Statusbar aus der DXE LIB kann man das selbe machen ( siehe USEsBar.PRG )
gruss by OHR
Jimmy
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Jimmy

das habe ich mir schon gedacht dass es da keine Möglichkeiten gibt das "so einfach Mal zu ändern".
Im XbpCrt (und schon viel früher) habe ich permanent solche Status Infos. Das scheint den Anwendern aber nicht auszureichen, die form des Cursors sieht man ja schneller.
Vielleicht muss ich das optimieren. Ist jetzt noch in Textform |Ü|E| usw., vielleicht auch so wie Du mit grafischen Buttons.

Gruß
Roland
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Cursor bie SLE und MLE ändern?

Beitrag von Koverhage »

Unter Express++ habe ich im Normalmodus einen Blockcursor, im Insert Modus einen senkrechten Strich. Also muss es Möglichkeiten geben.
Gruß
Klaus
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: Cursor bie SLE und MLE ändern?

Beitrag von AUGE_OHR »

Koverhage hat geschrieben:Unter Express++ habe ich im Normalmodus einen Blockcursor, im Insert Modus einen senkrechten Strich. Also muss es Möglichkeiten geben.
ich bin kein Express++ User ... aber wenn ich mich nicht irre verwendet DC_XbpGet doch ein "invisible" GET ?
C:\exp19\Source\Dclipx\_dcxbpgt.prg
da funktioniert es ja wie Hubert schon als Code-Snip gezeigt hat.
gruss by OHR
Jimmy
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo

Habe nochmal mit ein paar meiner Anwender Rücksprache gehalten. Die Lösung dass zur Darstellung des Überschreibmodus je das nächste Zeichen (blau) "markiert" werden soll wäre keine so richtig akzeptable Lösung. Zudem wäre am Ende einer Zeile wieder kein Zeichen markiert. Ebenso bei einem leeren Feld.
Die "optische" Kompatibilität zu vielen anderen Programmen wäre nicht gegeben.

Wenn es mit :SetMarked() klappt mache ich es für die User Optional ein-/auszuschaltbar.

Gruß
Roland
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

was heißt hier Kompatibilität ?
zu was ?

Excel 2010 verhält sich genau wie ich es beschrieben habe.

|123 -> EINF -> 1 wird markiert, 5 getippt, 5 ersetzt die 1, 2 ist markiert ... wenn kein Zeichen mehr da ist wird der Cursor wieder zum dünnen Strich.

Word 2010 verhält sich so wie ein MLE, nämlich KEINE Markierung ...

Die Kompatibilität zu alten DOS Programmen kann man einfach nicht immer erreichen, das hätte M$ dann anders umsetzen müssen.

@Jimmy,

der Mauszeiger über dem SLE und MLE wird zwar zum "Textzeiger" aber dennoch blinkt daneben der Cursor an der Eingabestelle.
Beide haben nichts miteinander zu tun !

Interessant fand ich die Aussage, dass SetCursor(.f.) den Cursor in MLE abschalten können soll, das habe ich noch nicht probiert.

ABER wenn es einer weiß, dann Pablo :arrow: www.xbwin.com :wink:
Gruß
Hubert
DelUser01

Re: Cursor bei SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Hubert

Deine Beobachtung bei Excel ist prima - das ist ein gutes Argument.

Ich selbst hatte damit nie ein Problem und die Detailversessenheit an solchen Stellen ist ärgerlich. Das eigentliche Produkt kommt dadurch nicht arg voran.

Fällt unter die Rubrik "das ist schon immer so gegangen warum soll das jetzt nicht mehr gehen" und "geht nicht gibt's nicht".

Gruß
Roland
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: Cursor bie SLE und MLE ändern?

Beitrag von brandelh »

Ich persönlich finde es auch eine ZUMUTUNG wie wenig man bei den SLE und MLE einstellen kann.
Per Standard können die NIX oder NUR ZIFFERN (also ohne Punkt etc.) ... und der senkrechte Strich ist sehr unauffällig !
Aber es ist nunmal so von Microsoft vorgesehen worden ...
Gruß
Hubert
DelUser01

Re: Cursor bie SLE und MLE ändern?

Beitrag von DelUser01 »

Hallo Hubert

da hast Du recht, mich ärgert dabei meist der Gedanke dass viele das Rad immer wieder neu (für sich) erfinden müssen und das viiiiel Zeit kostet statt dass es solche Dinge in Xbase schon (teilweise) vorgefertigt gibt. Gern auch als kostenpflichtiges Zusatzmodul.
Und man könnte sich mit der ersparten Zeit dem eigentlichen Projekt widmen und nicht immer und immer wieder der Benutzeroberfläche...

Hubert - ich glaube wir streichen den Biergarten und gehen gleich ins Frühlokal... :wink:

Grüße
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: Cursor bie SLE und MLE ändern?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:ABER wenn es einer weiß, dann Pablo :arrow: http://www.xbwin.com :wink:
vermutlich wird er den WM_SETCURSOR Event abfangen um einen anderen Cursor zu setzten

Code: Alles auswählen

INLINE METHOD listview_wndproc(hWnd,nMsg,wp,lp,ctx)
       if (nMsg == WM_SETCURSOR) .and. ::lWaitCursor
          @user32:SetCursor(::hWaitCursor)
          return 1
       elseif ... 
für ::lWaitCursor könnte man die AppKeyState() Werte als Schalter nehmen.

die Frage ist nur : wie bekomme ich den Cursor zum blinken ?
gruss by OHR
Jimmy
Antworten