Seite 1 von 2

TX Text Control ActiveX

Verfasst: Di, 20. Jul 2021 19:52
von ramses
Hallo

arbeitet jemand mit dem Tool "TX Text Control ActiveX" ?

Gibt es irgendwo einige Beispiele wie man mit dem Teil in Xbase++ einen einfachen HTML - Mail Editor baut?

Re: TX Text Control ActiveX

Verfasst: Di, 20. Jul 2021 20:58
von Tom
1. Ja.
2. Ja. Nächste Woche. Bin im Urlaub.

Re: TX Text Control ActiveX

Verfasst: Di, 20. Jul 2021 21:04
von ramses
Tom hat geschrieben: Di, 20. Jul 2021 20:58 2. Ja. Nächste Woche. Bin im Urlaub.
Gerne, Danke.

Schönen Urlaub.

Re: TX Text Control ActiveX

Verfasst: Di, 20. Jul 2021 21:32
von Wolfgang Ciriack
Nur mal ganz auf die Schnelle als Anregung eine kurze Funktion von mir:

Code: Alles auswählen

******************************************************************************
Procedure BuildTx(oTxDlg, oTxC, aTxt, nTxEditmode)
LOCAL br := oTxDlg:Drawingarea:CurrentSize()[1]
LOCAL ho := oTxDlg:Drawingarea:CurrentSize()[2]
LOCAL oTxButtons, oTxRuler

	oTxButtons             := XbpActiveXControl():New(oTxDlg:Drawingarea, oTxDlg:Drawingarea, {0, ho - 28}, {br, 28})
	oTxButtons:CLSID       := CLSID_TXBUTTBAR
	oTxButtons:Create()
	oTxButtons:PosStyle    := 0
	oTxButtons:Appearance  := 3
	oTxButtons:Style       := 3
	oTxButtons:BorderStyle := 0

	oTxRuler               := XbpActiveXControl():New(oTxDlg:DrawingArea, oTxDlg:DrawingArea, {0, ho - 56}, {br, 28})
	oTxRuler:CLSID         := CLSID_TXRULER
	oTxRuler:Create()
	oTxRuler:BorderStyle   := 0

	oTxC                   := XbpActiveXControl():New(oTxDlg:Drawingarea, oTxDlg:Drawingarea, {0, 0},       {br, ho - 52})
	oTxC:CLSID             := CLSID_TXCONTROL
	oTxC:License           := TXCONTROL_KEY
	oTxC:Create()
	oTxC:ZoomFactor        := 100 * M->oGDL:nSpFakt
	oTxC:ViewMode          := 0
	oTxC:ButtonBarHandle   := oTxButtons:hWnd
	oTxC:RulerHandle       := oTxRuler:hWnd
	oTxC:TabKey            := .T.
	oTxC:FontName          := "Arial"
	oTxC:FontSize          := 11
	oTxC:BorderStyle       := 0
	if .not. empty(aTxt)
		oTxC:LoadFromMemory(aTxt[1], aTxt[2], .T.)
	endif
	oTxC:EditMode          := nTxEditmode
	oTxC:PageMarginR       := 1080			/* 1,5 cm */
	oTxC:PageMarginL       := 1080
	oTxC:Refresh()
