Activex Teilelement

Nun, dieses activex werde ich vielmals benutzen, und möchte wieder ein Public Sub dazu schreiben. Also der funktionierende Code lautet:

Code:
Private Sub BuchungsZeile_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
 Load BuchungsZeile(Index + 1)
 BuchungsZeile(Index + 1).Left = 120
 BuchungsZeile(Index + 1).Top = 1440 + (Index + 1) * 315
 BuchungsZeile(Index + 1).Visible = True
 BuchungsZeile(Index + 1).SetFocus
End If
End Sub

Dieses Sub nannte ich AddNewRow, mit den folgenden Parametern:
Code:
Public Sub AddNewRow(BeginLeft As Integer, BeginTop As Integer, ErsteZeile As Control, Ind As Byte)

Und das Sub habe ich mir so vorgestellt:

Code:
Public Sub AddNewRow(BeginLeft As Integer, BeginTop As Integer, ErsteZeile As Control, Ind As Byte)
 Load ErsteZeile(Ind)
 ErsteZeile(Ind + 1).Left = BeginLeft
 ErsteZeile(Ind + 1).Top = BeginTop + (Ind + 1) * 315
 ErsteZeile(Ind + 1).Visible = True
 ErsteZeile(Ind + 1).SetFocus
End Sub

Wobei ErsteZeile ein bereits auf dem Form platziertes Control ist (genauer gesagt ein ControlArray), also hat eine Index Eigenschaft. BeginLeft und BeginTop sind die Positionen dieses ersten Controls.

So, und mit diesem Sub möchte ich das zweite, dritte, usw. ErsteZeile Control laden und anzeigen, so, dass man am Ende dann ein ErsteZeile(0), ErsteZeile(1), usw. hat.

Ich rufe das Sub folgendermassen auf:

Code:
AddNewRow 120, 1440, BuchungsZeile(0), 0

Aber ich bekomme eine Fehlermeldung "Object doesn't support this property or method" bei der Zeile Load ErsteZeile(Ind).

Ich habe es schon mit ErsteZeile As BuchungsZeile; ErsteZeile() As Control; ErsteZeile() As Controls versucht, aber immer wieder bekomme ich Fehler.

Was könnte der Grund dafür sein?

Zvoni, danke für deine bisherigen Antworten und Anregungen (und hoffentlich auch für diese)!
 
Wieso uebergibst du ueberhaupt das Control nochmal zusaetzlich (Buchungszeile(0))?

Der Unterschied zwischen dem Code aus Der Keypress und deiner Sub ist hier

Keypress-Version:
Load BuchungsZeile(Index + 1)

Sub-Version
Load ErsteZeile(Ind)

In der Keypress-Version Loadest du ein Control mit einem Index+1, in der Sub-Version nur mit Index
 
Zuletzt bearbeitet:
ich übergebe das Control (BuchungsZeile(0)), damit das Programm weiss, in welchem ControlArray es eine neue Instanz laden soll.

Ist das überflüssig

Das mit dem Index hab' ich nur vertippt.

Ganz vereinfacht würde das so aussehen: ich habe ein Form, drauf eine TextBox(0) und ein CommandButton. Und wenn ich auf das Button klicke, dann ruft das Programm ein Public Sub auf, das TextBox(1), TextBox(2), usw. ladet. Muss man dann in diesem Fall dem Sub nicht übergeben, mit welchem ControlArray es arbeiten soll

Anderes: funktioniert Visual Basic 6.0 auf Windows Vista mit einem 64-bit Prozessor?
 
Das ControlArray wird ueber den Namen definiert, da Objekt-Namen in VB eindeutig sein muessen, ergo brauchst du das Control nicht zu uebergeben, solange du innerhalb des Containers bleibst (Bsp. die Form, auf welcher dein UserControl sitzt).

