Seite 2 von 6

Verfasst: 04.10.2008 14:25
von Kiffi
Die Richtextbox-OCX einzubinden ist recht easy:

Code: Alles auswählen

XIncludeFile "COMate.pbi" ; Pfad anpassen!

RTB_Object.COMateObject

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 300, "COMate - RTB-Demo", #PB_Window_SystemMenu|#PB_Window_Invisible) And CreateGadgetList(WindowID(0))
  
  RTB_Object = COMate_CreateActiveXControl(0, 0, 300, 300, "RICHTEXT.RichtextCtrl")
  
  If RTB_Object = 0
    MessageRequester("!", "CreateActiveXControl() ging in die Hose!")
    End
  EndIf
  
  RTB_Object\Invoke("LoadFile('C:\WINDOWS\system32\IE7Eula.rtf')") ; Pfad anpassen!

  HideWindow(0, 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  
  RTB_Object\Release()
  
  CloseWindow(0)
  
EndIf
Für die reine Anzeige der RTF (bzw. DOCs) solltest Du damit vorerst
zurechtkommen.

Grüße ... Kiffi

P.S.:
Palandt hat geschrieben:Langsam krieg ich doch etwas Panik, was mein Projekt angeht. Ich weiss
nicht, ob ich das tatsächlich auf mich nehmen will, 8000 Dateien auf HTML
"umzupolen". Fuck, Mann, alles lief so gut bis zu diesem verfluchten
Textfeld!
ich weiß nicht... Irgendwie habe ich da so ein Déjà vu. Hieß es nicht
letztens noch, 'alles lief so gut bis zu diesen blöden Gadgets'? Oder 'alles
lief so gut bis zu diesem blöden DB-Konvertieren'? Kann auch sein, dass
ich mich irre... Aber so langsam beschleicht mich das Gefühl, dass Du in
der Tat besser mit VB beraten wärst, denn das RTB-Problem wird längst
nicht das letzte Problem sein, auf das Du hier stoßen wirst und Deine
'Leidensfähigkeit' diesbezüglich scheint mir begrenzt zu sein.

Verfasst: 04.10.2008 14:47
von Palandt
Tausend Dank, Kiffi !!!

Prof. Dr. rer. nat. Dr. psych (!). .... :wink:

Aber so schnell wirst du mich nicht los, ich bleib bei PB. Hab nur ein südländisches Temperament, da ist halt das anstehende Problem grundsätzlich auch das Größte bisher dagewesene. :)

Aber die von dir aufgezählten Dinge wären tatsächlich Totschlagprobleme gewesen, denn ohne DB - Konvertierung, UI - Design und RTF-Textfeld hätte ich das Projekt vermutlich begraben können, diese Dinge hatte ich ja auch - bis auf das "Fensterproblem" - in meinem "Begrüßungsposting" als die für mich wichtigsten herausgestellt. Und zwischendurch gab es schon ca. 20 andere Probleme, die ich ohne Schweißausbrüche überwunden hab... Aber vielleicht hab ich beim nächsten Problem auch schon nen Herzinfarkt, dann lass ich meinen Arzt hier reinposten, der ist eher nen nordischer Typ....:)

//EDIT: Was mich bei deinem Code etwas wundert: Wieso steht da nirgends was von Richtext.ocx???

Verfasst: 04.10.2008 18:06
von ts-soft
zu Demos nix gehen:
Admin-Rechte sind erforderlich um die OCX zu registrieren, deshalb wird
dies ja auch meist mit einem Installer gemacht.

zu:
> Wieso steht da nirgends was von Richtext.ocx???
ActiveX, OCX, Olebla usw. müssen im System registriert werden, unter
einer GUID, so ein netter einmaliger String in geschweiften klammern.
Zusätzlich gibts noch einen UserFreundlich Klassennamen, z.B.
"RICHTEXT.RichtextCtrl", oder "RICHTEXT.RichtextCtrl1" usw.

OCXe funktionieren nur wenn sie registriert wurde, so das jeder diese Dinger
mitliefert und installiert. Wenns dann einer Deinstalliert, funzen die anderen
Programme evtl. auch nicht mehr. Ist also eine nicht so durchdachte Sache
von MS :mrgreen:

