Avatar billede cpnielsen Nybegynder
31. marts 2003 - 20:18 Der er 15 kommentarer og
1 løsning

Richtextbox i Access/Word

Hej.
Jeg ønsker at benytte en textbox som understøtter formattering (forskellige skrifttyper, kursiv, understreget, hævet/sænket skrift osv) i en Wordskabelon. Indholdet af textboxen skal kunne gemmes i en Access-database med bevaret formattering. Det skal ligeledes være muligt at hente teksten fra Access til textboxen i Word-skabelonen med bevaret formattering. Mine spørgsmål er nu:
1)    Hvilken type textbox/element kan jeg benytte, og hvis det ikke er standard, hvor kan det så hentes fra?
2)    Er det overhovedet muligt at gemme/hente RichText-formatteret tekst fra/til en Access-database?

På forhånd tak
Christian
Avatar billede mortrr Praktikant
31. marts 2003 - 21:20 #1
Du kan sagtens bruge en richedit, du skal bare vise/gemme xxx.TextRTF i fx et memo-felt.
Avatar billede mortrr Praktikant
31. marts 2003 - 21:21 #2
"en richtext" selvfølgelig.
Avatar billede hugopedersen Nybegynder
01. april 2003 - 07:20 #3
Du kan købe en proff. component fra FMS Inc.
http://www.fmsinc.com/products/memo/index.html

Om der findes nogen gratis ved jeg ikke.
Avatar billede cpnielsen Nybegynder
01. april 2003 - 09:09 #4
hugopedersen: Kan jeg også indsætte den nævnte component i en Wordskabelon og indtaste richtext formatteret tekst til denne?
Avatar billede hugopedersen Nybegynder
01. april 2003 - 09:31 #5
Der bliver jeg dig svar skyldig.  Check på webbet.
Avatar billede mortrr Praktikant
01. april 2003 - 15:31 #6
Det "eneste" du får ekstra i en købe-kontrol er automatisk databinding (i access - ikke word) og nemmere mulighed for at lave menuer og toolbars.

Selve kontrollen kan indeholde det samme som den "normale" RichTextBox.

Og det bliver ikke nemmere at koble den på databasen, end en normal RichTextBox, da du selv skal tilføje en datasource hvis du vil bruges den fra word.

Jeg ville nu nok fraråde at bruge en richtextbox på en skabelon, og i stedet bruge vba til at hente/gemme rtf i access. Blandt andet kan du ikke lade den gå over flere sider.

Jeg har noget kode (fra en tysker), som giver adgang til clipboardet fra vba, så man kan trække rtf ud af et dokument. (det er den eneste måde at få fat i rtf fra word, ud over at gemme som en rtf-fil og indlæse filen)
Så skal du bare have tilføjet at den skal gemme rtf'en (som reelt bare er tekst kodet på en bestemt måde) i databasen.
Avatar billede cpnielsen Nybegynder
01. april 2003 - 17:33 #7
mortrr: Det lyder godt. Jeg ville blive glad, hvis jeg kunne se den kode, du taler om. Hvis det er ok, så send til christian_pihl_nielsen@oncable.dk
Tak
Avatar billede mortrr Praktikant
01. april 2003 - 20:58 #8
Lad os prøver her.
Kunne være andre også kan bruge det.

Opret et nyt Class module, navngiv det clipboard, og paste følgende ind:
============================================
Option Explicit

Private Const mModulName As String = "Clipboard"


#If VBA6 Then  ' Public Enum erst ab VBA 6 (Office 2000)
Public Enum ClipboardFormatEnum
    ' Textformate
    CF_TEXT = 1            ' Ansi-Text (Standard)
    CF_UNICODETEXT = 13    ' Text im Unicodeformat
    CF_OEMTEXT = 7          ' OEM Text
    CF_RTFTEXT = &HBF01&    ' Rich Text Format (.rtf file)
    ' Bildformate
    CF_BITMAP = 2          ' Bitmap (.bmp files)
    CF_METAFILEPICT = 3    ' Metafile (.wmf files)
    CF_DIB = 8              ' Device-independent bitmap (DIB)
    CF_PALETTE = 9          ' Farbpalette
    CF_ENHMETAFILE = 14    ' Erweitertes Metafile (.emf)
End Enum

#Else      ' Konstanten für Standardmodul (Access 97)

' Textformate
Const CF_TEXT          As Long = 1        ' Ansi-Text (Standard)
Const CF_UNICODETEXT    As Long = 13        ' Text im Unicodeformat
Const CF_OEMTEXT        As Long = 7        ' OEM Text
Const CF_RTFTEXT        As Long = &HBF01&  ' Rich Text Format (.rtf file)
' Bildformate
Const CF_BITMAP        As Long = 2        ' Bitmap (.bmp files)
Const CF_METAFILEPICT  As Long = 3        ' Metafile (.wmf files)
Const CF_DIB            As Long = 8        ' Device-independent bitmap (DIB)
Const CF_PALETTE        As Long = 9        ' Farbpalette
Const CF_ENHMETAFILE    As Long = 14        ' Erweitertes Metafile (.emf)
#End If

