VBA/VB6 Objekt oder Funktion?

Hallo,
leider konnte mir noch niemand richtig weiterhelfen…

Wann sollte ich statt einer Funktion ein Objekt nutzen?
Kann man das überhaupt miteinander vergleichen? (Wo sind die Unterschiede)

Kann ich in VB6/VBA die Objekte überladen? Hat jemand ein Beispiel wie das aussehen muss?

Wäre euch echt dankbar für jede Antwort oder Anhaltspunkte…

Gruß, Chris

Hallo,

leider konnte mir noch niemand richtig weiterhelfen…

die erste Frage hat meine Kenntnisse auch überstiegen, deshalb habe ich da nicht geantwortet.

Wann sollte ich statt einer Funktion ein Objekt nutzen?
Kann man das überhaupt miteinander vergleichen? (Wo sind die
Unterschiede)

Mit Klassen/Objekten habe ich wenig Erfahrung.
Die wesentlichsten unterschiede:

  • von Klassen kannst Du mehrere Instanzen bilden. Die Inhalte der Variablen in den Instanzen beeinträchtigen sich gegenseitig nicht. Das geht mit Funktionen nicht. Wird eine Funktion zum zweiten Mal gestartet, bevor sie zum ersten Mal fertig ist, kann das zu unerwarteten, falschen Ergebnissen führen.
  • Klassen können Eigenschaften haben.
  • aus Klassen kannst Du eigene Events feuern.

Kann ich in VB6/VBA die Objekte überladen? Hat jemand ein
Beispiel wie das aussehen muss?

Ich habe mich mit OO noch nicht richtig befasst, wenn ich den Begriff ‚überladen‘ aber richtig verstanden habe, dann ja, das geht. Poste doch mal ein möglichst einfaches Beispiel, ich schreibe das dann nach VB6 um, wenn ich kann. :smile:

Verstanden habe ich, daß in Abhängigkeit der übergebenen Daten die Verarbeitung unterschiedlich abläuft und etwas anderes zurückgegeben wird. Wenn ich das richtig verstanden habe, geht das in VB6 mit jeder Prozedur, Funktion …

Private Sub Command1\_Click()
 Me.Caption = Beispiel(3, 4)
End Sub

Private Sub Command2\_Click()
 Me.Caption = Beispiel(, , "3", "4")
End Sub

Private Function Beispiel(Optional a As Integer, Optional b As Integer, Optional txt1 As String, Optional txt2 As String) As Variant
 If a 0 And b 0 Then
 Beispiel = a + b
 Else
 Beispiel = txt1 + txt2
 End If
End Function

Gruß Rainer

Danke für die Hilfe erstmal

die erste Frage hat meine Kenntnisse auch überstiegen, deshalb
habe ich da nicht geantwortet.

ok, war vielleicht auch etwas blöd geschrieben

Die wesentlichsten unterschiede:

  • von Klassen kannst Du mehrere Instanzen bilden. Die Inhalte
    der Variablen in den Instanzen beeinträchtigen sich
    gegenseitig nicht. Das geht mit Funktionen nicht. Wird eine
    Funktion zum zweiten Mal gestartet, bevor sie zum ersten Mal
    fertig ist, kann das zu unerwarteten, falschen Ergebnissen
    führen.
  • Klassen können Eigenschaften haben.
  • aus Klassen kannst Du eigene Events feuern.

Das macht natürlich Sinn. Ich glaube mir fehlt da grad noch die Vorstellung dafür…aber das kommt noch.

Ich habe mich mit OO noch nicht richtig befasst, wenn ich den
Begriff ‚überladen‘ aber richtig verstanden habe, dann ja, das
geht. Poste doch mal ein möglichst einfaches Beispiel, ich
schreibe das dann nach VB6 um, wenn ich kann. :smile:
Verstanden habe ich, daß in Abhängigkeit der übergebenen Daten
die Verarbeitung unterschiedlich abläuft und etwas anderes
zurückgegeben wird. Wenn ich das richtig verstanden habe, geht
das in VB6 mit jeder Prozedur, Funktion …

Ja, überladen ist genau das :smile:
Beispielfrage:

Ich will die Funktion Beispiel wie folgt überladen:
Beispiel( 123 )
Beispiel( „ABC“ )

'wenn integer ist dann:
public function Beispiel ( input as integer )
msgbox „Input ist eine Zahl“
end function

'wenn string ist dann:
public function Beispiel ( input as string)
msgbox „Input ist ein Wort“
end function

zumindest so irgendwie… also die gleiche inputstelle, aber unterschiedliche Abarbeitung für bestimmte datentypen… In C gehts glaube mit construktoren??? (hoffentlich blamier ich mich jetzt nich)

Danke und grüße, Chris

Hallo,

Das macht natürlich Sinn. Ich glaube mir fehlt da grad noch
die Vorstellung dafür…aber das kommt noch.

Beispiel Winsock-Steuerelement, das ist eine Klasse.
Wenn Daten Empfangen werden, wird das Ereignis ‚DataArrival‘ ausgelöst. So etwas könnte man ja auch selbst schreiben.

Ja, überladen ist genau das :smile:

OK. Dann habe ich ja schon mal etwas verstanden. Dann fehlt mir nur noch das Verständnis für ‚Vererbung‘, aber ich weiß, daß das mit VB6 nicht geht, auch nicht nachzubauen ist, deshalb ist das nicht so wichtig.

Beispielfrage:

Ich will die Funktion Beispiel wie folgt überladen:
Beispiel( 123 )
Beispiel( „ABC“ )

Hmmm, wenn Du nicht schreiben willst, ‚Beispiel(,123)‘ / 'Beispiel(„123“,) dann … dann machen wir es anders. :smile:

'wenn integer ist dann:
public function Beispiel ( input as integer )
msgbox „Input ist eine Zahl“
end function

Ja.

'wenn string ist dann:
public function Beispiel ( input as string)
msgbox „Input ist ein Wort“
end function

Auch richtig.

zumindest so irgendwie… also die gleiche inputstelle, aber
unterschiedliche Abarbeitung für bestimmte datentypen… In C
gehts glaube mit construktoren??? (hoffentlich blamier ich
mich jetzt nich)

Über C weiß ich nur, daß ich damit nicht zurecht komme. :smile:

In VB geht aber:

public function Beispiel ( input as Variant)
If Isnumeric(input) then
msgbox „Input ist eine Zahl“
Else
msgbox „Input ist ein Wort“
End If
end function

Du musst Dich in VB nicht festlegen, Du darfst nur. Wenn du dich festlegst, hat das Vorteile, z.B. in der Geschwindigkeit, aber es geht auch so.

Gruß Rainer

Hallo,

In C gehts glaube mit construktoren???

moment, das ist doch … geht hier auch, ‚Type‘ ! :smile:

Option Explicit

Private Type Gemisch
 Zahl As Single
 Text As String
End Type

Private Sub Command1\_Click()
 Dim Daten As Gemisch
 Daten.Text = "Test"
 MsgBox Beispiel(Daten)
End Sub

Private Function Beispiel(ByRef Daten As Gemisch) As String
 If Daten.Text = "" Then
 Beispiel = "ohne Text, "
 Else
 Beispiel = "mit Text, "
 End If
 If Daten.Zahl = 0 Then
 Beispiel = Beispiel + "ohne Zahl"
 Else
 Beispiel = Beispiel + "mit Zahl"
 End If
End Function

Gruß Rainer

Hallo Typson,

dann mag ich meinen Senf auch einmal dazu geben :smile:

leider konnte mir noch niemand richtig weiterhelfen…

Na dann schauen wir mal und stiften Verwirrung *grins*

Wann sollte ich statt einer Funktion ein Objekt nutzen?
Kann man das überhaupt miteinander vergleichen? (Wo sind die
Unterschiede)

Du kannst ein Object nicht mit einer Function vergleichen! Das sind zwei ganz verschiedene Dinge!
Function kannst du aufrufen. Ihr Parameter uebergeben und sie dann etwas machen lassen. Eine Function liefert Dir im Gegensatz zu einer Sub immer ein Resultat zurueck! Ob du dies dann weiter verarbeitest das liegt an Dir.

'Bsp

Public Function XYZ (ABC as Variant) as Long
 if isnumeric(ABC) then XYZ=Clng(ABC)
End Function

'Du koenntest die Function wiefolgt aufrufen!
Dim X as Long
x=XYZ(123)

'oder
XYZ(123) 'Was natuerlich keinen Sinn ergaebe!

Objecte dagegen, haben Eigenschaften, Methoden und koennen Ereignisse auslösen. Also Object, instanzierst du zum Bsp Word oder Excel etc.
Wie du siehst hat das nichts mit Functionen zu tun!

Ich gehe aber mal von aus das du Klassen und Vererbung etc. meinst?
Da ist es wiederrum anders :wink:

Am besten lässt sich das wiederrum an einem Bsp. erklären.
Nehmen wir einmal an, du schreibst ein Proggi wo man Tiere verwalten kann! Dort können Daten eingegeben werden! Klassen sind zum Bsp. hervorragende Datenspeicher :wink:

Nun möchtest du verschiedene Tiere dort eintragen. Nehmen wir nur einmal Hund und Katze!
Du möchtest dabei folgende Werte speichern.

Was habe ich an Nahrung bezahlt?
Was frisst das Tier?

Klasse verhalten sich wie Objecte. Sie haben auch Eigenschaften, Methoden und koennen ereignisse ausloesen.

Nun willst du auch noch implementieren, wie sich das Tier wehrt wenn es angegriffen wird. Die Katze kratzt und der Hund beisst :wink:

So und genau da kommen wir ins Dilema. Woher weiss ich welches Tier eingetragen wurde? Eine Katze kann nicht beissen! *zwinker*

In sollsch einem Falle, würden wir eine Klasse erstellen, die alle Eigenschaten beinhaltet die alle Tier haben. Zum Bsp. Das Futter, was wurde bezahlt, wie alt ist das tier etc.

Nun erstellen wir für jede Tierart eine eigene Klasse! Aber diese Vererben wir wiederrum der ersten Klasse. Somit muessen wir nur noch die unterschiedlichen Methoden, Eigenschaften etc. implemtieren und uns steht dann alles zur verfügung :smile:

Das Thema ist dermassen komplex, da koennte man hier einen Roman schreiben! Rainer hatte dir dazu auch schon einiges geschrieben, wie zum bsp. das sie instanziert werden muessen etc.
eine Klasse kannst du auch verwenden, wenn du mit Collection’s arbeiten willst / musst etc.

Kann ich in VB6/VBA die Objekte überladen? Hat jemand ein
Beispiel wie das aussehen muss?

Öhm, du verwechselst da etwas. Überladen geht nur in der .NET Version.
Aber dort sind alles Objecte! Ja auch ein primitiver Datentyp. In den implementierten Klassen die im Framework enthalten sind, ist die Überladung implementiert. Fertig gibt es sowas in Vb bis zur Version 6 nicht! Das musst du selbst, basteln, was aber sehr simple ist.

Nun wird Rainer sich sicher vor die Stin hauen und sagen, na klar so gehts *gg*

'Du verwendest optionale Parameter!

Public DeineFunction(Optional A as String, optional B as Long,....) 

Somit kannst du dir aussuchen was du alles uebergeben willst. Du kannst dabei auch standard Werte mit angeben :smile: Abfragen ob ein Wert existoert kannst du dann via IsMissing :smile:

Wäre euch echt dankbar für jede Antwort oder Anhaltspunkte…

Wenn du noch Fragen hast, so einfach her damit :wink:

MfG Alex

Hallo Rainer,

In C gehts glaube mit construktoren???

Construktoren gibt es nur in .NET und da sind alles Objecte!

moment, das ist doch … geht hier auch, ‚Type‘ ! :smile:

Warum so umstaendlich und nicht mit Optionalen Parametern arbeiten?

> Private Function Beispiel(ByRef Daten As Gemisch) As String


Als ByRef uebergeben? Warum das? Das ist arg gefaehrlich, das weisst du? Mit Byref sollte man immer ein wenig aufpassen, sonst bekommt man schnell das erwachen!

MfG Alex

Hi Alex,

Private Function Beispiel(ByRef Daten As Gemisch) As String

Als ByRef uebergeben? Warum das?

weil ByVal nicht erlaubt ist. :smile: Das war nicht meine Idee, die Entwickler von VB wollten das so.

Gruß Rainer

Vielen Dank an euch.

Ich scheine also in VB6 nicht wirklich die Möglichkeiten zu haben wie in C++ …

Weil der Hintergrund meiner Frage ist, dass ich in der Uni C++ gelernt habe und nun eine Belegarbeit (objektorientierte Programmentwicklung) abgeben muss. Da ich schon viel in VB geschrieben habe und zu faul bin ein neues Programm in C++ zu schreiben, wollt ich dem Prof. gleich eines meiner Programme zeigen.

aber anscheinend ist VB6 eher „Objektbasiert“ als „Objektorientiert“ -laut Wiki. ist das ein unterschied :wink:

Vielen Dank nochmal für die ausführliche Hilfe und bis bald…

gruß chris

Hallo,

Ich scheine also in VB6 nicht wirklich die Möglichkeiten zu
haben wie in C++ …

ja, das ist so.

Weil der Hintergrund meiner Frage ist, dass ich in der Uni C++
gelernt habe und nun eine Belegarbeit (objektorientierte
Programmentwicklung) abgeben muss.

Dafür ist VB6 gänzlich ungeeignet. Objektorientiere Programmierung ist ja genau genommen eine Philosophie, aber nicht die von VB6. :smile:
Im Normalfall schreibe ich meine Programme komplett allein, nicht im Team, deshalb stört mich das auch nicht.

Sieh Dir doch mal C# oder VB.NET an. Die wären dafür geeignet.

Gruß Rainer

Hallo Rainer,

mein Gott bin ich bleede :s
Irgendwo ist es ja logisch, das ByVal nicht gehen kann :s

Aber danke für den Denkanstoss / Hinweis :smile:

MfG Alex