Ich persönlich verzichte möglichst auf OCX und Co, aber wenns nicht
anders geht :wink:

WebGadget ist in meinen Augen immer noch die beste Lösung :)

Verfasst: 05.10.2008 17:19
von Palandt
Danke auch dir für den Hinweis, TS-Soft. das hat mir dergestalt weitergeholfen, dass ich jetzt so einigermaßen mit den Grundlagen von Comate vertraut bin und nun auch weiss, dass man die ActiveX-Controls registrieren muss. Das RTF-Feld, das Kiffi für mich mittels seines Codes erstellt hat, ist leider auch nicht in der Lage alle Grafiken korrekt anzuzeigen. Es führt für mich deshalb kein Weg am VB-RTF-Textfeld vorbei. Ich habe auch versucht, das Ding mit Comate zu integrieren, doch das Prog erstellt das Teil einfach nicht, obgleich das Steuerelement registrieren lasse. Wär super, wenn du einen kurzen Blick auf meinen Code werfen könntest, vielleicht kannst du ja auf die Schnelle erkennen, was ich falsch gemacht habe.

Code: Alles auswählen


IncludePath "..\"
XIncludeFile "COMate.pbi"


RTF_Feld.COMateObject

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 800, "RTF-Feld", #PB_Window_SystemMenu|#PB_Window_Invisible) And CreateGadgetList(WindowID(0))
 
  RTF_Feld = COMate_CreateActiveXControl(0, 0, 800, 800, "RICHTX32.OCX")
 
  ; Registrierung, falls RTF_Feld = 0 
 
  If RTF_Feld = 0
    If COMate_RegisterCOMServer("RICHTX32.ocx") = #S_OK
      blnRegister = #True
      RTF_Feld = COMate_CreateActiveXControl(0, 0, 800, 800, "RICHTX32.OCX")
    EndIf
  EndIf
 
 ; End, falls immer noch 0

 If RTF_Feld = 0
    MessageRequester("!", "CreateActiveXControl() konnte nicht erstellt werden.")
    End
 EndIf
 
  RTF_Feld\Invoke("LoadFile('K:\VB-Programme\QM2\Antworttexte\Antwort3344538A8.txt')") 

  HideWindow(0, 0)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
 
  RTF_Feld\Release()
 
  CloseWindow(0)
 
EndIf

Vielen Dank schonmal im Voraus!

//EDIT: Der Name des Controls ist richtig geschrieben und das Steuerelement befindet sich im selben Verzeichnis wie das Programm. Der Fehler ist der, dass sich das Programm jedes Mal mit der Meldung verabschiedet, dass es das AtiveX nicht erstellen könne. Der Wert von RTF_Feld bleibt also Null.

Verfasst: 05.10.2008 23:21
von Kiffi
@Palandt: Nachfolgend mal ein paar erläuternde Hinweise zum Thema COM & Co:

Eine COM-Komponente (wie beispielsweise ActiveX-DLL oder OCX) wird
nie über den Dateinamen angesprochen, sondern immer entweder über
einen spezifischen Bezeichner (beispielsweise "RICHTEXT.RichtextCtrl")
oder eine entsprechende GUID ("{3B7C8860-D78F-101B-B9B5-04021C009402}")

Das geschieht mit COMate mittels COMate_CreateObject() oder (wie in
Deinem Fall) über COMate_CreateActiveXControl().

Wenn COMate_CreateActiveXControl() fehlschlägt, so ist davon
auszugehen, dass die anzusprechende Komponente nicht auf Deinem
System registriert ist.

Nur in diesem Fall musst Du Sorge dafür tragen, dass die Komponente
dem System bekannt gemacht wird, indem Du sie registrierst. Das
geschieht mit COMate_RegisterCOMServer(). Hier und nur hier ist der
Pfad der Komponente anzugeben.

Die von mir verwendete Komponente (RICHTEXT.RichtextCtrl) ist die
"Microsoft Rich Textbox Control 6.0 (SP6)" und entspricht somit exakt der
Komponente, die Du in Deinem VB verwenden dürftest. Mir ist zumindest
keine aktuellere Version dieser Komponente bekannt.

Schau einfach mal im RegEditor folgenden Schlüssel an:

