Onko TextBoxin ja RichTextBoxin ominaisuuksia yhdistää yksinkertaisesti?
Muutamia ominaisuuksia jota haluaisin yhdistää:
- Tabilla hyppiminen (AcceptsTab)
- Sanojen tunnistaminen (AutoCompleteSource)
- Rtf Formaatti (RichTextBox)
- Tekstin kohdistaminen (TextAlign)
RTF-formaatissahan on mahdollista käyttää useampaa eri tasausta, joten TextAlign ei ole sille mielekäs. Toki voit muuttaa koko teksti alignin joksikin, eli se sinänsä on siinä.
Autocompletesource on selvästikin suunniteltu yksittäisen tiedon syöttämiseen (esim. URL, tiedostonimi, valinta listalta, jne) ja RTF taas tyypillisesti ei ole mielekäs tuollaiseen. Eli näiden miksaaminen tuntuu äkkiseltään epäluontevalta. Millainen tarve tähän olisi?
En nyt muista kummalla tavalla RTB käyttäytyy tabin osalta, mutta jos se on ikäänkuin AcceptsTab=False, niin käänteinen toiminnallisuus on helppo saada pikku koodinpätkällä.
Suunnitelin Autocompletesourceea ns. Sanan auto. tunnistukseen, eli ohjelma ehottaisi sanaa kun sitä on alettu kirjoitaa, (ehdotukset tulisivat ContextMenuStrip componenttiin)...
Eli jos käyttäjä lähtee kirjoittamaan sanaa: Koira, niin muutamat ehdoitukset saattavat olla tyyliin: Koulu, Koti, Koira, jne.
Osaatteko sanoa miten vb.netissä tehdään tehdään:
- Lihavoinnin vaihto
- Kursiivi / Ei kursiivia
- Alleviivaus / Ei alleviivausta
- Yliviivaus / Ei yliviivausta
- Teksin sisennys / teksin "ulonnus"
RTB.Font.Bold = True tai RTB.Font.Bold = False
RTB.Font.Italic = True tai RTB.Font.Italic = False
RTB.Font.Underline = True tai RTB.Font.Underline = False
RTB.Font.Strikeout = True tai RTB.Font.Strikeout = False
RTB.Margin.Left = 50 'Sisennys 50px
En vaan osaa, tai noi ei toimi halutulla tavalla...
tulee vaan ilmoitus että:
Property 'Bold' is 'ReadOnly'
Property 'Italic' is 'ReadOnly'
Property 'Underline' is 'ReadOnly'
Property 'Strikeout' is 'ReadOnly'
ja Error 27 kun yritin tota sisennystä...
No jopas, olis vissiin pitänyt ihan kokeillakin. Mites olis
Boldille, valitulle alueelle
RTB.SelectionFont = New Font(RTB.SelectionFont, RTB.SelectionFont.Style Xor FontStyle.Bold)
Ja muille tyyleille vastaavasti.
Tai sitten koko boksille:
RTB.Font = New Font(RTB.Font, RTB.Font.Style Xor FontStyle.Bold)
Ja se sisennys on näköjään RTB.SelectionIndent = 50
Kiitti, nyt sain toimimaan.
Tuli yksi ongelma eteen Kuvan muokkaamisen kanssa...
eli, kun haluaisin muokata kuvaa niin ohjelman pitäisi avata kuva Paintissa.
ps. Paintin avaaminen onnistuu, mutta miten saan paintin lataamaan halutun kuvan?
Tiedoston nimen voi kirjoittaa käynnistyskomennon jälkeen:
Shell("mspaint c:\omat\kuva.bmp", AppWinStyle.NormalFocus)
Onko teillä tietoa miten saisin ohjelmani avaamaan muita kuin *.txt ja *.rtf formaatissa olevia tiedostoja?
esim. miten saisin avattua *.doc tiedoston?
Moikka ANTI-propellipää!
tässä yksi tapa word-tiedoston (.doc) tekstin lukemiseksi vb6:lla...
'Formille: nappi & textiboxi Private Sub Command1_Click() ' Referenssit: ' Microsoft Word 11.0 Object Library" ' (C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB) ' (vaihda versionumero tarvittaessa) ' Microsoft WMI Scripting V1.2 Library '(C:\WINDOWS\system32\wbem\wbemdisp.TLB) tapa_prosessi "WINWORD" Dim appWord As Word.Application Dim wrdDoc As Word.Document Dim tiedosto As String tiedosto = Environ("userprofile") & "\Työpöytä\testi.doc" Set appWord = New Word.Application Set wrdDoc = appWord.Documents.Open(tiedosto) wrdDoc.Application.DisplayAlerts = wdAlertsNone wrdDoc.Application.Visible = False If wrdDoc.Words.Count > 0 Then Dim teksti As String Text1.Text = "" For i = 1 To wrdDoc.Words.Count Text1.Text = Text1.Text _ + wrdDoc.Words(i).Text Next i End If tapa_prosessi "WINWORD" Set wrdDoc = Nothing Set appWord = Nothing End Sub Sub tapa_prosessi(ByVal AppName As String) Dim prosessit As Object, prosessi As Object Set prosessit = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_Process") For Each prosessi In prosessit With prosessi If UCase(.Name) = AppName & ".EXE" Then .Terminate End If End With Next End Sub
kiitti, Mutta... saisko vielä vb.net versiota (en omista vb6.tta)
Heippa taas ANTI-propellipää!!
voisit sisällyttää jatkossa aiheesi otsikkoon selvennykseksi .NET - liitteen...
no kun nyt tuli tehtyä, niin sitten niile jotka äheltävät vielä VB6:lla...
' Formille: 2 nappi & tekstboxi ' Projektiin referenssit: ' Microsoft Word 11.0 Object Library" ' (C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB) ' (vaihda versionumero tarvittaessa) ' Microsoft WMI Scripting V1.2 Library '(C:\WINDOWS\system32\wbem\wbemdisp.TLB) Dim appWord As Word.Application Dim wrdDoc As Word.Document Dim tiedosto As String Private Sub Form_LOad() Command1.Caption = "Avaa" Command2.Caption = "Tallenna" Command2.Enabled = False End Sub Private Sub Command1_Click() 'samat referenssit kuin edellisessä esimerkissä tiedosto = Environ("userprofile") & "\Työpöytä\testi.doc" Text1.Text = "" avaa_dokumentti (tiedosto) If wrdDoc.Words.Count > 0 Then Dim teksti As String For i = 1 To wrdDoc.Words.Count Text1.Text = Text1.Text + wrdDoc.Words(i).Text Next i End If Text1.Tag = Text1.Text sulje_dokumentti CommandButton2.Enabled = True End Sub Private Sub Command2_Click() CommandButton1.Enabled = False Dim splitti() As String If Text1.Tag <> Text1.Text Then If Text1.Text <> "" Then If InStr(Text1.Text, " ") > 0 Then splitti = Split(Text1.Text, " ") Else ReDim splitti(0) splitti(0) = Text1.Text End If avaa_dokumentti (tiedosto) For i = wrdDoc.Words.Count To 1 Step -1 wrdDoc.Words(i).Delete Next i For i = 0 To UBound(splitti) If i < UBound(splitti) Then splitti(i) = splitti(i) + " " End If wrdDoc.Words.Last.Text = splitti(i) Next i wrdDoc.Save End If sulje_dokumentti End If Command1.Enabled = True End Sub Sub avaa_dokumentti(ByVal nimi As String) tapa_prosessi "WINWORD" Set appWord = New Word.Application appWord.DisplayAlerts = wdAlertsNone Set wrdDoc = appWord.Documents.Open(nimi) wrdDoc.Application.DisplayAlerts = wdAlertsNone wrdDoc.Application.Visible = False End Sub Sub sulje_dokumentti() wrdDoc.Close False tapa_prosessi "WINWORD" Set wrdDoc = Nothing Set appWord = Nothing End Sub Sub tapa_prosessi(ByVal AppName As String) Dim prosessit As Object, prosessi As Object Set prosessit = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_Process") For Each prosessi In prosessit With prosessi If UCase(.Name) = AppName & ".EXE" Then .Terminate End If End With Next End Sub
...VB.NET versio seuraa jatkossa...
Heippa taas ANTI-propellipää!!
tässä lupaamani VB.NET versio...
'Väännetty Sharp Develop 3.0:lla Imports System.Diagnostics Imports Word 'Projektiin COM referenssi 'Microsoft Word 11.0 Object Library Imports System.Runtime.InteropServices 'Formille: 2 nappia, tekstiboxi & openFileDialog-kontrolli Public Partial Class MainForm Shared appWord As Word.ApplicationClass Shared wrdDoc As Word.Document Friend doc_name As String = String.Empty Public Sub New() Me.InitializeComponent() End Sub Sub MainFormLoad(sender As Object, e As EventArgs) button1.Text = " AVAA " button2.Text = "TALLENNA" button2.Enabled = False End Sub Sub Button1Click(sender As Object, e As EventArgs) OpenFileDialog1.FileName = "" OpenFileDialog1.InitialDirectory = _ Environment.GetFolderPath( _ Environment.SpecialFolder.Desktop) OpenFileDialog1.Filter = _ "Word Document (*.doc)|*.doc" If openFileDialog1.ShowDialog() = _ System.Windows.Forms.DialogResult.OK Then doc_name = OpenFileDialog1.FileName textBox1.Text = "" Open_Document(doc_name) If wrdDoc.Words.Count > 0 Then For i As Integer = 1 To wrdDoc.Words.Count textBox1.Text += wrdDoc.Words(i).Text Next i textBox1.Tag = textBox1.Text button2.Enabled = True End If Close_Document Else doc_name = String.Empty End If End Sub Sub Button2Click(sender As Object, e As EventArgs) If doc_name = String.Empty Then Exit Sub End If button1.Enabled = False Dim splitti() As String If textBox1.Tag <> textBox1.Text Then If textBox1.Text <> "" Then If textBox1.Text.IndexOf(" ") > -1 Then splitti = textBox1.Text.Split(" ") Else ReDim splitti(0) splitti(0) = textBox1.Text End If Open_document(doc_name) For i As Integer = wrdDoc.Words.Count To 1 Step -1 wrdDoc.Words(i).Delete Next i For i As Integer = 0 To UBound(splitti) If i < splitti.GetUpperBound(0) Then splitti(i) = splitti(i) + " " End If wrdDoc.Words.Last.Text = splitti(i) Next i wrdDoc.Save: textBox1.Tag = textBox1.Text End If Close_Document End If button1.Enabled = True End Sub Sub Open_Document(ByVal document As String) Kill_Process("WINWORD") appWord = New Word.ApplicationClass wrdDoc = appWord.Documents.Open(document) wrdDoc.Application.DisplayAlerts = False wrdDoc.Application.Visible = False End Sub Sub Close_Document() wrdDoc.Close(False) Kill_Process("WINWORD") wrdDoc = Nothing appWord = Nothing End Sub Sub Kill_Process(ByVal AppName As String) Dim MyProcess As Process() = _ Process.GetProcessesByName(AppName) If Not MyProcess Is Nothing Then For i As Integer = MyProcess.GetLowerBound(0) _ To MyProcess.GetUpperBound(0) Try MyProcess(i).Kill() Catch ex As Exception End try Next End If MyProcess = Nothing End Sub End Class
Kiitti,
Sain toimimaan lähes halutulla tavalla, mutta en saa kuvia näkymään...
MOI taas ANTI-propellipää!!!
tässä sulle 'toimiva' viritelmä...
Imports System.Diagnostics Imports Word 'Projektiin COM referenssi 'Microsoft Word 11.0 Object Library Imports System.Runtime.InteropServices 'Formille: 2 nappia, richTextBoxi & openFileDialogi Public Partial Class MainForm Shared appWord As Word.ApplicationClass Shared wrdDoc As Word.Document Friend doc_name As String = String.Empty Public Sub New() Me.InitializeComponent() End Sub Sub MainFormLoad(sender As Object, e As EventArgs) button1.Text = " AVAA " button2.Text = "TALLENNA" button2.Enabled = False End Sub Sub Button1Click(sender As Object, e As EventArgs) openFileDialog1.Multiselect = False openFileDialog1.InitialDirectory = _ Environment.GetFolderPath( _ Environment.SpecialFolder.Desktop) openFileDialog1.Filter = _ "Word Document (*.doc)|*.doc" openFileDialog1.DefaultExt = ".doc" openFileDialog1.FilterIndex = 0 openFileDialog1.FileName = "" openFileDialog1.DereferenceLinks = False openFileDialog1.RestoreDirectory = True If openFileDialog1.ShowDialog() = _ System.Windows.Forms.DialogResult.OK Then Dim tempRtfPath As String = _ openFileDialog1.FileName.Substring(0, _ openFileDialog1.FileName.LastIndexOf( _ "\")) + "\tempFile.rtf" richTextBox1.Text = "" Open_Document(OpenFileDialog1.FileName) If wrdDoc.Content.Text <> "" Then wrdDoc.SaveAs(tempRtfPath, 6) wrdDoc.Close() richTextBox1.LoadFile(tempRtfPath) kill(tempRtfPath) richTextBox1.Tag = richTextBox1.rtf button2.Enabled = True End If Close_Document Else openFileDialog1.FileName = "" End If End Sub Sub Button2Click(sender As Object, e As EventArgs) If OpenFileDialog1.FileName = "" Then Exit Sub End If button1.Enabled = False If richTextBox1.Tag <> richTextBox1.rtf Then If richTextBox1.rtf <> "" Then Open_Document(OpenFileDialog1.FileName) wrdDoc.Content.Text = richTextBox1.Rtf wrdDoc.SaveAs(OpenFileDialog1.FileName, 0) richTextBox1.Tag = richTextBox1.Text Close_Document End If End If button1.Enabled = True End Sub Sub Open_Document(ByVal document As String) Kill_Process("WINWORD") appWord = New Word.ApplicationClass wrdDoc = appWord.Documents.Open(document) wrdDoc.Application.DisplayAlerts = False wrdDoc.Application.Visible = False End Sub Sub Close_Document() On Error Resume Next wrdDoc.Close(False) Kill_Process("WINWORD") wrdDoc = Nothing appWord = Nothing End Sub Sub Kill_Process(ByVal AppName As String) Dim MyProcess As Process() = _ Process.GetProcessesByName(AppName) If Not MyProcess Is Nothing Then For i As Integer = MyProcess.GetLowerBound(0) _ To MyProcess.GetUpperBound(0) Try MyProcess(i).Kill() Catch ex As Exception End try Next End If MyProcess = Nothing End Sub End Class
Kiitti,
Sain toimimaan...
Moikka taas ANTI-propellipää!
pikku korjaus edelliseen esimerkkiin...voit poistaa tai lisätä kuvia rtfBoxiin ja tallentaa tiedoston lopulta word-dokumenttina (.doc)
Imports System.Diagnostics Imports Word 'Projektiin COM referenssi 'Microsoft Word 11.0 Object Library Imports System.Runtime.InteropServices 'Formille: 2 nappia, richTextBoxi & openFileDialogi Public Partial Class MainForm Private appWord As Word.ApplicationClass Private wrdDoc As Word.Document Private tempRtfPath As String Friend doc_name As String = String.Empty Public Sub New() Me.InitializeComponent() End Sub Sub MainFormLoad(sender As Object, e As EventArgs) button1.Text = " AVAA " button2.Text = "TALLENNA" button2.Enabled = False End Sub Sub Button1Click(sender As Object, e As EventArgs) openFileDialog1.Multiselect = False openFileDialog1.InitialDirectory = _ Environment.GetFolderPath( _ Environment.SpecialFolder.Desktop) openFileDialog1.Filter = _ "Word Document (*.doc)|*.doc" openFileDialog1.DefaultExt = ".doc" openFileDialog1.FilterIndex = 0 openFileDialog1.FileName = "" openFileDialog1.DereferenceLinks = False openFileDialog1.RestoreDirectory = True If openFileDialog1.ShowDialog() = _ System.Windows.Forms.DialogResult.OK Then tempRtfPath = _ openFileDialog1.FileName.Substring(0, _ openFileDialog1.FileName.LastIndexOf( _ "\")) + "\tempFile.rtf" richTextBox1.Text = "" Open_Document(OpenFileDialog1.FileName) If wrdDoc.Content.Text <> "" Then wrdDoc.SaveAs(tempRtfPath,6) Dim theText As Object = _ wrdDoc.Content.Text wrdDoc.Close() richTextBox1.LoadFile(tempRtfPath) kill(tempRtfPath) richTextBox1.Tag = richTextBox1.rtf button2.Enabled = True End If Close_Document Else openFileDialog1.FileName = "" End If End Sub Sub Button2Click(sender As Object, e As EventArgs) If OpenFileDialog1.FileName = "" Then Exit Sub End If button1.Enabled = False If richTextBox1.Tag <> richTextBox1.rtf Then If richTextBox1.rtf <> "" Then Close_Document richTextBox1.SaveFile(tempRtfPath) Open_Document(tempRtfPath) wrdDoc.SaveAs(OpenFileDialog1.FileName, 0) richTextBox1.Tag = richTextBox1.rtf Close_Document Kill(tempRtfPath) End If End If button1.Enabled = True End Sub Sub Open_Document(ByVal document As String) Kill_Process("WINWORD") appWord = New Word.ApplicationClass wrdDoc = appWord.Documents.Open(document) wrdDoc.Application.DisplayAlerts = False wrdDoc.Application.Visible = False End Sub Sub Close_Document() On error resume next wrdDoc.Close(False) Kill_Process("WINWORD") wrdDoc = Nothing appWord = Nothing End Sub Sub Kill_Process(ByVal AppName As String) Dim MyProcess As Process() = _ Process.GetProcessesByName(AppName) If Not MyProcess Is Nothing Then For i As Integer = MyProcess.GetLowerBound(0) _ To MyProcess.GetUpperBound(0) Try MyProcess(i).Kill() Catch ex As Exception End try Next End If MyProcess = Nothing End Sub End Class
Miten kuva lisätään tiedostoon ns. "oikeaoppisesti", itse olen käyttänyt tätä:
- RichTextBox1.Controls.Add(PictureBox1)
Mutta miten saisin tämän jälkeen liikutettua kuvaa haluttuun paikkaan, ja vaihtamaan kuvan "tilaa" eli onko se teksitin ylä/ala puolella...
Kuvan muokkaaminen pitäisi onnistua oik. hiirtä klikkaamalla ja ToolStrip:istä...
Kiitos jo etukäteen...
Aihe on jo aika vanha, joten et voi enää vastata siihen.