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ä.
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 FunctionKiitos taas Nea :)
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...
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. :/
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 ClassOot kyllä taitava 8-)
Ihan kaikki tuosta ei vielä täysin avautunut mutta varsin mielenkiintoiselta rakennelmalta tuo vaikuttaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.