# VB NET, Objekt dynamisch erzeugen



## Senator42 (27 Oktober 2010)

Hallo VB Dot.Net spezialisten

(Microsoft Visual Studio 2008 Express, Net Framwork 3.5)

ich habe eine problem mit den Typ Object.

dieses funktioniert:

```
Dim myObject_scr As [COLOR=Red][B]VScrollBar[/B][/COLOR]

Private Sub NewControl()
        ' das geht
        myObject_scr = New [COLOR=Red][B]VScrollBar[/B][/COLOR]
        myObject_scr.[B][COLOR=Blue]Parent[/COLOR][/B] = Me
        ' myObject_scr.Controls.Add(myObject_scr) ' diese zeile nur bei Array nötig

        myObject_scr.Size = New Size(50, 80)
        myObject_scr.Minimum = 0
        myObject_scr.Maximum = 1000
        myObject_scr.Value = 200

        myObject_scr.Location = New Point(20, 30)
        myObject_scr.Visible = True
        AddHandler myObject_scr.Click, AddressOf myEvent_Click
        AddHandler myObject_scr.MouseDown, AddressOf myEvent_MouseDown
        AddHandler myObject_scr.MouseMove, AddressOf myEvent_MouseMove
        AddHandler myObject_scr.MouseUp, AddressOf myEvent_MouseUp
        AddHandler myObject_scr.ValueChanged, AddressOf myEvent_ValueChanged
...
```


```
Dim myObject As [COLOR=DarkOrange][B]Object[/B][/COLOR]

Private Sub NewControl()
        ' das nicht
        myObject = New [COLOR=Red][B]VScrollBar[/B][/COLOR]
        myObject.   [COLOR=DarkOrange][B]<<<< hier gibt es keinen [U]Parent[/U] und anders[/B][/COLOR]
...
```
Ziel ist dass ich in 'myObject'  beliebiges zuweise VScrollBar, Button etc.Ich möchte in ein Array (0...n-1) beliebige Objekte haben, und nicht für jeden Typ (Option, button,slider etc) ein eigenes Array anlegen.

ist das machbar?
falls ja, wie

bye


----------



## Rainer Hönle (27 Oktober 2010)

myObject auf den entsprechenden Typ casten. Oder temporär den gewünschten Typ anlegen, alle Eigenschaften etc. setzen und dann diese temporäre Variable dem Object zuweisen.


----------



## Senator42 (27 Oktober 2010)

Rainer Hönle schrieb:


> myObject auf den entsprechenden Typ casten. Oder temporär den gewünschten Typ anlegen, alle Eigenschaften etc. setzen und dann diese temporäre Variable dem Object zuweisen.



aha, so gut bin ich dot.net noch nicht.
wie genau geht das type-cast denn in VB? und was wen casten??

könntest du mal die zeile hinschreiben?
wäre nett
danke


----------



## Rainer Hönle (27 Oktober 2010)

Ich würde die zweite Variante bevorzugen.

```
Dim myObject As Object ' Kann irgend etwas sein

Private Sub NewControl()
  Dim tmpScrollbar as VScrollBar
  tmpScrollbar = new VScrollBar
  tmpScrollbar.Parent = Me

  tmpScrollbar.Size = New Size(50, 80)
  tmpScrollbar.Minimum = 0
  tmpScrollbar.Maximum = 1000
  tmpScrollbar.Value = 200

  tmpScrollbar.Location = New Point(20, 30)
  tmpScrollbar.Visible = True
  AddHandler tmpScrollbar.Click, AddressOf myEvent_Click
  AddHandler tmpScrollbar.MouseDown, AddressOf myEvent_MouseDown
  AddHandler tmpScrollbar.MouseMove, AddressOf myEvent_MouseMove
  AddHandler tmpScrollbar.MouseUp, AddressOf myEvent_MouseUp
  AddHandler tmpScrollbar.ValueChanged, AddressOf myEvent_ValueChanged

  myObject = tmpScrollbar
  ' oder in das Array einhängen mittels Add
End Sub
```