Private Const GHND As Long = &H42 ' GMEM_MOVEABLE | GMEM_ZEROINIT
Private Declare Function GlobalAlloc Lib "kernel32" ( _
    ByVal wFlags As Long, _
    ByVal dwBytes As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" ( _
    ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" ( _
    ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" ( _
    ByVal hMem As Long) As Long

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" ( _
    ByVal lpDestination As Any, _
    ByVal lpSource As Any) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" ( _
    ByVal lpSource As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Private Declare Function OpenClipboard Lib "User32" ( _
    ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "User32" () As Long
Private Declare Function EmptyClipboard Lib "User32" () As Long
Private Declare Function SetClipboardData Lib "User32" ( _
    ByVal wFormat As Long, _
    ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "User32" ( _
    ByVal wFormat As Long) As Long

Private Declare Function EnumClipboardFormats Lib "User32" ( _
    ByVal wFormat As Long) As Long
Private Declare Function IsClipboardFormatAvailable _
    Lib "User32" ( _
    ByVal wFormat As Long) As Long
Private Declare Function GetClipboardFormatName _
    Lib "User32" Alias "GetClipboardFormatNameA" ( _
    ByVal wFormat As Long, _
    ByVal lpszformatname As String, _
    ByVal cchMaxCount As Long) As Long

Public Sub Clear()
' Clipboard leeren
    If OpenClipboard(0&) <> 0 Then
        EmptyClipboard
        CloseClipboard
    End If
End Sub

Public Function GetFormat(Optional Format As Long = 1) As Boolean
' Übergabe des gewünschten Clipboard-Formates
' Liefert die True oder False
    If OpenClipboard(0&) <> 0 Then
        GetFormat = IsClipboardFormatAvailable(Format)
        CloseClipboard
    End If
End Function

Public Function EnumFormats(Optional Format As Long = 0) As Long
' Liefert nacheinander die verfügbaren Formate
    If OpenClipboard(0&) <> 0 Then
        EnumFormats = EnumClipboardFormats(Format)
        CloseClipboard
    End If
End Function

Public Function FormatName(Format As Long) As String
' Liefert nacheinander die verfügbaren Formate
    Dim lSize As Long
    If OpenClipboard(0&) <> 0 Then

        FormatName = String$(256, vbNullChar)
        lSize = GetClipboardFormatName(Format, FormatName, 255)
        FormatName = Left(FormatName, lSize)

        CloseClipboard
    End If
End Function

Public Function GetText(Optional Format As Long = 1) As String
' Liefert die Daten aus der Zwischenablage als Text
    Dim hMem As Long
    Dim lpMem As Long
    Dim lSize As Long
    Dim Str As String

    ' Zwischenablage öffnen
    GetText = ""
    If OpenClipboard(0&) = 0 Then
        Err.Raise 521, mModulName, "Zwischenablage kann nicht geöffnet werden."
        Exit Function
    End If

    ' Zugriff auf Speicherblock
    hMem = GetClipboardData(Format)
    If hMem = 0& Then
        CloseClipboard
        Exit Function
    End If

    ' Speicherblock sperren und in Variable übertragen
    lpMem = GlobalLock(hMem)
    If lpMem <> 0 Then
        lSize = lstrlen(lpMem)
        If lSize <> 0 Then
            Str = String$(lSize + 1, vbNullChar)
            lstrcpy Str, lpMem
            GetText = Left$(Str, InStr(1, Str, vbNullChar, vbBinaryCompare) - 1)
        End If
        GlobalUnlock hMem
    End If

    CloseClipboard
End Function

Public Sub SetText(Str As String)
' Stellt die Zeichenkette in der Zwischenablage ab
    Dim hMem As Long
    Dim lpMem As Long

    ' Zwischenablage öffnen
    If OpenClipboard(0&) = 0 Then
        Err.Raise 521, mModulName, "Zwischenablage kann nicht geöffnet werden."
        Exit Sub
    End If

    ' Speicherblock im globalen Heap erstellen
    hMem = GlobalAlloc(GHND, Len(Str) + 1)
    If hMem = 0 Then
        CloseClipboard
        Err.Raise 7, mModulName, "Nicht genügend Speicher."
        Exit Sub
    End If
    lpMem = GlobalLock(hMem)
    lstrcpy lpMem, Str
    GlobalUnlock hMem

    ' Übertragen in die Zwischenablage
    EmptyClipboard
    SetClipboardData CF_TEXT, hMem
    CloseClipboard
End Sub
========================================
Avatar billede mortrr Praktikant
01. april 2003 - 21:01 #9
En lille funktion til at teste det kunne være:

Sub Test1()
Dim clp As New clipboard, Format As Long, strFormat as String

Selection.Copy ' Kopier den aktuelt valgte tekst
Format = 0
Do ' Gennemløb de formater der er på clipboardet
    Format = clp.EnumFormats(Format)
    strFormat = clp.FormatName(Format)
    If strFormat = "Rich Text Format" Then
        msgBox clp.GetText(Format) ' Vis den herlige rtf-kode
    End If
Loop Until Format = 0
End Sub
Avatar billede mortrr Praktikant
01. april 2003 - 21:05 #10
Ser lige at der mangler en SetRTF sub i clipboard (læg rtf på clipboard), og jeg kan faktisk ikke finde den jeg tilføjede dengang jeg skulle bruge det.

Men jeg mener den eneste forskel var at jeg ændrede CF_TEXT til CF_RTFTEXT:
Public Sub SetRTF(Str As String)
' Stellt die Zeichenkette in der Zwischenablage ab
    Dim hMem As Long
    Dim lpMem As Long

    ' Zwischenablage öffnen
    If OpenClipboard(0&) = 0 Then
        Err.Raise 521, mModulName, "Zwischenablage kann nicht geöffnet werden."
        Exit Sub
    End If

    ' Speicherblock im globalen Heap erstellen
    hMem = GlobalAlloc(GHND, Len(Str) + 1)
    If hMem = 0 Then
        CloseClipboard
        Err.Raise 7, mModulName, "Nicht genügend Speicher."
        Exit Sub
    End If
    lpMem = GlobalLock(hMem)
    lstrcpy lpMem, Str
    GlobalUnlock hMem

    ' Übertragen in die Zwischenablage
    EmptyClipboard
    SetClipboardData CF_RTFTEXT, hMem
    CloseClipboard
End Sub
Avatar billede mortrr Praktikant
01. april 2003 - 21:06 #11
Næste trin er så at læse fra database og bagefter gemme i denne.

Det er rimeligt ud af landevejen.
Opret en ado connection, læs via et recordset og skriv via connection.execute

rtf-koden lægges ind i et normalt memo-felt.
Avatar billede mortrr Praktikant
01. april 2003 - 21:31 #12
Det var ikke helt den rigtige værdi på formatet. Kan også huske det var et eller andet med det. Vil prøve at finde den jeg lavede engang.
Prøv denne:

Public Sub SetRTF(Str As String)
Const CF_RTFTEXT_W2K = 49291
' Stellt die Zeichenkette in der Zwischenablage ab
    Dim hMem As Long
    Dim lpMem As Long

    ' Zwischenablage öffnen
    If OpenClipboard(0&) = 0 Then
        Err.Raise 521, mModulName, "Zwischenablage kann nicht geöffnet werden."
        Exit Sub
    End If

    ' Speicherblock im globalen Heap erstellen
    hMem = GlobalAlloc(GHND, Len(Str) + 1)
    If hMem = 0 Then
        CloseClipboard
        Err.Raise 7, mModulName, "Nicht genügend Speicher."
        Exit Sub
    End If
    lpMem = GlobalLock(hMem)
    lstrcpy lpMem, Str
    GlobalUnlock hMem

    ' Übertragen in die Zwischenablage
    EmptyClipboard
    SetClipboardData CF_RTFTEXT_W2K, hMem
    CloseClipboard
End Sub
Avatar billede cpnielsen Nybegynder
02. april 2003 - 10:08 #13
Umiddelbart lyder det som en god plan.
Jeg benytter altså clipboardet til at få fat på rtf'en, som dernæst kan gemmes til Access. Når jeg senere ønsker at hente den gemte rtf fra Access, burde jeg så ikke kunne indsætte rtf'en direkte ved f.eks. et bogmærke i Word?
Avatar billede mortrr Praktikant
02. april 2003 - 12:08 #14
Præcist på den måde.

clp.setRTF(RTFkoden)
Selection.Paste
Avatar billede cpnielsen Nybegynder
02. april 2003 - 23:35 #15
Det virker fremragende lige bortset fra, at der i setRTF skal stå "Const CF_RTFTEXT_W2K = 49359" istedet for "Const CF_RTFTEXT_W2K = 49291"
Mange tak for hjælpen
Avatar billede mortrr Praktikant
03. april 2003 - 00:01 #16
Den varierer desværre efter hvilke clipboard formater der eksisterer på den aktuelle computer.

Jeg kan ikke finde den gamle funktion, men den gik ud på at bruge EnumFormats og FormatName til at finde formatet der returnerer "Rich Text Format".
Lidt på samme måde som den lille Test1-sub.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester