Memoedit und einfügen von fertigen Textzeilen ...?!?

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

Moderator: Moderatoren

Antworten
dvdbommel
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Sa, 11. Feb 2006 11:07

Memoedit und einfügen von fertigen Textzeilen ...?!?

Beitrag von dvdbommel »

Hm .. wie soll ich das beschreiben ...

also ...

ich verwende memoedit() ...

ist es möglich während ins memoedit Fenster was eingegeben wird ...

aus einer DBF Datenbank mit vorgefertigten Textphrasen ...

so wie

"Hallo"
"Guten Morgen wie geht es"
"Mit freundlichen Grüßen"

eine auszuwählen und in den Text einzufügen an der Stelle wo der Cursor gerade steht ....

und dann einfach weiter per hand eingeben

ich hoffe ich habe mich verständlich ausgedrückt

Gruß Frank
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Frank,
ja. :D
Du könntest z.B. mit PostAppEvent() die Tastendrücke an das MLE senden...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Frank

so ähnlich könnte die Funktion aussehen die bei einem Enter im MLE ausgelöst wird.

Code: Alles auswählen

/***********************************************************
        Name : translateKuerz
        Does : übersetzt den Kürzeltext in Langtext
***********************************************************/
METHOD dlgBlock:translateKuerz(oMle)
    //** DEC VAR
    LOCAL iOldSelect := SELECT()
    LOCAL iOldRecno  := 1
    LOCAL aMarked    := {}
    LOCAL iPosMark   := 0
    LOCAL iCount     := 0
    LOCAL cKuerzel   := ""
    LOCAL cText      := ""
    LOCAL cMle       := ""

    if( ( 27 )->(Used()) )
        SELECT 27 //-- texte.dbf
        iOldRecno := Recno()

        //-- Kursorposition ermitteln
        aMarked := oMle:queryMarked()
        iPosMark:= aMarked[2]

        //-- Mle-Inhalt auslesen
        cMle    := oMle:getData()
        cText   := SPACE(6)+cMle                    //-- "      ##Das ist eine Test td##"
        cText   := substr(cText,aMarked[2],6)       //-- "t td##"
        cText   := strtran(cText,CHR(13),"")        //-- "t td#"
        cText   := strtran(cText,CHR(10),"")        //-- "t td"
        cText   := RTrim(cText)                     //-- "t td"
        cText   := substr(cText,rAt(" ",cText)+1)   //-- "td"
        cText   := Upper(Alltrim(cText))
        cKuerzel:= cText+Space( 5-Len(cText) )
        //Msg(,"|"+cKuerzel+"|")

        if(.not.Empty(cKuerzel))
            LOCATE FOR (cKuerzel == KRZ).And.(ART == ::cFilter)
            if(found())
                cText := Rtrim(TEXT)
                //-- Ersetzung einfügen
                cKuerzel :=  Alltrim(cKuerzel)+"  "
                iCount := iPosMark - (Len(cKuerzel))
                iCount := Max(1,iCount)
                //Msg(,iPosMark)
                //Msg(,iCount)
                oMle:setMarked( { iPosMark, iCount} )
                oMle:cutMarked()
                oMle:insert( , cText )
            endif
        endif
        
        GOTO iOldRecno
    endif
    SELECT(iOldSelect)
RETURN NIL
Grüße Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Frank,

meinst du MemoEdit() oder XbpMLE()'s ?

Wenn du wirklich ein MemoEdit() meinst, kann man über keyboard die Texte einstreuen, wobei über Funktionstasten eine Funktion mit achoice etc. aufgerufen werden kann um die Auswahl des Textes zu ermöglichen :

Code: Alles auswählen

#include 'inkey.ch'
...
set key K_F2  to MyTextAuswahl()
memoedit()...
...
function MyTextAuswahl()
//... Achoice, oder je nach Funktionstaste, ich machs mir einfach...
return "Mein Text"
...

so ähnlich habe ich im DEVCON Projekt Hilfslisten mit F2 je nach Feldname realisiert. dev_f2.prg hat dazu Beispiele, wobei ich bei GET Variablen meist direkt den Buffer setze.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Hubert,

ich habe ein ähnliches Problem mit MemoEdit im Hybridmodus.
Ich habe eine allgemeine Routine "ZwischenablageEinfuegen()", die bei Eintippen von Strg-V im XbpCrt-Fenster in das aktive Eingabefeld den Inhalt der Zwischenablage schreiben soll. Mit Getfeldern funktioniert das auch gut, indem ich kurzerhand den Text in den Tastaturpufferschreibe und vor CR+LF noch ein Strg-Y für das Löschen bis zum Zeilenende einfüge.
Bei MemoEdit darf ich jedoch Strg-Y nicht einfügen, da hierbei die komplette Zeile gelöscht wird. Es gelingt mir aber nicht innerhalb ZwischenablageEinfuegen() festzustellen, ob ein MemoFeld aktiv ist!

Hat jemand eine Lösung?

Uli
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,

