TxTextControl

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

TxTextControl

Beitrag von lesny »

Nachdem mehrfach das TxTextControl empfohlen wurde, habe ich mir die Trial-Version installiert und versuche sie vergeblich, in mein Programm einzubinden. Ich habe aus dem Beitrag
http://www.xbaseforum.de/viewtopic.php? ... rol#p38867
die Funktion MyCreateTxControl(...) übernommen.
Beim oTxControl:create erhalte ich immer nur den Fehler 6500:

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

So werden meine Annäherungsversuche an dieses Tool im Keim erstickt. Gibt es irgendwo ein Mini-Standalone Beispiel, so wie beim XbpRTF unter Alaska\xppw32\source\samples\activex\editor. Habe zwar kaum Erfahrung mit der Anbindung von ActiveX, aber mit den Beispielen aus den msexcel und msword-Ordnern der Alaska-Samples war es z.B. ein leichtes, ein Excelsheet zu erzeugen und zu füllen oder eine Word-Datei aufzurufen. Aber hier komm ich mir grad wie der Depp vor...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: TxTextControl

Beitrag von Tom »

Hallo, lesny.

In dieser Zeile:

Code: Alles auswählen

'TIS.TX.TextControl.'+cTextConVersion
wird die CLSID für das Control gebaut, und diese ist versionsabhängig. Wenn Du eine aktuelle Trialversion zu TX 16 geladen hast, muss "cTextConVersion" "16" enthalten. Da die Variable später (bei ButtonBar usw.) noch genutzt wird, wäre empfehlenswert, sie irgendwo am Anfang zu bestücken. Dann müsste das Control auch entstehen.

Der Aufruf dieser Funktion sollte mit lokalen Variablen erfolgen (oTxControl,oTxButtonBar,oTxStatusBar) erfolgen, die dann, damit man sie im aufrufenden Dialog nutzen kann, per reference (also jeweils mit führendem @) übergeben werden sollten.
Herzlich,
Tom
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

Re: TxTextControl

Beitrag von lesny »

Hallo Tom,

zunächst danke für die prompte Antwort.
"cTextConVersion": Ich hatte es mit "16" und mit "16.0" versucht. Immer der gleiche Fehler.
Was muss eigentlich in diese Zeile?

Code: Alles auswählen

oTxControl:license := cTextConLicense
Bei der Trial habe ich ja keine Lizenznummer, ich habe hier einen leeren String eingesetzt. Ob es daran liegt?

Stefan
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

Re: TxTextControl

Beitrag von lesny »

Hallo Tom,
ich habe jetzt mal mit deiner Funktion ein Mini-Standalone-Beispiel gemacht:

Code: Alles auswählen

#include "Xbp.ch"
#include "Appevent.ch"
#include "DLL.CH"
#include "activex.ch"
#PRAGMA LIBRARY( "ASCOM10.LIB" )

PROCEDURE Main()
  LOCAL nEvent
  LOCAL mp1 := NIL, mp2 := NIL, oXbp := NIL
  LOCAL oForm
  local oTxMenu
  local oTxButtonbar
  local oTxControl
  local oTxStatusbar

  oForm := XbpDialog():new( AppDesktop() )
  oForm:taskList := .T.
  oForm:title    := "TxTextControl mit ActiveX"
  oForm:drawingArea:clipChildren := .T.
  oForm:create( ,,{100,100}, {640,480},, .F. )
  oForm:close  := {|| PostAppEvent( xbeP_Quit ) }
   
  MyCreateTxControl(@oTxMenu,.t.,.t.,AppDesktop(), setAppWindow(), oForm:drawingarea, @oTxControl, @oTxButtonbar, @oTxStatusBar, "", .f. )

  oForm:Show()
  SetAppWindow( oForm )
  SetAppFocus( oForm )

  DO WHILE nEvent != xbeP_Quit
    nEvent := AppEvent( @mp1, @mp2, @oXbp )
    oXbp:handleEvent( nEvent, mp1, mp2 )
  ENDDO

RETURN

PROCEDURE AppSys()
RETURN

FUNCTION MyCreateTxControl(oTxMenu,lResizeable,lEditAble,oOwner,oWindow, oDlgArea,oTxControl,oTxButtonBar,oTxStatusBar,cMemoText,lIsDatei )
Local oThread,cTxFile, oTwDlg
Local w,h,hbutton,htext,hstatus
local cTextConVersion := "16"
local cTextConLicense := ""

// DEFAULT lIsDatei TO .F.

w:=oDlgArea:currentSize()[1]
h:=oDlgArea:currentSize()[2]
hButton := if(lEditAble,32,0)
hstatus := 20
htext := h-(hbutton+hstatus)

