EditorGadget - Cursorproblem
Verfasst: 04.11.2007 14:54
Hallo,
ich habe zurzeit ein Problem mit dem EditorGadget.
Beim Schreiben fiel mir auf, dass beim EditorGadget, den ich in PB erstellt habe, einen Unterschied zu den anderen Editoren hat.
Zum Beispiel: PB Editor, Windows Editor (Notepad) etc.
Wenn man einen langen Text geschrieben hat und der Cursor befindet sich am Ende des Textes, aber wenn man mit der Rücktaste den Text nach und nach wieder löscht, dann stellt man fest, dass der Cursor und der Text selber nach oben springt.
Bei den anderen „normalen“ Editoren, ist der Fall nicht.
Der Cursor bleibt weiterhin beim Drücken der Rücktaste unten (Ende der Zeile des EditorGadgets).
Das einigste worauf man achten muss, ist die Cursorposition.
Hier ein Screenshot, ein Ablauf des Problems.
Jetzt können alle User das Problem verstehen (hoffentlich nicht
)
Screenshot:

Alte Source-Beispiele:
Thread bereinigt wegen unverständlicher Problembeschreibung
(RSBasic)
ich habe zurzeit ein Problem mit dem EditorGadget.
Beim Schreiben fiel mir auf, dass beim EditorGadget, den ich in PB erstellt habe, einen Unterschied zu den anderen Editoren hat.
Zum Beispiel: PB Editor, Windows Editor (Notepad) etc.
Wenn man einen langen Text geschrieben hat und der Cursor befindet sich am Ende des Textes, aber wenn man mit der Rücktaste den Text nach und nach wieder löscht, dann stellt man fest, dass der Cursor und der Text selber nach oben springt.
Bei den anderen „normalen“ Editoren, ist der Fall nicht.
Der Cursor bleibt weiterhin beim Drücken der Rücktaste unten (Ende der Zeile des EditorGadgets).
Das einigste worauf man achten muss, ist die Cursorposition.
Hier ein Screenshot, ein Ablauf des Problems.
Jetzt können alle User das Problem verstehen (hoffentlich nicht

Screenshot:
Alte Source-Beispiele:
Shardik hat geschrieben:Dieses Code-Beispiel klemmt die Rück-/Backspace-Taste im Editor-Gadget mit Hilfe eines Callback komplett ab:
Der Nachteil liegt darin, daß der eingegebene Text nicht mehr mit der Rück-Taste gelöscht werden kann. Dagegen funktioniert das Löschen von Zeichen mit der "Entf"-Taste (z.B. nach Änderung der Cursor-Position mit den Pfeiltasten) weiterhin problemlos. Soll die Zurück-Taste nur auf der ersten Zeichenposition einer Zeile abgeschaltet werden, müßte eine entsprechende Abfrage noch im Callback eingebaut werden.Code: Alles auswählen
Procedure EditorCallback(WindowHandle.L, Msg.L, wParam.L, lParam.L) Shared PreviousCallback.L If Msg = #WM_KEYDOWN If wParam = #VK_BACK ProcedureReturn 0 EndIf EndIf ProcedureReturn CallWindowProc_(PreviousCallback, WindowHandle, Msg, wParam, lParam) EndProcedure OpenWindow(0,0,0,500,500,"Windows-Vorlage",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) CreateGadgetList(WindowID(0)) EditorGadget(1,10,10,480,480,0) PreviousCallback = SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @EditorCallback()) SetActiveGadget(1) Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Shardik hat geschrieben:Hier ist die Version, bei der die Rück-Taste nur für die erste Spalte abgeschaltet ist (wie die Ermittlung der Cursor-Position im EditorGadget funktioniert, hat netmaestro im englischen Forum bereits gezeigt: http://www.purebasic.fr/english/viewtop ... 50&start=3)Code: Alles auswählen
Procedure EditorCallback(WindowHandle.L, Msg.L, wParam.L, lParam.L) Shared PreviousCallback.L Protected CharPosition.L Protected CurrentColumn.L Protected CurrentLine.L If Msg = #WM_KEYDOWN If wParam = #VK_BACK SendMessage_(GadgetID(1), #EM_GETSEL, @CharPosition, 0) CurrentLine = SendMessage_(GadgetID(1), #EM_LINEFROMCHAR, -1, 0) CurrentColumn = CharPosition - SendMessage_(GadgetID(1), #EM_LINEINDEX, -1, 0) If CurrentColumn = 0 ProcedureReturn 0 EndIf EndIf EndIf ProcedureReturn CallWindowProc_(PreviousCallback, WindowHandle, Msg, wParam, lParam) EndProcedure OpenWindow(0,0,0,500,500,"Windows-Vorlage",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) CreateGadgetList(WindowID(0)) EditorGadget(1,10,10,480,480,0) PreviousCallback = SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @EditorCallback()) SetActiveGadget(1) Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
#NULL hat geschrieben:so geht schon das was du willst (der code ist in der form natürlich quark), aber du kriegst andere probleme, z.b. kann man mit dem cursor zu weit hoch laufen. vielleicht mußt du vorher die altuelle scrollweite checken, oder die cursor position.Code: Alles auswählen
OpenWindow(0,0,0,500,200,"Windows-Vorlage",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) CreateGadgetList(WindowID(0)) EditorGadget(1,10,10,480,180,0) :: SetActiveGadget(1) Repeat event = WaitWindowEvent() SendMessage_(GadgetID(1), #EM_SCROLL, #SB_LINEDOWN, 0) Until event = #PB_Event_CloseWindow
kannst das ja auch mal in ein callback bauen und nur bei rücktaste ausführen. vielleicht eigntet sich auf eine andere konstante als #SB_LINEDOWN.
mußte mal hier gucken: http://msdn2.microsoft.com/en-us/library/bb775458.aspx ..bei > messages > EM_SCROLL oder WM_VSCROLL
<edit>scheint ganz gut zu gehen.Code: Alles auswählen
SendMessage_(GadgetID(1), #WM_VSCROLL, #SB_ENDSCROLL, 0)
Problembeschreibung in der dritten Person:Falko hat geschrieben:Naja, wer den Notepadeditor kennt, weiss, was gemeint ist![]()
Anscheinend kann das EditorGadget() ohne API sowas nicht!!
Enter so lange drücken, bis der Cursor unten ist und sich der vertikale
Scrollbalken zeigt und verkleinert. Danach mal einfach die Backspacetaste
festhalten, sodaß der Cursor wieder bis zur ersten Zeile.
Dann mal die Augen aufmachen und sich wundern, warum das beim EditorGadget mit dem Cursor anders ist.![]()
Mit dem Stringgadget wird der Notepad schon eher getroffen, ganz ohne API
[Edit] Zu langsam. Vorgänger hat es gut beschrieben. Nun macht malCode: Alles auswählen
If OpenWindow(0,0,0,500,500,"Windows-Vorlage",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) If CreateGadgetList(WindowID(0)) StringGadget(1,10,10,480,480,"",#ES_MULTILINE| #ES_AUTOHSCROLL|#WS_VSCROLL ) EndIf Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow EndIf
den Scrollbalken wieder weg![]()
[/Edit]
Gruß Falko
--------------------------------------------------Shardik hat geschrieben:Hurra, ich habe es endlich kapiert...![]()
![]()
![]()
Ich versuche einmal das Problem mit meinen Worten in Form einer Anleitung nachvollziehbar zu machen:
1.Schritt: RSBasics erstes Code-Beispiel aus dem ersten Beitrag kopieren, in die PureBASIC-IDE einfügen und starten
2.Schritt: Den Cursor mit Mausklick in Zeile 1 und Position 1 sichtbar machen
3.Schritt: Solange <Enter> drücken bis ein Scroll-Balken erscheint
4.Schritt: Dann noch dreimal zusätzlich <Enter> drücken
5.Schritt: Dann dreimal die Rück-Taste drücken
Ergebnis: Der Cursor wandert hoch, aber eigentlich sollte er ja am Ende des Gadgets stehenbleiben und nur der Scroll-Balken sollte sich verkürzen
6.Schritt: Noch einmal die Rück-Taste drücken und voilá: der Scrollbalken ist weg und der Cursor steht wieder am Ende des Editor-Gadgets
Jetzt muß nur noch jemand eine Lösung finden...
Thread bereinigt wegen unverständlicher Problembeschreibung
(RSBasic)