meerdere typen behandelen

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Ik zit al lang met dit probleem (heb het een paar maanden geleden hier al eens gepost als ik het goed heb), maar heb geen degelijke oplossingen gevonden.

Als je in een procedure ergens een control hebt die verschillende types kan zijn (textbox, button, ...), hoe kan je die dan allemaal gelijkaardig behandelen zonder een case voor elk type te gebruiken?

Dit is zo een procedure waar ik niet echt blij mee ben (dubbele code, en er zijn maar 2 typen mogelijk). focusedTxtField kan zowel een textbox als een richtextbox zijn.

Code:
    Private Sub EDITToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles tmiUndo.Click, tmiRedo.Click, tmiCut.Click, tmiCopy.Click, tmiPaste.Click, tmiSelectAll.Click
        Select Case True
            Case TypeOf (focusedTxtField) Is TextBox
                Dim txtBox As TextBox = CType(focusedTxtField, TextBox)
                Select Case txtBox.Name
                    Case tmiUndo.Name : txtBox.Undo()
                    Case tmiCut.Name : txtBox.Cut()
                    Case tmiCopy.Name : txtBox.Copy()
                    Case tmiPaste.Name : txtBox.Paste()
                    Case tmiSelectAll.Name : txtBox.SelectAll()
                End Select
            Case TypeOf (focusedTxtField) Is RichTextBox
                Dim txtBox As RichTextBox = CType(focusedTxtField, RichTextBox)
                Select Case txtBox.Name
                    Case tmiUndo.Name : txtBox.Undo()
                    Case tmiRedo.Name : txtBox.Redo()
                    Case tmiCut.Name : txtBox.Cut()
                    Case tmiCopy.Name : txtBox.Copy()
                    Case tmiPaste.Name : txtBox.Paste()
                    Case tmiSelectAll.Name : txtBox.SelectAll()
                End Select
        End Select
    End Sub

Hoe gaat dit korter?

Alvast bedankt :)
 
Wellicht
Code:
dim txtBox as Control
if TypeOf (focusedTxtField) Is TextBox then
   txtBox = CType(focusedTxtField, TextBox)
elseif TypeOf (focusedTxtField) Is RichTextBox
   txtBox = CType(focusedTxtField, RichTextBox)
else
  exit sub
end if

Select Case txtBox.Name
    Case tmiUndo.Name : txtBox.Undo()
    Case tmiCut.Name : txtBox.Cut()
    Case tmiCopy.Name : txtBox.Copy()
    Case tmiPaste.Name : txtBox.Paste()
    Case tmiSelectAll.Name : txtBox.SelectAll()
End Select
 
Dat gaat spijtig genoeg niet. controls hebben die methods nu eenmaal niet :(
Mss gaat het wel met option strict & explicit uit, maar ik hou me liever aan die normen.

Is er echt geen 'ureka-oplossing' ofzo? xD
 
Dat gaat spijtig genoeg niet. controls hebben die methods nu eenmaal niet :(
En misschien dit dan (niet getest, geen VB bij de hand op deze PC)
Code:
dim txtBox as Object
'etc, zie code hierboven
 
nee, objects hebben niet echt veel methods...
 
nee, objects hebben niet echt veel methods...

Duh, alleen omdat je intellisens je de methodes niet laat zien wil dat nog niet zien dat je ze niet kunt aanroepen. Wel eens van late binding gehoord?

Probeer de volgende code maar eens:

Formulier met Button en TextBox met daarin een willekeurige tekst
Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim obj As Object
        obj = Me.TextBox1
        MsgBox(obj.text)
        obj.Clear()
        obj = Me
        MsgBox(obj.text)
    End Sub
End Class

Je intellisense zal een 5 tal methodes en geen properties laten zien, omdat het tijdens compile time onbekend is wat het object voorstelt. De methode .Clear en de Property .Text werken echt wel hoor.
 
'option Strict On disallows late binding' :(
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan