Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Parametrien välittäminen. VB2008

Sam76 [29.08.2008 12:33:02]

#

Ongelman kuvaus:
Tarkoituksena saada monikäyttöinen etsi-functio, jolle ilmoitetaan mitä(txt-laatikko) ja mistä haetaan(rtf-laatiko).

Jokin aika sitten neau33(kiitos siitä) opasti tälläisen haun, jotan olen muokannut hiukkasen.

Private Sub VR_hae2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VR_hae2.Click

        SuoritaHaku(VR_haku) ' kutsutaan hakua ja annetaan sille txt-boksin arvo

    End Sub

Public Sub SuoritaHaku(ByVal ctl As TextBox)

        Dim sana As String
        sana = ctl.Text
        Dim i As Integer

        For i = 0 To VR_kaikki.Text.Length
            Etsi(sana, i, VR_kaikki.Text.Length)
            VR_kaikki.SelectionColor = Color.Blue
            VR_kaikki.SelectionFont = _
            New Font(VR_kaikki.Font.Name, _
            VR_kaikki.Font.Size, FontStyle.Bold)
        Next i
        VR_kaikki.Focus()

    End Sub

Public Function Etsi(ByVal sana As String, ByVal alku As Integer, ByVal loppu As Integer) As Integer

        Dim palaute As Integer = -1

        If sana.Length > 0 And alku >= 0 Then
            If loppu > alku Or loppu = -1 Then
                Dim indeksi As Integer = _
                VR_kaikki.Find(sana, alku, _
                loppu, RichTextBoxFinds.MatchCase)
                If indeksi >= 0 Then
                    palaute = indeksi
                End If
            End If
        End If

        Return palaute
    End Function

Eli tämä toimii. Mutta en saa välitettyä kyseessä olevaa rtf-boksia muutoin kun nimeämällä se suoraan. Hakuja olisi kuitenkin tarkoitus tehdä kolmeen eri rtf-laatikkoon, joten olisi huomattavasti kätevämpää jos saisin ilmoitettua haun kohteenkin parametrinä. Mitä minun siis pitäisi tehdä?

neau33 [29.08.2008 20:22:52]

#

Moikka Sam76!

toimisikohan näin...

Imports System.Windows.Forms

'...
Public Sub SuoritaHaku(ByVal ctl As TextBox)

  Dim i As Integer, rtfboxi As RichTextBox

  For each rtfboxi In Me Controls
    'tähän väliin ehto jos haluat suodatella rtfboxeja
    'If rtfboxi.Name.IndexOf("xyz") > -1 Then 'esim.
       For i = 0 To rtfboxi.Text.Length
         Etsi(rtfboxi, ctl.Text, i, rtfboxi.Text.Length)
         rtfboxi.SelectionColor = Color.Blue
         rtfboxi.SelectionFont = _
         New Font(rtfboxi.Font.Name, _
         rtfboxi.Font.Size, FontStyle.Bold)
       Next i
    'End If
     rtfboxi.Focus()
  Next

End Sub

Public Function Etsi(ByVal rtfboxi As RichTextBox, _
ByVal sana As String, ByVal alku As Integer, _
ByVal loppu As Integer) As Integer

'...
   rtfboxi.Find(sana, alku, _
   loppu, RichTextBoxFinds.MatchCase)
'...

neau33 [31.08.2008 11:14:04]

#

Moikka taas Sam76!

sori toi edellinen...systeemin päivitys...en voinut testata...

Tämän pitäisi nyt sitten wörkkiä (testattu SharpDevelop 3.0 Beta2:lla)

 Imports System.Windows.Forms

Public Partial Class MainForm

   Public Shared WithEvents rtfboxi As New RichTextBox()

   Public Sub New()

      Me.InitializeComponent()

   End Sub

   Sub Button1Click(sender As Object, e As EventArgs)
      If textBox1.Text <> "" Then
         SuoritaHaku(Me.textBox1)
      End If
   End Sub

   Public Sub SuoritaHaku(ByVal ctl As TextBox)

      Dim i As Integer = 0
      Dim xctl As Control

      For Each xctl In Me.Controls
          If xctl.Name.IndexOf("richTextBox") > -1 Then
             rtfboxi = xctl
            For i = 1 To rtfboxi.Text.Length
               Etsi(rtfboxi, ctl.Text, i,rtfboxi.Text.Length)
               rtfboxi.SelectionColor = Color.Blue
               rtfboxi.SelectionFont = _
               New Font(rtfboxi.Font.Name, _
               rtfboxi.Font.Size, FontStyle.Bold)
            Next i
            rtfboxi = Nothing
         End If
      Next
      xctl = Nothing
   End Sub

   Public Function Etsi(ByVal rtfboxi As RichTextBox, _
   ByVal sana As String, ByVal alku As Integer, _
   ByVal loppu As Integer) As Integer

      Dim palaute As Integer = -1

      If sana.Length > 0 And alku >= 0 Then
            If loppu > alku Or loppu = -1 Then
                  Dim indeksi As Integer = _
                  rtfboxi.Find(sana, alku, _
                  loppu, RichTextBoxFinds.MatchCase)
                  If indeksi >= 0 Then
                        palaute = indeksi
                  End If
            End If
      End If

      Return palaute

   End Function

   Sub MainFormFormClosing(sender As Object, e As FormClosingEventArgs)
      Me.Dispose
   End Sub

   Sub MainFormFormClosed(sender As Object, e As FormClosedEventArgs)
      End
   End Sub

End Class

Sam76 [31.08.2008 23:01:38]

#

Kiitos Nea, olet hieno ihminen. En ehtinyt tuota ensimmäistä esitystä edes kokeilla kun tuli menoja (olin kalassa pari päivää :).
Tämä uusi versio näyttää hienolta mutta menee minulta äkkiseltään osittain ohi. En ole aimmin törmännyt tälläiseen "Partial Class MainForm" -luokkarakenteeseen. Onko tämä tarkoitus sisällyttää mainform-luokkaan vai toteutetaanko se omana luokkana, vai miten sen kanssa tehdään? Yritän perehtyä asiaan huomenissa, jos vaikka olisi vähän enempi virtaa käytettävissä. Nyt huutaa akut tyhjää..

Vastaus

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

Tietoa sivustosta