Code: Alles auswählen

HKEY_CLASSES_ROOT\CLSID\{3B7C8860-D78F-101B-B9B5-04021C009402}
Palandt hat geschrieben:

Code: Alles auswählen

[...]
RTF_Feld\Invoke("LoadFile('K:\VB-Programme\QM2\Antworttexte\Antwort3344538A8.txt')")
[...]
TXT? Ich hoffe, dass das eine RTF-Datei mit falscher Extension ist.
Ansonsten liesse sich relativ leicht erklären, warum Grafiken nicht
angezeigt werden ;-)

Grüße ... Kiffi

Verfasst: 06.10.2008 10:18
von Palandt
Vielen Dank für die Hinweise, Kiffi !!!

Das mit der Dateiendung ist allerdings kein Versehen, macht aber keinen Unterschied, selbst das PB-RTF-Feld kann Dateien mit *.txt Endung als RTF einlesen. Ich hab dies betreffend selbstredend schon getestet, ob es bei "deinem" RTF-Feld einen Unterschied macht, wenn ich die Dateiendung auf RTF umändere; wie erwartet nicht.

Nehmen wir mal an, du täuscht dich und mein RTF-Feld RICHTX32 wäre doch das Richtige(re), wie müsste ich dann den Code ändern? Du sagtest nur bei der Registrierung sei der vollständige Name + Pfad erforderlich, wo kann ich denn die anderen beiden Bezeichnungen (bei "deinem" Feld = RICHTEXT.RichtextCtrl und {3B7C8860-D78F-101B-B9B5-04021C009402}) erfahren?

Dies ist mir auch deshalb wichtig zu wissen, da ich nachher, wenn ich von der Uni komme (kann dir falls du gleich antworten solltest, erst nachher zurückschreiben), wohl damit beginnen werde, ein eigenes ActiveX über VB zu erstellen. Das hab ich zwar erst einmal gemacht, aber ich hab 2 ziemlich geniale VB - Bücher, das werd bzw. MUSS ich schon hinkriegen. Ich werd dann einfach mein komplettes Luxuseditorteil, das ich anlässlich meines Programms erstellt hab, in ein ActiveX - Control umwandeln.

Denn so wie ich dich bislang kennen gelernt hab, vermute ich, dass du dich nicht getäuscht hast, und dann wohl "mein" RTF-Feld (RICHTX32 ) ebenfalls nicht imstande sein wird, die Grafiken richtig anzuzeigen. Dafür werd ich wohl das "Original" aus meinem Programm brauchen und daher muss ich auch wissen, wie ich es dann, wenn es fertig ist, mit Comate in PB integriere - also - wie gesagt - an welcher Stelle ich welche Bezeichnung verwende und wie ich diese Spezialbezeichnungen (bei "deinem" Feld = RICHTEXT.RichtextCtrl und {3B7C8860-D78F-101B-B9B5-04021C009402}) in Erfahrung bringe.

Vielen Dank schonmal!

Verfasst: 06.10.2008 10:55
von Kiffi
Palandt hat geschrieben:Nehmen wir mal an, du täuscht dich und mein RTF-Feld RICHTX32 wäre doch das Richtige(re)
um Klarheit in die Sache zu bringen, müssten wir erst einmal
sicherstellen, welche Version(en) wir beide verwenden.

Mach mal folgendes: Starte Dein VB, lade Dein Projekt und dann klicke
auf Menüzeile Projekt / Komponenten. Dort ist Dein RTF-OCX ja
aufgelistet. Dieses selektieren und dann unten schauen, wo das OCX auf
Deiner Platte liegt:
Bild

Auf genau diese Datei machst Du einen Rechtsklick und schaust Dir die
Versionsinfo an:
Bild

Grüße ... Kiffi

Verfasst: 06.10.2008 15:53
von Palandt
Bei meinem RTF - Feld stimmt alles genau wie bei dem von dir in der Anleitung dargestellten Feld überein, bis auf die Versionsnummer, diese weicht geringfügig ab: 6.1.97.82; es fehlt mithin lediglich die Null vor der Eins.