VB6 auf 64Bit? Keine Ahnung. Mal gucken, ob sich jemand meldet zu dieser Frage. Aus dem Bauch heraus denke ich dass es gehen sollte, wenn man ueberlegt, dass "alte" Office-Programme (O2000, O2003) auch unter Vista laufen.

Btw: Dein Vertipper mit dem Index, war das jetzt die Fehlerquelle?
 
Nein, nicht mein Vertipper war die Fehlerquelle. Bin zur Zeit am Arbeitsplatz, aber sobald ich zu Hause bin, werde ich deinen Vorschlag ausprobieren.

Der Ursprungsfehler war bei "Load ErsteZeile(ind)". Wenn ich Load ErsteZeile schreibe, wird es sicher ohne Fehler ablaufen, aber ob mit dem gewünschten Ergebnis, da bin ich ein bisschen skeptisch.

Weil ich verstehe immer noch nicht genau:

Wenn ich im Public Sub "Load ErsteZeile" schreibe, woher weiss dann VB6, dass ich z. B. auf dem Form Lieferanten eine neue Instanz des Controls "BuchungsZeile" erstellen möchte? Deshalb glaubte ich an die Controlübergabe, weil ich dieses Public Sub in ein Modul integrieren möchte, und so bleibe ich nicht innerhalb des Forms, oder?

Ich verstehe es wirklich nicht.

Ich habe ein einfaches Projekt kreiert: eine Form, drauf eine Textbox (schon mit Index versehen, alos ein Textboxarray) und ein Button.

Im Click-Event schreibe ich dann:

Load Text1(1)
Text1(1).Top=Text1(0).Top+300
Text1(1).Visible=True

Aber wenn ich diese 3 Zeilen in ein Public Sub integrieren möchte, geht es nicht.

Meiner Meinung nach muss man das erste Element des Controlarrays angeben, also:

Public Sub newtxtbox(txtbox As Control)
Load txtbox(1)
txtbox(1).Top=txtbox(0).Top+300
txtbox(1).Visible=True
End Sub

Und dann im Click Event: newtxtbox Text1(0)

Aber um Gottes Willen, warum funktioniert das nicht Es ist doch so logisch.
 
Zuletzt bearbeitet:
Ach so. Wusste nicht dass du es in ein Modul schieben willst. Ja, dann solltest du das Control-Array (!) uebergeben, und nicht das einzelne Control.

Public Sub newtxtbox(txtbox() As Control, ByVal Index as integer)
Load txtbox(Index+1)
txtbox(Index+1).Top=txtbox(0).Top+300
txtbox(Index+1).Visible=True
End Sub

Dein Fehler ist, dass du eine ganz bestimmte Instanz eines Controls erstellen willst, was aber so nicht zulaessig ist. Mit Load Control laedst du eine komplett neue Instanz einer Objekt-Klasse, welche dann dem Array/Auflistung hinzugefuegt wird.
 
Zuletzt bearbeitet:
Diese Variante habe ich eigentlich schon ausprobiert. In diesem Fall bekomme ich dann die Fehlermeldung "Type mismatch: array or user-defined type expected".

Z. B. mein TextBox Array ist Text1, und hat schon ein Element mit dem Index 0.

Diese Aufrufen führen nicht zum Erfolg:

1. newtxtbox Text1, 0

2. newtxtbox Text1(), 0

3. newtxtbox Text1(0), 0

Langsam bin ich am Ende. Ich fass' es einfach nicht. VB meckert, das es ein Array erwartet, aber Text1 ist ein Array, oder?
 
Seltsam. Normalerweise ist die Uebergabe eines Arrays die Uebergabe des ersten Elements.

Willst du doch lieber nicht meine Variante mit dem RaiseEvent ausprobieren? :)
 
Ich lass mir schon was einfallen. Wenn es nicht geht, dann bleibt die längere Variante ohne Public Sub im Modul.

Trotzdem danke für deine Bemühungen.

DerStauner
 

Neue Beiträge

Zurück