Text in MEMOEDIT einfügen mit GUI=YES [ERLEDIGT]

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Text in MEMOEDIT einfügen mit GUI=YES [ERLEDIGT]

Beitrag von dtmackenzie »

Ich bin endlich dazugekommen, unsere Textmodus-Anwendung probeweise mit GUI=YES zu kompilieren.
Die Benutzer nutzen häufig die Maus um (manchmal relativ große) Texte im DOS-Fenster zu kopieren (linke Taste selektieren, rechte Taste kopieren, rechte Taste einfügen).
Jetzt (GUI=YES) kann man mit runtergehaltener linker Maustaste einen Texbereich auswählen, der sich dann sofort in der Zwischenablage befindet (anstatt mit linker Taste auswählen dann mit rechter Taste selektieren zu müssen). Ist ja eigentlich nett, obwohl es manchmal nicht leicht ist zu sehen was man kopiert.
Allerdings geht das Einfügen nicht von allein, also habe ich selber ein Event für die rechte Maustaste definiert -

Code: Alles auswählen

    SetAppEvent(xbeM_RbClick, {|| DoPaste()})
worin ich den Text aus der Zwischenablage lese.
Ich habe versucht, den Text mit KEYBOARD einzufügen - ging gewissermaßen, aber selbst mit SET TYPEAHEAD 100 ist die Puffergröße unzureichend für meine Benutzer. Also habe ich nun die Funktion umgeschrieben um den GET-Puffer zu manipulieren -

Code: Alles auswählen

    PROCEDURE DoPaste()
    LOCAL oCB:=XbpClipBoard():new(), go:=GETACTIVE()

    IF !EMPTY(go) .AND. go:hasfocus
        IF oCB:open()
            go:buffer := SUBSTR(go:buffer, 1, go:pos - 1) +;
                         oCB:getBuffer(XBPCLPBRD_TEXT) +;
                         SUBSTR(go:buffer, go:pos)
            oCB:close()
        END
    END
    oCB:destroy()
    RETURN
Leider geht es so nicht - GETACTIVE() liefert immer NIL, keine Ahnung warum...
Ich wäre dankbar für jeden Hinweis oder alternativen Ansatz.

David
Zuletzt geändert von dtmackenzie am Mo, 07. Sep 2009 14:46, insgesamt 4-mal geändert.
Viele Grüße,
David
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: GetActive() liefert NIL mit GUI=YES

Beitrag von brandelh »

Hi,

verwendest du eine LOCAL GETLIST := {}
Bist du gerade im READ ?

Ich meine ich nutze GetActive() ohne Probleme.
Gruß
Hubert
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: GetActive() liefert NIL mit GUI=YES

Beitrag von dtmackenzie »

Hi Hubert,

hmmm, gute Fragen...
Ziemlich existenzieller Natur sogar.
"Wer bin ich? Wo bin ich? Was kann ich erfahren und tun?" - wenn ich in einem von der Maustaste ausgelöste Ereignis bin.
Ich "war" gerade in einem READ (ohne LOCAL GETLIST := {}), versuchte mit der rechten Maustaste einen Text einzufügen, aber vielleicht habe ich doch vom Ereignis aus keine Sicht auf das GET-System...
Ja, an anderen Stellen benutze ich auch GetActive() ohne Probleme.
Vielleicht könnte ich als Alternative z.B. die einzelne Zeichen des Textes als Keyboard-Events posten?
Da muss ich wohl über's Wochenende ein bißchen nachdenken...

Danke für den Gedenkanstoß und schönes Wochenende!
David
Viele Grüße,
David
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: GetActive() liefert NIL mit GUI=YES

Beitrag von dtmackenzie »

OK, falscher Fehler.
Dass es nicht ging lag doch nicht an GETACTIVE() - ich habe mich vom Debugger täuschen lassen, ist ja verständlich.
Debuggen ohne Debugger (mit ALERTs) ergab, dass die Zuweisung in GETACTIVE():buffer wirkungslos war.
Mit varPut() geht's -

Code: Alles auswählen

PROCEDURE DoPaste()
LOCAL oCB:=XbpClipBoard():new(), oGet:=GETACTIVE(), cText:=""

IF !EMPTY(oGet) .AND. oGet:hasfocus
    IF oCB:open()
        cText := oCB:getBuffer(XBPCLPBRD_TEXT)
        IF RIGHT(cText,2) == crlf
            cText := LEFT(cText, LEN(cText) - 2)
        END
        oGet:varPut(SUBSTR(oGet:buffer, 1, oGet:pos - 1) +;
                    cText +;
                    SUBSTR(oGet:buffer, oGet:pos))
        oCB:close()
    END
END
oCB:destroy()

