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 Subkiitti, 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 ClassKiitti,
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 ClassKiitti,
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 ClassMiten 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.