return
Den Text kannst man dann je nach Parameter p in verschiedenen Formaten abspeichern (oTxControl:SaveToMemory(p).

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 9:56
von ramses
Hallo Wolfgang

Danke für den Code.

Woher hast du denn die Werte für CLSID_TXRULER und CLSID_TXBUTTBAR ?

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 10:22
von HaPe
Hallo Carlo !
Woher hast du denn die Werte für CLSID_TXRULER und CLSID_TXBUTTBAR ?
Das bekommst du zb. mit dem ActiveXHelper von http://www.nirsoft.net/ raus:
TxTextControl.jpg
TxTextControl.jpg (408.16 KiB) 8699 mal betrachtet

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 11:56
von Marcus Herz
Du kannst bei CLSID auch den Namen des Controls übergeben, sogar ohne die Version
:clsid := "TIS.TX.TextControl"

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 14:19
von ramses
Danke Hans-Peter und Marcus für die Tips mit der CLSID.


Im Moment mühe ich mich mit einer Fehlermelung ab.

Code: Alles auswählen

oError:description  : Could not create ActiveX control
oError:filename     : NIL
oError:genCode      :       6503
oError:operation    : XBPACTIVEXCONTROL:CREATE
oError:osCode       : NIL
oError:severity     :          2
oError:subCode      :       6500
oError:subSystem    : Automation
Dazu gibts hier im Forum auch schon einige ältere Beiträge die mich aber nicht weiterbrachten. ....

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 14:44
von Wolfgang Ciriack
Schau mal, ob du die MS C++ Runtime 2008 und 2013 installiert hast, sonst scheitert es.
2008 vcredist_x86.exe https://www.microsoft.com/de-de/downloa ... x?id=26368
2013 vcredist_x86.exe https://www.microsoft.com/de-de/downloa ... x?id=40784

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 15:26
von Wolfgang Ciriack
Hier die von mir verwendeten CLSIDs:

Code: Alles auswählen

#define CLSID_TXCONTROL "TIS.TX.TextControl.28"
#define CLSID_TXBUTTBAR "TIS.TX.ButtonBarControl.28"
#define CLSID_TXRULER   "TIS.TX.RulerBarControl.28"

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 16:31
von ramses
Hallo Wolfgang

Danke für den Tip mit den Runtimes. Das war es.

Re: TX Text Control ActiveX

Verfasst: Mi, 21. Jul 2021 21:26
von ramses
Gibt es einen Weg die Button und Ruler Zeile nach der Erstellung zu verschieben (Resize) ?
Das Text Control selbst lässt sich einfach "resizen".

Re: TX Text Control ActiveX

Verfasst: Do, 22. Jul 2021 13:07
von ramses
Über Umwege geht es auch mit dem kompletten Resize des Editors.

Der folgende Code zeigt meinen Entwurf des HTML-Editors an dem ich jetzt weiterarbeite.

Code: Alles auswählen


#include "Xbp.ch"
#include "common.ch"
#include "fileio.ch"
#include "appevent.ch"
#include "activex.ch"

#pragma Library( "ascom10.lib" )



// #define CLSID_TXCONTROL "{A2DF4C01-D18D-11EA-8340-A0481C909AC9}"   // "TIS.TX.TextControl.29"
#define CLSID_TXCONTROL     "TIS.TX.TextControl.29"
#define CLSID_TXCONTROLNAME "tx4ole29.ocx"
#define CLSID_TXBUTTBAR "TIS.TX.ButtonBarControl.29"
#define CLSID_TXRULER   "TIS.TX.RulerBarControl.29"
#define TXCONTROL_KEY    "TS-XXXXXXXXXXX"   // Private Pers”nliche Serial Nummer


TxTextControl_RTFHTML_Editor(nil, nil,  "HTML", "test.html", .t.,{|y,x|x:ZoomFactor:=150} )

******************************************************************************
function TxTextControl_RTFHTML_Editor(oParent, cTitel, cTextTyp, xText, lIsxTextFile, oSetupBlock )
local br, ho, oTxC
local oTxDlg, oTxButtons, oTxRuler, oXbp2, oXbp1, lSave := .f., arr1, nTextTyp, lExit := .f., nEvent, oXbp, mp1, mp2, i, t
local WindowsName := "TX-Text-HTML-Editor"

   default oParent to setappwindow(), cTitel to "HTML-Editor", oSetupBlock to {||nil}

   arr1 := u992SaveGetWinPos( "G" , oParent, WindowsName )

   oTxDlg := XbpDialog():new( AppDesktop(), oParent , {arr1[1],arr1[2]}, {arr1[3],arr1[4]}, , .F.)
   oTxDlg:taskList := .t.
   oTxDlg:icon := 100
   oTxDlg:title := cTitel
   oTxDlg:create()
   oTxDlg:show()

   do while .t.

        do case
            case  upper(cTextTyp) == "HTML"
              nTextTyp := 4
            case  upper(cTextTyp) == "RTF"
              nTextTyp := 5
            otherwise
            msgbox("Texttyp: "+ cTextTyp +" im Aufruf ist falsch" )
            exit
        endcase

        if ! AutomationObject():isInstalled( CLSID_TXCONTROL )
           if ask_y_nW( CLSID_TXCONTROLNAME + " kann nicht erkannt werden oder ist nicht installiert. Aufruf des Editors abbrechen?", oTxDlg, "J")
              exit
           endif
        endif

        br := oTxDlg:Drawingarea:CurrentSize()[1]
        ho := oTxDlg:Drawingarea:CurrentSize()[2]

        oTxDlg:close :=  {||lExit := iif(lSave .or. ask_y_nW("Abbruch ohne Speichern?", oTxDlg, "N"),  .t. , .f. ) }

        oTxC                   := XbpActiveXControl():New(oTxDlg:Drawingarea, oTxDlg:Drawingarea, {0, 30},       {br, ho - 52-34})
        oTxC:CLSID             := CLSID_TXCONTROL
        oTxC:License           := TXCONTROL_KEY
        oTxC:Create()

        oTxC:ZoomFactor        := 100
        oTxC:ViewMode          := 0

        oTxC:TabKey            := .T.
        oTxC:FontName          := "Verdana"
        oTxC:FontSize          := 11
        oTxC:BorderStyle       := 0

        if lIsxTextFile
            if file(xText)
               oTxC:load(xText, 0, nTextTyp, .f.)  //  .f. = Replace
            endif
        else
            oTxC:LoadFromMemory(xText, nTextTyp, .f.)
        endif

        oTxC:EditMode          := 0
        oTxC:PageMarginR       := 1080          /* 1,5 cm */
        oTxC:PageMarginL       := 1080

        oTxC:PageWidth         := 14000       // 1 Tick = 0.01388mm
        oTxC:PageHeight        := 20677       // 1 Tick = 0.01388mm


        oXbp1 := XbpPushButton():new( oTxDlg:drawingArea, oTxDlg:drawingArea , {4,4}, {124,24} )
        oXbp1:caption := "Speichern + Ende"
        oXbp1:clipSiblings := .T.
        oXbp1:tabStop := .T.
        oXbp1:create()
        oXbp1:activate := {||lSave := .t., postAppEvent( xbeP_Close)   }

        oXbp2 := XbpPushButton():new( oTxDlg:drawingArea, oTxDlg:drawingArea, {br-4-128,4}, {124,24} )
        oXbp2:caption := "ABBRUCH"
        oXbp2:clipSiblings := .T.
        oXbp2:tabStop := .T.
        oXbp2:create()
        oXbp2:activate := oTxDlg:close


        oTxDlg:drawingArea:resize := {||resize( @oTXDlg, @oTxC, @oTxButtons, @oTxRuler, @oXbp2) }
        resize( @oTXDlg, @oTxC, @oTxButtons, @oTxRuler, @oXbp2)

        eval( oSetupBlock, @oTXDlg, @oTxC )

        setappwindow( oTxDlg )
        setappfocus( oTxC )
        oTxDlg:setModalState( XBP_DISP_APPMODAL )


        nEvent := xbe_None
        DO WHILE  !lExit // nEvent <> xbeP_Close
             nEvent := AppEvent( @mp1, @mp2, @oXbp )
             if nEvent !=  xbe_None
               oXbp:handleEvent( nEvent, mp1, mp2 )
             endif
        ENDDO

        u992SaveGetWinPos( "S" , oTxDlg, WindowsName )
        if lSave
             if lIsxTextFile
                if nTextTyp = 4
                    t := oTxC:SaveToMemory( nTextTyp)
                    i := at( '<meta content="TX29_HTM', t )
                    if i != 0
                      t := stuff(t, i, at(chr(10), t, i)+1-i , "" )
                    endif
                    strfile( t, xText)
                else
                   oTxC:save(xText, 0, nTextTyp)
                endif
             else
                xText := oTxC:SaveToMemory( nTextTyp)
                if nTextTyp = 4
                   i := at( '<meta content="TX29_HTM', xText )
                   if i != 0
                      xText := stuff(xText, i, at(chr(10), xText, i)+1-i , "" )
                   endif
                endif
             endif
        endif

        oTxC:destroy()

        exit
   enddo

   oTxDlg:setModalState( XBP_DISP_MODELESS )
   oTxDlg:destroy()

   setappwindow( oParent )


return(lSave)


static function resize( oTXDlg, oTxC, oTxButtons, oTxRuler, oXbp2 )
local br := oTxDlg:Drawingarea:CurrentSize()[1]
local ho := oTxDlg:Drawingarea:CurrentSize()[2]

    oXbp2:setpos( {br-4-128,4} )

    if oTxButtons != nil
      oTxButtons:destroy()
      oTxButtons := nil
    endif
    if oTxRuler != nil
      oTxRuler:destroy()
      oTxRuler := nil
    endif

    oTxC:setposandsize(  {0, 30}, {br, ho - 52 -34} )

    oTxButtons             := XbpActiveXControl():New(oTxDlg:Drawingarea, oTxDlg:Drawingarea, {0, ho - 28}, {br, 28})
	oTxButtons:CLSID       := CLSID_TXBUTTBAR
	oTxButtons:Create()
	oTxButtons:PosStyle    := 0
	oTxButtons:Appearance  := 3
	oTxButtons:Style       := 3
	oTxButtons:BorderStyle := 0

	oTxRuler               := XbpActiveXControl():New(oTxDlg:DrawingArea, oTxDlg:DrawingArea, {0, ho - 56}, {br, 28})
	oTxRuler:CLSID         := CLSID_TXRULER
	oTxRuler:Create()
	oTxRuler:BorderStyle   := 0

	oTxC:ButtonBarHandle   := oTxButtons:hWnd
	oTxC:RulerHandle       := oTxRuler:hWnd

    oTxC:Refresh()
    setappfocus( oTxC )


return(nil)




Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 14:00
von Scarmo
Hallo Carlo

Wir sind auch gerade am Überlegen, wie man einen HTML-Editor sinnvoll in unser xBase-Programm integrieren könnte. Müssen denn auf jedem PC, welcher auf den TextControlActiveX-Editor zugreift, die MS C++ Runtime 2008 und 2013 installiert sein? Ich denke, das wäre für ein Update bei bestehenden Kunden ziemlich aufwändig...

Gruss Marco

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 14:34
von Tom
Müssen denn auf jedem PC, welcher auf den TextControlActiveX-Editor zugreift, die MS C++ Runtime 2008 und 2013 installiert sein?
Eigentlich enthält der Satz redistrierbutierbarer Dateien der Komponente alles, was man braucht. Man muss es nur registrieren oder in die Manifest-Datei aufnehmen. Wir haben TX als Quasi-Replacement für MLEs mit unseren Anwendungen auf tausenden Rechnern im Einsatz. "Could not create ..." tritt so gut wie nie auf.

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 16:44
von Wolfgang Ciriack
die MS C++ Runtime 2008 und 2013 installiert sein?
Ja, die werden benötigt. Kann man aber unbeaufsichtigt z.B. in ein Innosetup-Script einbauen (habe ich jedenfalls gemacht, weil meist am PC eine der beiden C++ Runtimes fehlte).

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 17:29
von Scarmo
Vielen Dank für die Infos.

@Tom:
Kannst Du mir sagen, wie man dies in die Manifest-Datei integrieren kann, um die manuelle Registrierung der einzelnen Komponenten zu umgehen?

Danke und Gruss
Marco

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 17:45
von Tom
Hallo, Marco.

Das Thema hatten wir hier schon x-fach, beispielsweise hier:

https://www.xbaseforum.de/viewtopic.php ... 51#p121851

Wir installieren meines Wissens keine C++-Runtimes mit, damit TX funktioniert.

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 17:52
von Scarmo
Danke Tom für den Link und die Info. Werde es mal mit der Demoversion austesten.

Gruss, Marco

Re: TX Text Control ActiveX

Verfasst: Di, 23. Nov 2021 23:57
von Werner_Bayern
Servus,

wer Interesse hat, ich hab mir gestern einen externen HTML-Editor gemacht, der über die Zwischenablage mit Xbase++ und natürlich anderen Programmen kommuniziert:
  1. Zwischenablage mit HTML-Code bestücken
  2. Externen Editor starten (der liest die Zwischenablage aus und zeigt den Code an)
  3. Bearbeiten und formatieren nach belieben, externen Editor schließen (neuer HTML-Code wird als Text in die Zwischenablage gestellt)
  4. Xbase++ - Programm HTML-Text aus der Zwischenablage auslesen lassen
  5. Anzeige in Xbase++ dann z. B. mit XbpHTMLWindow() oder XbpHTMLStatic()
Einfach kurze PM an mich.

Re: TX Text Control ActiveX

Verfasst: Mi, 24. Nov 2021 8:37
von ramses
Tom hat geschrieben: Di, 23. Nov 2021 17:45 Wir installieren meines Wissens keine C++-Runtimes mit, damit TX funktioniert.
Hallo Tom

richtig, das kann man.
Am besten liefert man dazu msvcr120.dll + mfc120u.dll und die dazu nötigen abhängigen DLL zusammen mit den eigenen DLL's aus. Das reicht und funktioniert sorglos nachdem TX registriert ist.
Ohne dass die erwähnten DLL's auf dem PC vorhanden sind und gefunden werden (durch mitgeliefert oder Inst. Runtime) läuft TX Control allerdings wirklich gar nicht.

Re: TX Text Control ActiveX

Verfasst: Mi, 24. Nov 2021 16:54
von Scarmo
Bin gerade etwas am Kämpfen was das Einfügen von Grafiken in TxControl anbelangt. Gibt es allenfalls einen Button, mit welchem Grafiken eingefügt werden können? Oder muss dies immer über die Zwischenablage erfolgen?

Zudem bleibt bei mir die Position der Grafik im generierten HTML-File nicht erhalten. Sobald die Grafik nicht linksbündig ist erscheint sie im erstellten File ganz rechtsbündig... :? Habt ihr vielleicht einen Tipp für mich?

Gruss Marco

Re: TX Text Control ActiveX

Verfasst: Mi, 24. Nov 2021 17:11
von Wolfgang Ciriack
Bei mir funktioniert das mit dem Kontextmenu (rechte Maustaste) Hinzufügen - Bild.

Re: TX Text Control ActiveX

Verfasst: Mi, 24. Nov 2021 21:15
von ramses
Scarmo hat geschrieben: Mi, 24. Nov 2021 16:54 Zudem bleibt bei mir die Position der Grafik im generierten HTML-File nicht erhalten. Sobald die Grafik nicht linksbündig ist erscheint sie im erstellten File ganz rechtsbündig... :? Habt ihr vielleicht einen Tipp für mich?
Tabelle einfügen, Tabelle bearbeiten(Linienfarbe), Bild in Tabellenfeld einfügen - wäre ein einfacher Weg die Position des Bildes zu bestimmen.

Re: TX Text Control ActiveX

Verfasst: Do, 25. Nov 2021 11:41
von Scarmo
Vielen Dank für den Tipp mit der Tabelle! So klappt es prima!! =D>

Gruss Marco