vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
richtiges 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel