ich kämpfe da mit einem merkwürdigen Problem: Oberfläche ist VIO, und es gibt dort ein SLE. Das deswegen, weil dort Strings kopiert werden sollen, die länger sind als 100 Zeichen. Sowas geht mit einem SAY nicht, weil der Tastaturpuffer alles über 100 Zeichen kappt.
Ich habe also ein DbEdit. geht man dort auf dem gewünschten Satz auf ENTER, springt der in die Funktion die das SLE aufbaut. Da wartet der, das man STRG+V drückt, das sollte den Inhalt der Zwischenablage da rein kopieren, und dann kann ich das SLE verlassen, die Daten werden an das DbEdit zurückgegeben und in der dbf gespeichert.
Soweit die Theorie.
Praktisch gesehen klappt das aber nicht immer. Gestern lief das den ganzen Tag, heute spinnt der. Exakt die gleiche Programmversion. Was passiert ist: Im Explorer wird eine datei amrkeirt, rechte maustaste "Umbenennen", STRG+C. Damit ist der Dateiname in der Zwischenablage. Mache ich jetzt im SLE ein STRG+V, dann kopiert der da zwei Leerzeichen + crlf rein. Und das 2x hintereinander. Die Zwischenablage hat nach dem Prozess den gleichen kaputten Inhalt. Kopiere ich aber den Inhalt der Zischenablage erstmal in einen Editor, markiere mir das da, und füge das dann in das SLE ein, dann ist der Inhalt da drin.
Mein Problem ist: Ich hab in der Event-Schleife eine Abfrage auf STRG+V drin, um dann per :pastemarked() den Inhalt einzufügen. Da geht der aber nie rein! In die nächste Abfrage mit ENTER oder TAB dagegen immer, wenn eine dieser Tasten gedrückt worden ist. Die Schleife hatte ich ansich nur deswegen eingebaut, weil der mir das ohne nicht in den SLE-Buffer gelegt hatte. was dann gestern halt nach dieser Korrektur lief.
Was läuft da falsch? Ist das ein VIO/GUI-Konflikt? Überseh ich da was?
Das hier ist der Code in der aufgerufenen Funktion, mit einer Menge Sachen drin wegen Ausprobieren, da könnte man auch mal wieder was aufräumen:
Code: Alles auswählen
FUNCTION erfasseLink(aStart, cWert)
LOCAL oSle := NIL
LOCAL mp1 := NIL
LOCAL mp2 := NIL
LOCAL oXbpEvent := NIL
LOCAL nEvent := 0
LOCAL nWert := 0
Clear Typeahead
oSle := XbpSle():new(MEMVAR->oDlgApp, , aStart, {1000, 25})
oSle:dataLink := {|x| IIf(x = NIL, cWert, cWert := x)}
oSle:bufferLength := 250
oSle:create()
oSle:setData()
oSle:SetMarked({1, 250})
oSle:killInputFocus := {|x, y, oSle| nWert := -1}
SetAppFocus(oSle)
DO WHILE .T.
nEvent := AppEvent(@mp1, @mp2, @oXbpEvent)
oXbpEvent:handleEvent(nEvent, mp1, mp2)
IF nEvent = xbeK_CTRL_V
oSle:pasteMarked()
ELSEIF nEvent = xbeK_ENTER .OR. nEvent = xbeK_TAB
oSle:killInputFocus()
SetAppFocus(MEMVAR->oDlgApp)
ENDIF
IF nWert = -1
cWert := oSle:getData()
oSle:destroy()
oSle := NIL
SetAppFocus(MEMVAR->oDlgApp)
RETURN cWert
ENDIF
ENDDO
RETURN cWert