Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Richtextbox:n ominaisuudet käyttöön. VB2008 + access 2007

Sam76 [19.05.2008 21:44:37]

#

Eli oisko jollain ideaa siitä, miten kannattaisi alkaa rakentelemaan sellaista rtf-boksia, johon saisi sen ominaisuuksia mukaan. Eli sellaiset toiminnallisuudet kuten bold, italic, alleviivaus ja ehkä fonttikokovalikko. Tarkoitus olisi, että ne saisi halutessaan käyttöön vaikka siitä yläpuolella olevista ikoneista tms. Löysin täältä yhden ohjeen mutta se oli vanhempaan versioon ja en saanut sitä toiminaan kunnolla. ELi jos löytyy 2005-> versiolla tehtyä esimerkkiä/vinkkejä niin otetaan miellellään vastaan.

Ja toinen kysymys aiheeseen: miten voin tehdä SQL-kyselyn rtf:nä tallennetun tekstin sisään (siis tyyliin: SELECT joku1 where joku2 like '%" & muuttuja & "%'). Tekstihän ei ole kannassa selkokielisenä.

neau33 [20.05.2008 01:12:22]

#

Heippa taas Sam76!

1. VSTO (Visual Studio Tools for Office) on avainsana

2. Laita SQL-lause vaikkapa _ 'tagien' sisään...
plaa plaa plaa_SELECT joku1 FROM jostain where joku2 like '%" & muuttuja & "%'_plää plää plää...
Piilota 'tagit' tekstistä vaihtamalla merkin väriksi pohjavärin ja sitten vain splittat SQL-luseen/t tauluun...

Imports System.Data
Imports System.Data.OleDb
Imports Microsoft.VisualBasic
'...

Sub MainFormLoad(sender As Object, e As EventArgs)
    Richtextbox1.Text = _
    "plaa plaa plaa_SELECT joku1 FROM jostain where joku2 like '%" _
    + Chr(34) + " & muuttuja & " + Chr(34) + "%'_plää plää plää" + _
    Environment.NewLine + _
    "plaa plaa plaa_SELECT joku1 FROM jostain where joku2 like '%" _
    + Chr(34) + " & muuttuja & " + Chr(34) + "%'_plää plää plää"
    vaihda_väri()
    Richtextbox1.SelectionStart = Richtextbox1.Text.Length
End Sub

Sub MainFormShown(sender As Object, e As EventArgs)
    Dim muuttuja(10) As Object
    muuttuja(0) = "jotain"
    muuttuja(1) ="jotain toista"
   'jne...

    Dim strArray() As String
    Dim i, j As Integer
    strArray = Split(richtextbox1.Text, "_")

    If strArray.Length > 0 Then
      For i = 0 To strArray.Length -1
        If strArray(i).IndexOf("SELECT") > -1 Then
          strArray(i) = Replace(strArray(i), Chr(34) + _
          " & muuttuja & " + Chr(34), muuttuja(j))
          j += 1
          msgbox(strArray(i))
          '...
          'Dim cmd As OleDbCommand = _
          'New OleDbCommand(strArray(i), connection)
          'plaa plaa plaa
        End If
      Next i
    End If
End Sub

Sub vaihda_väri()
    Dim merkki As String = "_", i As Integer = 0
    For i = 0 to RichTextBox1.Text.Length
      Etsi (merkki, i, RichTextBox1.Text.Length)
      RichTextBox1.SelectionColor = RichTextBox1.BackColor
    Next i
End Sub

Public Function Etsi( ByVal hakusana As String, _
  ByVal alku As Integer, ByVal loppu As Integer) As Integer
    Dim palaute As Integer = -1
    If hakusana.Length > 0 And alku >= 0 Then
      If loppu > alku Or loppu = -1 Then
        Dim indeksi As Integer = _
          richTextBox1.Find(hakusana, alku, _
          loppu, RichTextBoxFinds.MatchCase)
            If indeksi >= 0 Then
              palaute = indeksi
            End If
      End If
    End If
    Return palaute
 End Function

Sam76 [20.05.2008 21:14:32]

#

Kiitos taas Nea :)

neau33 [21.05.2008 10:50:00]

#

Heippa taas Sam76 + kaikki muutkin aiheesta kiinnostuneet!

