| |
Visual-Basic Einsteigerrichtiges löschen einer Collectioninstanz | | | Autor: guenni255 | Datum: 19.02.21 11:41 |
| Hallo Forum
Ich habe folgendes Problem.
Ich habe ein Form (durch instanzbildung Anzahl flexibel) mit checkboxen (Anzahl flexibel).
den Inhalt der checkboxen übernehme ich in eine Collection.
alles soweit gut.
Nur möchte ich aber eines der dargestellten form löschen, und damit die zugehörige collection, und jetzt fangen die Probleme an.
Ich möchte die Inhalte der anderen Form´s und Collection´s behalten und neu darstellen.
Ich habe jetzt alle mir bekannten Variationen durch versucht. komme aber nicht zum gewünschten Ergebnis.
immer wieder taucht eine Fehlermeldung auf, entweder beim Ändern der checkboxen, oder beim Aufruf und neu darstellen der verbleibenden Form oder beim löschen der Form selbst.
Frage: Wie löscht man eine Collectioninstanz ohne die anderen zu verlieren?
Hier mal mein code:
Public wt() As Collection
Public xTln As String
Public Testform() As frmform
Public Zähler As Integer
Public i As Integer
Public clickout As Boolean 'Form zur erstellung der Instanzen des erwähnten Form´s
Private Sub Command1_Click()
Zähler = Zähler + 1
ReDim Preserve Testform(Zähler)
Call testen
End Sub
'=====================================================================
Private Sub testen()
Dim temp As frmform
Dim i As Integer
Set temp = New frmform
temp.Formn = Zähler
Select Case Zähler
Case 1
temp.Move 0, 2000
Case Is > 1
temp.Move Testform(Zähler - 1).Left + Testform(Zähler - 1).Width + 150, _
Testform(Zähler - 1).Top
End Select
Set Testform(Zähler) = temp
Testform(Zähler).Show
End Sub
'=======================================================================
Private Sub Form_Load()
Me.Move 0, 0
Zähler = 0
End Sub 'Das eigentliche Form
Private xwt As Collection
Private i As Integer
Private j As Integer
Private x As Integer
Private xFormn As Integer
Public Property Get Formn() As Integer
Formn = xFormn
End Property
Public Property Let Formn(ByVal vNewValue As Integer)
xFormn = vNewValue
End Property
Private Sub Check1_Click(Index As Integer)
On Error Resume Next 'Fehler der bei wt.remove für die erste Eintragung
' auftritt bewusst übersprungen
'Select Case Me.Check1(Index).Value
'Case 0
wt(Me.Formn).Remove (CStr(Me.Formn & Index))
wt(Me.Formn).Add Me.Check1(Index).Value, (CStr(Me.Formn & Index))
'Case 1
'wt(Me.Formn).Add Me.Check1(Index).Value, CStr(Me.Formn & Index)
'End Select
End Sub
'=================================
Private Sub Command1_Click()
Call anzeigen
End Sub
'=================================
Private Sub Command2_Click()
Set xwt = New Collection
Dim i As Integer
If CInt(Me.Text1.Text) = UBound(wt) Then Set wt(UBound(wt)) = Nothing: Exit Sub
For i = (CInt(Me.Text1.Text)) To UBound(wt)
If i <> UBound(wt) Then
Set xwt = wt(i + 1)
Else
Set xwt = wt(i)
End If
Set wt(i) = xwt
Next
End Sub
'=================================
Private Sub Form_Load()
ReDim Preserve wt(Me.Formn)
Set wt(Me.Formn) = New Collection
Me.Caption = "Form " & Zähler
For i = 1 To 4'die 4 nur zu testzwecken wir durch eine Variable ersetz die
' wo anders festgelegt wird
Load Me.Check1(i)
Select Case i
Case 1
Me.Check1(i).Move 0, 1000
Case Is > 1
Me.Check1(i).Move Me.Check1(i - 1).Left + Me.Check1(i - 1).Width _
+ 30, Me.Check1(i - 1).Top
End Select
Me.Check1(i).Visible = True
Me.Check1(i).Value = 1
Next
End Sub 'Modul zum Anzeigen der Collectioninhalte
Public Sub anzeigen()
On Error Resume Next
Dim temp As Collection
Dim j As Integer
Dim c As Integer
For i = 1 To UBound(wt)
For j = 1 To Testform(1).Check1.UBound
Debug.Print wt(i)(CStr(i & j)), i, j
Debug.Print "--------------------"
Next
Next
End Sub Ich hoffe mir kann jemand helfen.
Dafür bedanke ich mich im Voraus
LG Günni | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: Souffleurlos | Datum: 19.02.21 12:25 |
| Hallo,
soviele Collections
Wieso nimmst Du nicht die schon "eingebauten" Collections?
Für Forms:
Private colMyForms As VB.Global Das sollte eigentlich die SubMain sein - kann aber auch in der Startform sein:
Private Sub Form_Load()
Set colMyForms = VB.Global
MsgBox colMyForms.Forms.Count
End Sub Die nächste Collection: Controls. Jede Form hat für sich eine eigene Collection als Eigenschaft.
Sie nimmt die von der Form gehaltenen Controls auf.
Dies zum Einen
Zum Anderen: Wieso verwendest Du keine Control-Arrays? | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: guenni255 | Datum: 19.02.21 14:29 |
| Hallo
Vielen Dank für deine schnelle Reaktion.
zu "so viele Collections"
es sind im Grunde nur je Forminstanz eine, für die Werte der Checkboxen.
zu "Wieso nimmst Du nicht die schon "eingebauten" Collections?"
weil ich sie nicht kenne . ich hab zwar mal gelesen das alle controls in einer Collection abgelegt werden, weis aber nicht wie man dann an ihre werte (z.B checkbox3.value) kommt.
zu "Wieso verwendest Du keine Control-Arrays?"
weil die, wenn ich das jetzt richtig verstehe, zum ersten mehrdimensional sein müssten und zweitens nicht so leicht anzupassen sind.
Ansonsten verstehe ich im Moment deinen Code nicht so ganz. Er zeigt mir zwar wie viele Form geöffnet sind aber mehr kann ich, auch in den Eigenschaften von colMyForms, nicht entdecken.
"Die nächste Collection: Controls. Jede Form hat für sich eine eigene Collection als Eigenschaft."
kann ich leider nirgendwo finden.
Gruß Günni | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: Souffleurlos | Datum: 19.02.21 16:50 |
| Hallo,
der kleine, aber ganz feine Unterschied zu meinem Vorschlag und deinen Collection ist: Deie Collections checken nicht, ob eine Form noch da ist.
Als Mini-Demo mache ein Projekt, füge 3 Forms hinzu und in der ersten Form:
Drei Checkboxen.
Private fm As VB.Global
Private Sub Check1_Click()
If Check1.Value Then
fm.Forms(1).Show vbModeless
Else
Unload Form2
End If
End Sub
Private Sub Check2_Click()
If Check2.Value Then
fm.Forms(2).Show vbModeless
Else
Unload Form3
End If
End Sub
Private Sub Check3_Click()
If Check2.Value Then
fm.Forms(3).Show vbModeless
Else
Unload Form4
End If
End Sub
Private Sub Form_Load()
Set fm = VB.Global
Load Form2
Load Form3
Load Form4
End Sub Genauso funktioniert das mit der Controls-Auflistung, die jede Form als Eigenschaft hat. Wie man diese Eigenschaft benützt, siehe einfach in diesem Forum am besten unter "Controls zur Laufzeit" hinzufügen.
(nur Schreibfehler korrigiert, Beleidigungen sind noch drinn)
Beitrag wurde zuletzt am 19.02.21 um 16:56:10 editiert. | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: guenni255 | Datum: 23.02.21 16:23 |
| Hallo Souffleurlos
Sorry zur späten Antwort.
Vielen Dank das du dich noch einmal gemeldet hast.
Ich habe jetzt einige Zeit versucht die Verbindung deines Code´s zu meinem Problem zu finden. Leider ist mir das nicht geglückt. Wahrscheinlich habe ich zu wenig Hintergrund wissen.
z.B. weiß ich nicht was "vbModeless" zu bedeuten hat oder bewirkt. Aber ich werde Deine Anregung weiter verfolgen um neue Erkenntnisse zu erlangen.
Vielen Dank nochmal.
LG Günni | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: Souffleurlos | Datum: 23.02.21 17:00 |
| Hallo,
vbModeless bedeutet dass das ganze Programm weiterläuft obwohl diese Form angezeigt wird. Der Thread wird nicht angehalten. Events werden weiter gefeuert etc.
vbModal (default) bedeutet: Das Programmm wird gestoppt, solange die Form angezeigt wird (entspricht dem Verhalten von MSGBOX(). Das ist das normale Dialog-Verhalten. Events sind eingefroren bzw. werden genullt.
Wäre nicht schlecht, wenn Du einen Überblick darüber gibst was du machen willst. Bis jetzt weiß ich nur: Eine Form viele Controls und davon wieder viele Forms. Entweder nimmt man einer Form ein Control weg, oder man nimmmt eine Form weg (und amit die dazugehörigen vielen Controls). Ist realisierbar in der Weise, wie ich es erläutert habe. "Normale" Collections sind damit überfordert weil es den Tod eines Objekts nicht bemerkt und sich demzufolge nicht reorganisiert.
Beitrag wurde zuletzt am 23.02.21 um 17:09:29 editiert. | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: guenni255 | Datum: 24.02.21 17:39 |
| Hallo
vielen Dank für dein Weiteres Interesse an meinem Problem.
Natürlich gebe ich dir gern einen Überblick.
Wir sind eine Gruppe von Elektrotechnikern die sich regelmäßig zu gemeinsamen Wochenenden Treffen. Dieses Programm soll nun eine einfache Abrechnung der Unkosten ermöglichen.
Dabei variiert natürlich die Anzahl der Teilnehmer (Anzahl der Form´s)sowie die Anzahl der Tage die jeder teilnimmt (Anzahl der checkboxen)und Übernachtungen die jeder zu zahlen hat.
Der von mir dargestellt code ist nur ein Testprogramm. Stellt aber genau dar wie ich die Daten erfassen will.
Das wichtigste für mich ist dabei das das Programm direkt auf Veränderungen z.B. der Teilnehmer reagieren soll. Lösche ich einen Teilnehmer, weil z.B. aus Versehen angeklickt wird auch das entsprechende Form entladen. Aber wie du richtig sagtes, die Collection in der die Teilnahmetag und errechneten Übernachtungen gespeichert sind wird nicht gelöscht bzw. zerstört.
Das hat zur Folge das die restlichen Daten, beim Neuaufbau verschoben dargestellt werden.
vll Testest du mal meinen Code.
es reicht eine Form (Form1) mit 4 checkboxen(check1..4)und 2 Commandobutton und laufen lassen. Natürlich mal checkboxen anklicken und Direktfenster beobachten.
Ich hoffe es gibt eine Lösung. Da ähnlich wie bei den Tagen auch bei Events vor Ort so verfahren werden soll. ( Wer hat an welchem Event teilgenommen, wer hat´s bezahlt. Wird dann durch die Teilnehmer geteilt).
Ich hoffe ich konnte dir einen ausreichenden Einblick übermitteln. immer unter dem Gesichtspunkt das ich Einsteiger und Autodidakt bin.
LG Günni
ps: Sorry Natürlich fehlt der Auslöser, eine Form mit Button um die Instanz der Forms zu erstellen.
Beitrag wurde zuletzt am 24.02.21 um 17:42:59 editiert. | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: Souffleurlos | Datum: 24.02.21 19:49 |
| Hallo ,
wieviele Datensätze sind das und wie hoch ist die Zugriffszeit pro Datensatz. Ansonsten glaube ich, dass man dazu noch nicht mal eine Datenbank braucht.
Im Gegenzug sagst Du mir, wieviele Widerstände und Kondensatore ich brauche um meinem Lautsprecher von 4 Ohm und 5 Watt zu sagen, daas es oberhalb von 2.2 kHz nichts mehr zu melden hat. Ich weiß dass ich diese Baueile nur auf die +/- Brücke löten muss.
derweile analysiere ich deinen bisherigen Code
Beitrag wurde zuletzt am 24.02.21 um 20:02:10 editiert. | |
Re: richtiges löschen einer Collectioninstanz | | | Autor: guenni255 | Datum: 25.02.21 02:09 |
| Hallo
Ich nehme mal an das du nicht die Anzahl sondern die Werte des widerstandendes Und des kondernsators von mir wissen willst die du als tiefpass anschließen möchtest. Da ich aber die Ausgangsspannung und Ausgangsleistung deines verstärker nicht kenne empfehle ich dir mal hier nachzulesen.
https://electronicbase.net/de/bandpass-berechnen/
Hier findest du auch auch die entsprechende Schaltung der beiden Bausteine zwischen + und - .
LG Günni | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|