Deiner graphischen Anleitung und der Beinahe - Identität der Versionsnummern entnehme ich allerdings, dass du wohl doch das richtige Feld für mich in deinem Comate-Code-Beispiel integriert hast. Infolgedessen trifft meine Befürchtung zu: Ich muss ein eigenes ActiveX erstellen. Dem bisher von dir Gesagten entnehme ich:

1. Ich führe erst mit COMate_RegisterCOMServer() die Registrierung des neuen ActiveX-Elements aus. Dazu gebe ich den Dateinamen des Elements und den Speicherpfad an.

2. Dann schau ich in der Registry nach dem Klassen-ID-Schlüssel (GUID) . Nur wie finde ich den? Unter HKEY_CLASSES_ROOT / CLSID, ok, aber da stehen tausende von Einträgen, such ich dann in diesem Verzeichnis unter dem Namen des Controls, denn eine Sortierung nach Eintragungszeit des Schlüssels ist ja - glaub ich jedenfalls - nicht möglich?

3. Falls ich nicht den unleserlichen Registrierungsschlüssel nehmen will, um fortan das Element anzusprechen, wo erfahre ich das Synonym, das in deinem Beispiel "RICHTEXT.RichtextCtrl" lautete?

Wenns nicht zu viel Mühe kostet, vielleicht kannst du ja dein "RTF-DEMO" dergestalt umschreiben, das es quasi mittels Platzhalter als Schablone für neue ActiveX fungiert, also an den Stellen, an denen Bezeichnung 1 hinkommt dann eben für genau diese dort einen Platzhalter einfügen und das Gleiche für Bezeichnung 2, etc.

Wie immer Danke für deine Hilfsbereitschaft!

Verfasst: 06.10.2008 16:11
von Kiffi
Palandt hat geschrieben:Mithin trifft meine Befürchtung zu: Ich muss ein eigenes ActiveX erstellen.
das soll dann dieses Deluxe-Edit-Control sein, oder? Wenn ja: Auf Basis
welchen Controls willst Du das denn dann erstellen? Ich nehme mal an,
auf Basis der RTF-Komponente. ;-)

Generell ist die Idee nicht verkehrt. Allerdings solltest Du dann auch
wissen, dass Du mit der Erstellung eines eigenen Controls nicht Deinem
eigentlichen Problem aus dem Weg gehst.

Erst einmal sollte nachgeforscht werden, warum das Control die Grafiken
nur dann korrekt anzeigt, wenn es in VB eingebettet ist. Hast Du mal eine
Beispiel-RTF-Datei anhand dessen ich das nachvollziehen kann?

Grüße ... Kiffi

Verfasst: 06.10.2008 16:13
von Palandt
Gerne, aber die müsste ich dir schicken, ich hab nix von dem du etwas runterladen könntest. Musst mir sagen, wie die Datei dich erreichen soll.

//EDIT: Wie gesagt, die Beispieldatei ist raus, und mit Wordpad öffnet er das Teil zwar mit der richtigen Grafik oberhalb (INFO + Logo) der Text wird aber zu lang dargestellt. In meinem Feld aus VB, das nicht so breit ist, liest sich das ganze so:
"Da der Kläger nicht verpflichtet ist, mehrere Ansprüche in einer Kla­ge zu //
verbinden, die gemeinsame Verhandlung und Entscheidung über diese // Ansprüche aber prozessökonomisch sein kann, hat das Gericht die // Möglichkeit, eine Prozessverbindung anzuordnen (§ 147). Auch hierdurch entsteht eine nachträgliche Klagenhäufung."

Also in 5 statt wie mit Wordpad in 3 oder wie mit dem RTF-Feld, das über Comate in PB integriert ist, gar in einer unendlich langen Zeile! Das ist übrigens auch ein Manko des PB-Feldes gewesen, ich musste das Teil überdimensional groß erstellen, da der User sonst gezwungen wäre, ständig horizontal zu scrollen, was sich auch trotz der großen Dimensionen nicht ganz vermeiden ließ, zumindest aber auf ein Minimum reduziert wurde. Bei VB lauten die Maße meines Feldes: H 5775 und W 7575; wobei ich gar nicht weiß, welche Maßeinheit das ist, Pixel, wie PB sie verwendet kann es nicht sein, da das Feld nicht so riesig ist.