Minulla on nyt tähän aiheeseen liittyvä seuraavanlainen ongelma:
Rakentelin VB.NET UserControllin, johon iskin RichTextBoxin, ComboBoxin, NumericUpDownBoxin ja muutaman Labellin. Kontrollien SelectedIndexChanged_ ja Clik_Tapahtumista laukaistaan sitten tarvittavat aliohjelmat, joilla muunnellaan RichTextBoxin tekstiominaisuuksia. Sitten kääntelin assemblyn ComVisible-vipu ON asennossa (GUID, StrongName jutskat hoidettu asianmukaisesti)
ja rekisteröin .dll'n RegAsm'lla + iskin vielä GAC'een. No sitten rakentelin vielä Excel .xla lisämakron joka lataa kontrollin OleObjektina mihin tahansa työkirjaan työkalurivin nappulasta ja kaikki toimii itse kontrollin osasalta aivan loistavasti, mutta kun yritän sulkea Excelin niin eipä sulkeudu normaalisti...(Työkirja sulkeutuu erikseen, uuden pystyy avaamaan, tauluja pystyy poistamaan ja lisäämään jne...). Kun sitten aloin tosissani tutkimaan, että missä vika niin havaitsin, että jos laitan tauluun nappulan ja sen taakse koodin joka tutkii luupissa aktiivisen taulun OleObjektit niin makro ei pysty palauttamaan objektien nimiä silloin, kun taulussa on '.NET UserControlli'...
(samainen kontrolli toimii esim. VB6:ssa täysin ongelmitta)

Olisi erittäin kiva asia jos tähän voisi saada joltakulta vähän valaistusta...

Sam76 [21.05.2008 23:31:36]

#

Minua niin harmittaa, kun en osaa auttaa tässä ongelmassa. Olen vielä niin vihreä koodin kanssa( harrastanut vajaa 2v), että osa tuosta kuvauksestakin meni yli hilseen. Mutta lupaan, että kun minusta tulee iso ja viisas(???), yritän olla myös neuvovana osapuolena. :/

neau33 [24.05.2008 12:40:09]

#

Heippa Taas Sam76 + muut asiasta kiinnostuneet!

tein koemielessä tällaisen viritelmän, jossa käytän VB6 ActiveX .dll'ää asennettujen fonttien selvittämiseen & stdole.fonttiluokkaa fonttityylien määrittämiseen. Jos haluaa unohtaa VB6:n niin asennetut fontit voi poimia System.Drawing.Text.InstalledFontCollection() luokan avulla (projektista voi tällöin poistella kaiken missä on viittaus ole... tai Ole...).

' VB6 ActiveX.dll
' GetInstalledFonts : ifonts (ifonts.cls)
' käännä ja rekisteröi regsvr.32.exe:llä
Option Explicit

Private Const DLL_PROCESS_DETACH = 0
Private Const DLL_PROCESS_ATTACH = 1
Private Const DLL_THREAD_ATTACH = 2
Private Const DLL_THREAD_DETACH = 3

Public Function DllMain(hInst As Long, _
fdwReason As Long, lpvReserved As Long) As Boolean
   Select Case fdwReason
      Case DLL_PROCESS_DETACH
      Case DLL_PROCESS_ATTACH
         DllMain = True
      Case DLL_THREAD_ATTACH
      Case DLL_THREAD_DETACH
   End Select
End Function

Public Function InstFonts() As Variant

  Dim strFonts() As String
  Dim i As Integer
  Dim j As Integer
  For i = 0 To Screen.FontCount - 1
    If InStr(Screen.Fonts(i), "@") = 0 And _
    InStr(Screen.Fonts(i), "WST_") = 0 Then
      ReDim Preserve strFonts(j)
      strFonts(j) = Screen.Fonts(i)
      j = j + 1
    End If
  Next i
  InstFonts = strFonts()
  Erase strFonts

End Function
'VB.NET sovellus
' Käännä (VB6) GetInstalledFonts.dll .NET assemblyksi:
' InteropGetInstalledFonts.dll  TLbImp.exe - ohjelmalla &
' tuo käännetty assembly projektiin...

Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports InteropGetInstalledFonts
Imports Microsoft.VisualBasic

<Microsoft.VisualBasic.ComClass()>Public Partial Class MainForm
Inherits System.Windows.Forms.Form