oTxControl := XbpActiveXControl():new( oDlgArea )
oTxControl:CLSID := 'TIS.TX.TextControl.' +cTextConVersion
oTxControl:license := cTextConLicense
oTxControl:create(oDlgArea,,{0,hstatus},{w,htext} )

oTxControl:Userevents := .F.

if lEditable
  // Buttonbar
  oTXButtonBar := XbpActiveXControl():new( oDlgArea )
  oTXButtonBar:CLSID := 'TIS.TX.ButtonBarControl.'+cTextConVersion
  oTXButtonBar:create(oDlgArea,,{0,hstatus+htext},{w,hbutton} )
  oTxButtonBar:Userevents := .F.
endif

// Statusbar
oTXStatusBar := XbpActiveXControl():new( oDlgArea )
oTXStatusBar:CLSID := 'TIS.TX.StatusBarControl.'+cTextConVersion
oTXStatusBar:create(oDlgArea,,{0,0},{w,hstatus} )
oTxStatusBar:Userevents := .F.
if lEditAble
  oTxControl:ButtonBarHandle := oTXButtonBar:hWnd
  oTXButtonBar:Enabled := .T.
  oTXButtonBar:Language := 49
  oTXButtonBar:Appearance := 2
  oTXButtonBar:PosControlChars := 1
endif

oTxControl:StatusBarHandle := oTXStatusBar:hWnd
oTXStatusBar:Enabled := .T.
oTXStatusBar:Language := 49
oTXControl:Enabled := .T.
oTXControl:EditMode := if(lEditAble,0,1)
oTxControl:InsertionMode := .T.
oTXControl:PageHeight := 16160
oTXControl:ScrollBars := 3
oTXControl:SizeMode := 0
oTXControl:FontName := "Tahoma"
oTXControl:FontSize := 12
oTXStatusBar:TextColumn := "Spalte"
oTXStatusBar:TextLine := "Zeile"
oTXStatusBar:TextPage := "Seite"
oTXStatusBar:FontName := "Tahoma"

if len(cMemoText) > 0
  if lIsDatei
    oTXStatusBar:Text := (cMemoText)
    oTxControl:RTFImport(cMemoText)
  else
    if left(cMemoText,5) = "{\rtf"
      oTxControl:RTFSelText := cMemoText
    else
      oTxControl:Text := (hardcr(cMemoText))
    endif

  endif
endif
if lEditable
  oTxMenu := XbpMenu():new( oDlgArea):create()
  oTxMenu:AddItem( {"Formatieren (Schrift)",{ || oTxControl:FontDialog(),SetAppFocus(oTxControl) } } )
  oTxMenu:AddItem( {NIL, NIL, XBPMENUBAR_MIS_SEPARATOR, 0  } )
  oTxMenu:AddItem( {"L”schen",{ || oTxControl:Clip(4) } } )
  oTxMenu:AddItem( {"Ausschneiden",{ || oTxControl:Clip(1) } } )
  oTxMenu:AddItem( {"Kopieren",{ || oTxControl:Clip(2) } } )
  oTxMenu:AddItem( {"Einfgen",{ || oTxControl:Clip(3) } } )
  oTxControl:RbDown  := { |mp1, mp2, obj|oTxMenu:PopUp ( oDlgArea, mp1 , 1 ) }
endif
RETURN oTxControl
Auch hier bekomme ich den gleichen Fehler:

Code: Alles auswählen

------------------------------------------------------------------------------
FEHLERPROTOKOLL von "c:\Alaska\txtextcontrol\test\TXTEXT.EXE" Datum: 21.01.2011 15:51:29

Xbase++ Version     : Xbase++ (R) Version 1.90.350
Betriebssystem      : Windows Vista 06.01 Build 07600
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: O CLASS: XbpIWindow
          -> VALTYPE: U VALUE: NIL
          -> VALTYPE: A VALUE: {0, 20}
          -> VALTYPE: A VALUE: {624, 390}
          -> VALTYPE: U VALUE: NIL
          -> VALTYPE: L VALUE: .T.
oError:canDefault   : J
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
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
oError:thread       :          1
oError:tries        : NIL
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------

Called from MYCREATETXCONTROL(56)
Called from MAIN(23)
Weil ich so grundlegend scheitere, habe ich mal eine virtuelle XP 32-bit Maschine gestartet und dort Alaska und TxTextControl V16 Trial installiert. Und siehe da: dort läuft dieses Beispiel. Kann es sein, dass TxTextControl mit ActiveX nicht kompatibel ist zu Windows 7 64-bit? Das wäre ja ein "Totschlag"-Argument gegen diese Komponente. Dann müsste ich gleich was anderes suchen.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: TxTextControl

Beitrag von Tom »

Hallo, lesny.

Nein, das läuft unter 7/64, auch unter 2008/64.

Du musst mit der Trialversion einen Lizensierungsstring zum Testen bekommen haben. Der gehört in die Variable "cTextConLicense". Außerdem muss das Control auf jedem Rechner, auf dem es benutzt wird, registriert werden (dafür gibt es meiner Erinnerung nach eine EXE, die mit TX ausgeliefert wird, ansonsten "REGSVR32 TX4OLE16.OCX").
Herzlich,
Tom
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

Re: TxTextControl

Beitrag von lesny »

Hallo Tom,
ich habe keinen Lizenzierungsstring bekommen, einfach einen Downloadlink per E-Mail. Aber in XP läuft es mit leerem licensecode.
Regsvr32 hatte ich durchgeführt. Musste bei Win7 allerdings ein cmd-Fenster als Administrator ausführen.

Durch Zufall habe ich meine Anwendung spaßeshalber auch mal mit "Als Administrator ausführen" gestartet - und siehe da, das Control erschien! Scheint also ein Rechteproblem der ocx-Registrierung zu sein. Wenn ich regsvr32 in einem normalen cmd-Fenster ausführe, kommt der Hinweis, dass die Register-Routine nicht durchgeführt werden konnte.

Danke, Tom, für deine Unterstützung.
Stefan
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

Re: TxTextControl

Beitrag von lesny »

Hallo Tom,

nach einigen Tests bin ich nun ein Stück schlauer: Auf Win7 64-bit kann ich das TxTextControl-ActiveX-Objekt nur aufrufen, wenn mein Xbase-Programm explizit als Administrator aufgerufen wird. Ansonsten gibt's immer den Fehler "Could not create ActiveX control". Da die TxTextControl-Demo auch ohne Administrator-Aufruf läuft, schätze ich, dass das ein Xbase-Problem ist. Aber das ist für mich jetzt erst mal nicht brisant, da der überwiegende Teil meiner Kunden wohl noch mit XP 32-bit unterwegs ist. Die anderen können ggf. meine Anwendung als Workaround immer als Administrator starten.

Ich hätte aber noch zwei Fragen zu deinem Beispiel MyCreateTxControl:

1. In der TxTextControl-Demo ist ein wunderschönes komplettes Menü mit allen Funktionen. Kann man dieses Standardmenü mit einem Befehl aufrufen oder hast du da auch ein fertiges Beispiel oder muss ich das wirklich alles "zu Fuß" einzeln Befehl für Befehl erzeugen?

2. Das Kontextmenü erscheint bei rechter Maustaste, ist aber funktionslos, wenn man etwas auswählt.
:) Nachtrag zu 2 (Problem behoben):
Habe eine Zeile geändert:

Code: Alles auswählen

 alt: oTxControl:RbDown  := { |mp1, mp2, obj|oTxMenu:PopUp ( oDlgArea, mp1 , 1 ) }
neu: oTxControl:RbDown  := { |mp1, mp2, obj|oTxMenu:PopUp ( obj, mp1 , 1 ) }
Stefan
Zuletzt geändert von lesny am Di, 08. Feb 2011 15:34, insgesamt 1-mal geändert.
Benutzeravatar
lesny
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 03. Nov 2009 23:16

Re: TxTextControl

Beitrag von lesny »

... und noch eine Frage:

Was muss man eigentlich an Kunden ausliefern?
Ich habe auf einem jungfräuliches XP die OCX-Komponte gespeichert und erfolgreich mit regsvr32 registriert. Läuft aber nicht, kommt wieder der Fehler beim Create vom ActiveXControl...

:) Nachtrag:
Problem gelöst. Ich habe TxTextControl gekauft und beim Aufruf nun meine Seriennummer angegeben. Damit läuft die Anwendung auch auf einem Test-Kunden-PC. Offenbar lässt sich die Trial-Version zwar auf dem Entwickler-PC verwenden, nicht aber verteilen.
Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: TxTextControl

Beitrag von Chris »

Hallo,
dank dieses Beitrages haben wir das TextControl auch zum Laufen gebracht. Jetzt stehen wir vor der Methode LoadSaveAttributes(). Hier hat man die Möglichkeit bei Übergabe eines Wertes das entsprechende Attribut auszulesen. Laut Definition im Handbuch kann ich dann per LoadSaveAttributes(37)=.t. auch einen Wert zuweisen, nur leider nicht mit XBase. Hat jemand schon mal diese Methode verwendet?
Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: TxTextControl

Beitrag von Chris »

Hallo,
hat sich erledigt. Haben das inzwischen gefunden. War ich doch zu voreilig. Mit SetProperty hat es funktioniert.
Antworten