RETURN
Nur noch eine Sache - ich schneide nun auch das CRLF ab was sich am Ende der Zwischenablage befindet.
Nun werde ich versuchen, die Fenstergröße zu ändern (Hauptnutzen von GUI=yes) - nächstes Thema kommt bestimmt...

Nachtrag: Das ist doch nicht ganz das Ende vom Lied - da muss ich es auch mit MEMOEDIT hinkriegen. Da gibt es doch kein GETACTIVE(), hat vielleicht auch zu meiner Verwirrung beigetragen... Ich werde versuchen, in der UDF etwas zu machen.

David
Viele Grüße,
David
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Text in MEMOEDIT einfügen mit GUI=YES

Beitrag von dtmackenzie »

Die UDF vom MEMOEDIT wird doch aufgerufen wenn die rechte Maustaste gedruckt wird - 4 oder 6 mal sogar, abhangig davon wie schnell geklickt wird.
Allerdings weiß ich noch nicht wie ich entscheiden soll, ob dies die Ursache für den Aufruf war - die Parameter helfen nicht.
Selbst wenn ich das hinkriege, weiß ich nicht wie ich den Text reinkriegen - ich habe ein paar verlockende Referenzen zu ME_PASTE in MEMOEDIT.CH gefunden, aber keine schlüssige Beschreibung.
Hat jemand schon Erfahrung mit dem Problem "Einfügen in MEMOEDIT"?
Danke im Voraus!

David
Viele Grüße,
David
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Text in MEMOEDIT einfügen mit GUI=YES

Beitrag von dtmackenzie »

Also, nur um das Problem nochmal klarzustellen...

Ich muss mit der rechten Maustaste den (möglicherweise langen) Text aus der Zwischenablage in das aktive MEMOEDIT einfügen. Mir fallen nur zwei Stellen ein an dem dies vielleicht möglich sein könnte - im Ereignis xbeM_RbClick oder in der UDF-Funktion des MEMOEDITs.

xbeM_RbClick
Für ein normales GET-Feld kann ich dieses mit GETACTIVE() finden und dann manipulieren (s. Beiträge oben), aber das MLE des MEMOEDITs finde ich nicht. Weiß jemand wie man da rankommt? (Übrigens, für die einfache Lösung, den Text mit KEYBOARD einzufügen, gibt es leider eine Beschränkung auf 100 Zeichen durch SET TYPEAHEAD.)

UDF
Wenn die rechte Maustaste gedruckt wird, dann wird die UDF des MEMOEDITs mehrmals aufgerufen. Damit der Text nur einmal eingefügt wird, könnte ich vielleicht zur Not einen Zeitvergleich machen. Wie kann man aber rauskriegen, ob der Aufruf überhaupt durch die rechte Maustaste ausgelöst wurde? Kann man irgendwie checken, ob die rechte Maustaste gerade unten ist? Weiterhin, wie fügt man den Text dann ein - funktioniert ME_PASTE, und wenn so, wie?

Ich bin natürlich offen für beide Lösungsansätze oder ganz andere - im Moment komme ich nicht weiter mit dem Problem.
Viele Grüße,
David
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Text in MEMOEDIT einfügen mit GUI=YES

Beitrag von dtmackenzie »

Problem gelöst! Ich habe mehrmals darüber nachgedacht, den Text aus der Zwischenablage "häppchenweise" mit KEYBOARD wieterzugeben - das spart Sonderfälle für GETACTIVE(), MEMOEDIT-UDF und was auf immer. Wie sollte ich aber wissen, wann der KEYBOARD-Puffer bearbeitet wurde? Dann fiel mir ein, die Zeichen werden nun von KEYBOARD einfach in die Ereigniswarteschlange gestopft - also müßte ich nur ein xbeM_RbClick hinzufügen um das nächste Häppchen zu generieren...

Code: Alles auswählen

PROCEDURE DoPaste()
LOCAL oCB, nChunkSize:=SET(_SET_TYPEAHEAD)-5

STATIC cText:=""

IF EMPTY(cText)
    oCB := XbpClipBoard():new()
    IF oCB:open()
        cText := oCB:getBuffer(XBPCLPBRD_TEXT)
        IF RIGHT(cText,2) == cr // x0D0A
            cText := LEFT(cText, LEN(cText) - 2)
        END
        oCB:close()
    END
    oCB:destroy()
END
IF !EMPTY(cText)
    IF LEN(cText) > nChunkSize
        KEYBOARD LEFT(cText, nChunkSize)
        PostAppEvent(xbeM_RbClick)
        cText := SUBSTR(cText, nChunkSize)
    ELSE
        KEYBOARD cText
        cText := ""
    END
END

RETURN
Viele Grüße,
David
Antworten