ich hoffe das ich das richtig verstehe :
1.) mit Memoline kann ich ja feststellen in welcher Zeile der Cursor im
Memofeld steht.
2.) angenommen 3 Zeilen und du stehst auf der 2st Zeile und willst dort
vor der 3st Zeile noch "myText" einfügen

Code: Alles auswählen

 FOR n:=1 TO nMaxLines 
     aLines[ n ] := Trim( MemoLine( cText, 80, n ) ) 
 NEXT 
 cVor := aLines[1]+aLines[2]
 cDazu := myText
 cNach := aLines[3]

 REPLACE myMemo with (cVor+cDazu+cNach)
 
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Frank.

Bei mir können Textbausteine aus einem Browse ausgewählt werden und sie werden an der Stelle im MLE-Text eingefügt, an der man gerade stand. Zudem werden bestimmte Tastaturkürzel direkt während der Eingabe ausgewertet und ggf. gegen Textbausteine ausgetauscht. Wenn man zum Beispiel "#mfg" tippt, erscheint "Mit freundlichen Grüßen". Ich kann den Code mal posten, aber erst am Montag. Genügt das?
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

sein Problem ist, dass er memoedit nutzt und nicht XbpMLE().
Die GET Felder auf das STRG-Y anders reagieren als das Memoedit.

Bei Memoedit kannst du eine benutzerdefinierte Funktion hinterlegen, die auf den Steuercode z.B. F2 gedrückt anders reagiert als die Standardbehandlung mit Set key festgelegt hat. Leider ist es ewig her dass ich damit gearbeitet habe.

Ein zweiter Ansatz ist, dass die Funktion die durch z.B. F2 aufgerufen wird den Prozedur und Variablennamen übergeben bekommt. Je nachdem was da drin steht könntest du unterscheiden welche Hilfe bzw. Übergabe du machst. So mache ich das auch in meinen Programmen. Sie dir dazu die Funktionen im ..._F2.PRG des Devcon Programmes an.
Gruß
Hubert
Paul
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 43
Registriert: Mi, 21. Mär 2007 15:22
Wohnort: 1230 Wien

Beitrag von Paul »

Hallo,

Hab hier eine kleine memoedit - routine mit macros über Alt-Tasten

Grüsse aus dem verregneten Wien



/*** --------------------- ***/

FUNCTION PKMULTIEDIT ( cHeader, cMemo, csiz1, csiz2 )
Local GetList := {}, GetOptions, oDlgmem, _cMemo, aRef, oMenuMacro, kmacm,i,ctext,oCol, oRow,;
oMemo ,oMenmem , lOk, kmac, kmaca, ismac := .f., newmac := .f., iserst := .t., mp1

DEFAULT csiz1 := 55, csiz2 := 10

kmac := {}
kmacm := {}
IF FILE(MEMVAR->CurrentPath+"MACROS.AR")
kmac := DC_ARRAY_R( MEMVAR->CurrentPath+"MACROS.AR")
if Len(kmac) > 0
ismac := .t.
i := 1
FOR i = 1 to len(kmac)
AADD(kmacm, kmac[i,1]+" = "+Alltrim(kmac[i,2]))
NEXT
else
AADD(kmacm, "Keine Macros eingetragen")
endif
ELSE
AADD(kmacm, "Keine Macros eingetragen")
ENDIF


//DEFAULT cHeader := 'Memo-Text', _cMemo := space(10), csiz1 := 55, csiz2 := 10

_cMemo := cMemo
i := 1

@ 1.5,2 DCMULTILINE cMemo ;
SIZE csiz1, csiz2 ;
OBJECT oMemo ;
FONT "10.Courier" ;
ID 'KFMEMO' ;
MESSAGE 'Rechte Maustaste f
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo allerseits,

da keine Lösungen zur Feststellung, ob ein MemoFeld aktiv ist, gekommen sind, geht dies vermutlich mit Standard-xBase nicht.

Ich habe mir nun mit Hilfe einer Routine UTsMemoEdit() geholfen,
die kurzerhand im Cargo-Feld des zugehörigen Threads einträgt, das MemoEdit aktiv ist:

Code: Alles auswählen

FUNCTION UTsMemoEdit( cString,nTop,nLeft,nBottom,nRight,lEditMode,bcUserFunc,nLineLen,nTabSize,nBufferRow,nBufferCol,nWindowRow,nWindowCol )
LOCAL cReturn,oThread,OldThreadCargo
  oThread := ThreadObject()
  OldThreadCargo := oThread:Cargo
  oThread:Cargo := { "MemoEdit",nTop,nLeft,nBottom,nRight }  // Fuer MemoEditActive()!
  cReturn := MemoEdit( @cString,@nTop,@nLeft,@nBottom,@nRight, @lEditMode,@bcUserFunc,@nLineLen,@nTabSize,@nBufferRow, @nBufferCol, @nWindowRow, @nWindowCol )
  oThread:Cargo := OldThreadCargo
RETURN( cReturn )
Das Cargo-Feld kann ich dann an geeigneter Stelle abfragen und bekomme zusätzlich noch die Größe und Position des Memofeldes. :D

Uli
Antworten