War jetzt nur runtergetippt ohne VS (da ich noch nichts in VB.net gemacht habe, nur ein bisschen was in C#). 
Klar ist auch, dass die Sub NewControl für jeden Typ implementiert werden muss bzw. einen Parameter bekommen muss damit der richtige Typ erzeugt wird. Die Frage ist nur, was das bringt. Wenn anstatt einem Array eine <List> verwendet wird, geht das genauso mit unterschiedlichen Typen.
Was soll denn das Ergebnis sein? Was muss nachher mit der Referenz gemacht werden?


----------



## Senator42 (28 Oktober 2010)

Rainer Hönle schrieb:


> Ich würde die zweite Variante bevorzugen.
> 
> ```
> Dim myObject As Object ' Kann irgend etwas sein
> ...



Ja, das funktioniert.
<List> ist mir noch fremd. ist das wie eine collection?

zu
- AddHandler tmpScrollbar.Click, AddressOf myEvent_Click
habe ich noch
- AddHandler tmpScrollbar.Keypress, AddressOf myEvent_Keypress
da kommt es zu einem fehler wenn ich auf das button-objekt mit space-taste drücke. 
der myEvent_Keypress löst dann den myEvent_Click mit den mausdaten aus.

was das ganze soll? 
ich bastle gerade an eine IBN-hilfe mit dem ich von versch. SPS (S5 und S7 200,300,400) irgendwelche daten beliebig anzeigen und ggf. loggen kann.
habe das mal vor 20jahren unter turbo-c für s5 gemacht.


----------



## Rainer Hönle (28 Oktober 2010)

<List> ist eine Collection.
Zu dem Fehler: der Click mit der Maus funktioniert aber?


----------



## Senator42 (28 Oktober 2010)

Rainer Hönle schrieb:


> <List> ist eine Collection.
> Zu dem Fehler: der Click mit der Maus funktioniert aber?



ja die handler mit maus funktionieren.

muss jetzt wieder was arbeiten. bis ausser haus.
bye


----------



## Larry Laffer (28 Oktober 2010)

Hallo,
ich muss gestehen, dass ich nicht so recht das Ziel verstanden habe ... aber vielleicht wäre da ja die Lösung für dich :
Du erzeugst dir eine eigene (neue) Klasse und bindest die VScrollbar dort ein und veränderst in dieser Klasse das, was verändert werden soll, und benutzt dann fortan diese Klasse ... also etwa so :

```
Public Class myVScrollbar
 
Inherits VScrollbar
 
...
 
End Class
```
eventuelle Wünsche, Verhaltensänderungen etc. kannst du nun da mit integrieren und ggf. auch neue zusätzliche Properties mit anlegen ...

Gruß
Larry


----------



## Senator42 (28 Oktober 2010)

*user control - ocx*



Larry Laffer schrieb:


> Du erzeugst dir eine eigene (neue) Klasse und bindest die VScrollbar dort ein


du meinst ein user control oder ?

ja, ist mir auch schon aufgefallen daß dies gut wäre. muss ich aber erst noch rausfinden wie das bei dot.net geht.  in vb6 konnte ich das mal (OCX).
naja, we kommt ja gleich.


----------



## Jochen Kühner (29 Oktober 2010)

Senator42 schrieb:


> du meinst ein user control oder ?
> 
> ja, ist mir auch schon aufgefallen daß dies gut wäre. muss ich aber erst noch rausfinden wie das bei dot.net geht.  in vb6 konnte ich das mal (OCX).
> naja, we kommt ja gleich.



Das was Larry da geschrieben hat ist ein Abgeleitetes Control, das konntest du in VB6 nicht erstellen. Im Endeffekt ist es mit diesen 3 zeilen Code schon voll funktionsfähig (verhällt sich dann genau so wie die Orginale Scrollbar). Nun kannst du aber Methoden überschreiben oder hinzufügen, Eigenschaften hinzufügen, ...


----------

