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 Function
Kiitos 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 Class
Oot 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.