Public Shared WithEvents fnt As stdole.IFontDisp  =  _
New stdole.StdFontClass()
Public Shared WithEvents fntFamily As FontFamily
Public Shared fntStyle As FontStyle
Public Declare Auto Function OLEInitialize Lib "ole32" _
Alias "OleInitialize" (ByVal frm As Form) As Integer

  Public Sub New()
    Me.InitializeComponent()
    OLEInitialize(Me)
  End Sub

  Sub MainFormLoad(sender As Object, e As EventArgs)

       Dim ctl As Control
       For Each ctl In Me.Controls
         If ctl.name.Substring(0,5) = "fsBtn" Then
             ctl.Tag = False
             ctl.BackColor = Color.WhiteSmoke
         End If
       Next

       FillCboFontNames

  End Sub

  Sub ComboBox1SelectedIndexChanged(sender As Object, e As EventArgs)
     ChangeRtfStyle
  End Sub

  Sub FsBtn0Click(sender As Object, e As EventArgs)
    SetFontStyleOptions(sender)
  End Sub

  Sub FsBtn1Click(sender As Object, e As EventArgs)
    SetFontStyleOptions(sender)
  End Sub

  Sub FsBtn2Click(sender As Object, e As EventArgs)
    SetFontStyleOptions(sender)
  End Sub

  Sub FsBtn3Click(sender As Object, e As EventArgs)
    SetFontStyleOptions(sender)
  End Sub

  <ComRegisterFunction()> _
  Public Sub FillCboFontNames()

    Dim i As Integer = 0
      Dim index As Integer = 0

      Dim iFonts As New InteropGetInstalledFonts.ifontsClass()
      Dim strFonts() As Object = _
      iFonts.InstFonts()
      For i =  0 To strFonts.getUpperBound(0)
        comboBox1.Items.Add(strFonts(i))
      Next
      For i = 0 To comboBox1.Items.Count -1
        If  comboBox1.Items(i) = "Times New Roman" Then
          index = i: Exit for
        End If
      Next
      comboBox1.SelectedIndex = index
      numericUpDown1.Value = 10
      strFonts = Nothing
      iFonts = Nothing

  End Sub

  <ComRegisterFunction()> _
  Public Sub ChangeRtfStyle()

    fnt.Name = ComboBox1.SelectedItem.ToString
    fnt.Size = numericUpDown1.value

    Try
    fntFamily = New FontFamily(fnt.Name)
    Richtextbox1.SelectionFont = _
    New Font(fntFamily, fnt.Size, fntStyle)
    Catch ex As Exception
    End Try

  End Sub

  Sub NumericUpDown1ValueChanged(sender As Object, e As EventArgs)
    fnt.Size = numericUpDown1.value
    Richtextbox1.SelectionFont = _
    New Font(fntFamily, fnt.Size, fntStyle)
  End Sub

  Sub FcBtnClick(sender As Object, e As EventArgs)
    SetFontColorOptions(sender)
  End Sub

  Sub BcBtnClick(sender As Object, e As EventArgs)
     SetFontColorOptions(sender)
  End Sub

  <ComRegisterFunction()> _
  Public Sub SetFontColorOptions(ctl As Control)

    colorDialog1.ShowDialog

    Select Case ctl.Name
      Case "fcBtn"
       richTextbox1.SelectionColor = _
       ColorDialog1.Color: Exit Sub
      Case "bcBtn"
      richTextbox1.SelectionBackColor = _
       ColorDialog1.Color: Exit Sub
    End Select

  End Sub

  <ComRegisterFunction()> _
  Public Sub SetFontStyleOptions(ctl As Control)

      ctl.Tag = Not ctl.Tag

      If ctl.Tag Then
      ctl.BackColor = Color.LightGray
      Else
      ctl.BackColor = Color.WhiteSmoke
      End If
      Dim i As Integer = 0
      Dim binStr As String = ""

      For i = 3 To 0 Step -1
        If Me.Controls("fsBtn" & Cstr(i)).Tag = True Then
          binStr += "1"
        Else
          binStr += "0"
      End If
      Next

      Dim value As long = 0
      For i = binStr.Length To 1 Step -1
      If Mid(binStr, i, 1) = "1" Then
        value +=  2 ^ (binStr.Length - i)
      End If
      Next i
      fntStyle= value
      ChangeRtfStyle

  End Sub

  Sub MainFormFormClosing(sender As Object, e As FormClosingEventArgs)
     OLEInitialize(Nothing)
  End Sub

End Class

Sam76 [25.05.2008 23:04:22]

#

Oot kyllä taitava 8-)

Ihan kaikki tuosta ei vielä täysin avautunut mutta varsin mielenkiintoiselta rakennelmalta tuo vaikuttaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta