Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Problem mit Rückgabewerten von Timer und Funktionen

Frage Entwicklung VB for Applications

Mitglied: florengray

florengray (Level 1) - Jetzt verbinden

25.10.2009 um 10:11 Uhr, 5229 Aufrufe, 4 Kommentare

Hallo! Inzwischen weiß ich gar nichts mehr und mache mir immer mehr kaputt. Darum frage ich nun hier voller Hoffnung.
Also ich schreibe gerade an einem Programm, welches mir die Frequenz, welche am Microphoneingang meiner Soundkarte anliegt, messen soll.
Das mache ich so erstmal über das *piep* Direct X da ich nichts anderes gefunden habe was mir es ermöglicht den Buffer der Soundkarte zu lesen.
Habe also DirectX8 im meinem VB 2008 Express-Projekt eingebunden. Geht auch.
Ich krieg auch schon Frequenzen. Aber da ist nun ein Problem.
Ich muss zuerst einen Buffer erstellen und dann darin "Sound" aufnehmen. Das kostet Zeit. Dann muss die Aufnahme gestoppt werden und dann erst kann der Buffer ausgelesen werden. Das kostet wieder Zeit. Das heißt ich kann nicht einfach nur ein Sub schreiben was einen Sekundären Buffer erzeugt, und dann nach zwei Zeilen Code wieder ausließt.
Da kommt zurecht eine Fehlermeldung, dass sich noch keine Daten in dem Buffer befinden bzw. ein Array der größe Nothing.
Also kam mir der Timer in den Sinn. Da frage ich nun relativ umständlich alle 0.5 Sekunden ab, ob sich Daten im Buffer befinden. Wenn ja dann wird gestoppt und ausgelesen.
So. Und nun weiß ich nicht, wie ich die Daten weiterverarbeiten soll. Denn ich habe viele verschiedene Funktionen, die diese DAten benötigen, aber wenn ich z.B. eine Function aufrufe läuft die einmal ab und wenn dann gerade zu der Zeit nix im Buffer war dann bricht die ab und ende. Ich könnte auch eine Do Loop Schleife machen, aber das könnte eine Endlosschleife werden und ist nicht das wahre. Zumal ich immer noch ein Problem mit einer Beschreibung von einem Buffer habe. Der gibt mir manchmal 0 zurück und dann stirbt alles. Warum weiß ich nicht.
Was ich bräuchte wäre eine Möglichkeit den Buffer zu "machen", dann die Function warten zu lassen bis der gefüllt ist und dann erst mit der Fortsetzung des weiteren Code weitermacht. Aber wie soll ich einer Private Function sagen, "warte"?
Und einen Timer als Function zu deklarieren und darin auch noch Varibalen übergeben zu lassen erlaubt mir VB nicht. Wäre sowieso nicht das Wahre.
Dann habe ich noch von Events gehört. Ich hoffe ich hab das richtig verstande. Man kann also eine Function dann ausführen lassen, wenn z.B. ein bestimmtes Ereignis
wärend der Programmlaufzeit auftritt.? Wenn ja dann könnte man das doch so lösen:
Ich bastle da auf die Soundkartenschnittstelle so ein Event drauf. Wenn die Soundkarte dann einen Sec.Buffer mit Daten gefüllt hat soll z.B. eine andere Funktion wissen, jetzt kann ich die Daten abrufen und meinen Code fortsetzen. Oder so ähnlich. Da würde mir sogar eine art "Realtime" Verarbeitung möglich sein, was ich auch nicht schlecht finden würde.

Und da bin ich kläglich an allen Versuchen gescheitert so was mit Events zu realisieren, zumal ich mit events so noch nie gearbeitet habe.
Da mein Projekt riesig ist kann ich hier nicht allen Code posten aber ich versuche mal eine Art Skizze zu machen.
Also:
Programm startet -> User drückt Knopf (Frequenz messen) -> Dann soll Code warten bis Soundkarte Buffer voll hat -> Dann Daten lesen und weiterverarbeiten.
Und das soll NICHT mit einem Timer passieren. Sondern mit einem Event oder irgendwas in der Richtung was kein Timer ist.

Gibt es da was? Oder ein Lösungsvorschlag/Idee?
Ich würde mich tierisch freuen, wenn man mir da ein bisschen unter die Arme greifen könnte, denn das Projekt wäre für mich schon wichtig UND auch für andere.
Wie gesagt Code kann ich so nicht posten, da das dann im Prinzip alles wäre und das ist bis jetzt eine ganze Menge, da im Moment nix geht und auch alles irgendwie mit timern und do loops und Public Variablen gelöst ist, was einfach nur grausam ist.
Bitte helft mir!

florengray
Mitglied: Guenni
25.10.2009 um 13:47 Uhr
Hi florengray,

warum sollte das nicht mit einer Endlosschleife gehen, auch solche Schleifen

brauchen nur solange zu laufen, bis ein bestimmter Wert erreicht ist, oder gar

solange, bis z.B. der User durch Anklicken eines Menüpunkts eine Variable ändert.


Ein Beispiel aus einem Programm.

An einer bestimmten Stelle im Programm(oder in einer Prozedur/Funktion)

wird folg. Prozedur aufgerufen:

01.
 
02.
'Programmsteuerung 
03.
'Programm läuft automatisch, wird aber um die Zeitdauer Tempo verzögert 
04.
 
05.
Private Sub Auto(Tempo) 
06.
  Dim Zeit 
07.
  Zeit = Timer 
08.
  Do 
09.
    DoEvents 
10.
  Loop Until Timer - Zeit > Tempo / 10 
11.
End Sub 
12.
 
Also auto zeit_wert.

Erklärung:

Timer gibt einen Wert vom Typ Single zurück, der die Anzahl der seit Mitternacht vergangenen Sekunden angibt.

Heut Mittag um 12:00 würde also die Variable Zeit mit dem Wert 43200(Sekunden) belegt.

In der Loop-Zeile wird nun immer wieder Timer aufgerufen und von dem Wert wird Zeit abgezogen.

Da der Timer immer größer wird, so ist der Ausdruck Timer - Zeit natürlich auch irgendwann

größer als Tempo / 10.

Dann bricht die (scheinbare) Endlosschleife ab und ein(e) Programm/Prozedur/Funktion läuft weiter.

Das funktioniert z.B. auch innerhalb einer For-Schleife. Heißt, die Abarbeitung

der Schleife geht genau da nach einer bestimmten Zeit weiter, wo die Prozedur

aufgerufen wird.


Was ich jetzt versuchen würde . . .

Diese Prozedur in eine Function umschreiben, damit ein Wert zurückgegeben wird, z.B.:

01.
 
02.
private function fill_buffer() 
03.
 
04.
end function 
05.
 
Jetzt könnte man zwei Wege gehen.

Der erste wäre, den Ansatz oben komplett umschreiben, und innerhalb der Function den Buffer

der Soundkarte auslesen und eine Variable damit füllen.

Als Abbruchkriterien kämen dann zwei in Frage: Ich prüfe ob was gelesen wurde und beende die Schleife,

oder ich prüfe, ob die Variable irgendwann eine(n) bestimmte(n) Größe/Inhalt hat und beende dann.

01.
 
02.
private function fill_buffer() 
03.
 
04.
Dim Size 
05.
Dim Variable 
06.
 Size = Wert 
07.
 Do 
08.
  'Eine Function aufrufen, die den Buffer liest 
09.
  Variable = lese_buffer() 'oder Variable = lese_buffer(buffer_von_soundkarte) 
10.
 Loop Until Größe(Variable) = Size 
11.
 fill_buffer = Variable 
12.
 
13.
end function 
14.
 
Das könnte allerdings wirklich eine Endlosschleife werden, falls der Buffer der Soundkarte

nicht gelesen werden kann.


Der zweite Weg wäre, den Ansatz oben zu erweitern. Die Schleife versucht in einem definiertem Zeitraum

den Buffer auszulesen, bricht dann ab und gibt das Ergebnis zurück.

01.
 
02.
private function fill_buffer(zeitraum) 
03.
 
04.
Dim Zeit 
05.
Dim Variable 
06.
 Zeit = Timer 
07.
 Do 
08.
  'Eine Function aufrufen, die den Buffer liest 
09.
  Variable = lese_buffer() 'oder Variable = lese_buffer(buffer_von_soundkarte) 
10.
 Loop Until Timer - Zeit > zeitraum / 10 
11.
 fill_buffer = Variable 
12.
 
13.
end function 
14.
 

Innerhalb eines Programms oder einer Function/Prozedur wird dann eine Variable

mit dem Rückgabewert dieser Function initialisiert und ausgewertet:

01.
 
02.
private sub frequenz() 
03.
 
04.
Dim buffer 
05.
 . . . 
06.
 
07.
 buffer = fill_buffer (zeit_wert) 
08.
 
09.
 buffer auswerten 
10.
 
11.
 . . .  
12.
 
13.
end sub 
14.
 

Da ich zum Testen kein VB installiert habe und auch nicht weiß, wie man die Soundkarte ausliest(aber das kannst du ja),

ist das natürlich erstmal nur Theorie. Aber vielleicht hilft es dir ja ein Stück weiter.


Gruß
Günni
Bitte warten ..
Mitglied: bastla
25.10.2009 um 14:28 Uhr
@Günni
[OT]
warum sollte das nicht mit einer Endlosschleife gehen, auch solche Schleifen
brauchen nur solange zu laufen, bis ein bestimmter Wert erreicht ist, oder gar
solange, bis z.B. der User durch Anklicken eines Menüpunkts eine Variable ändert.
Ob eine Schleife mit Abbruchbedingung noch als "Endlosschleife" durchgeht?
[/OT]

Grüße
bastla
Bitte warten ..
Mitglied: florengray
25.10.2009 um 14:35 Uhr
Vielen Dank, das du geantwortet hast!
Ja das hilft ein bisschen, aber ich wollte ja von der Option herunterkommen, das ich als Abbruchkriterium eine "statische" Zeitperiode habe.
Ich wollte das wirklich dynamisch machen. Also das die Daten dann abgerufen werden wenn "etwas anderes" sagt, jetzt geht es.
Das ist jetzt blöde ausgedrückt.
Ich glaube ich komme um das schicken von Code nicht herum. Also:
Auf Imports und so verzichte ich jetzt mal.

Da habe ich nun eine Funktion, die, soweit ich das verstanden habe, alle Objekte anlegt, damit ein sekundärer Buffer mit den entsprechenden Beschreibungen erstellen kann.

01.
Public Function New_Buffer() As Boolean 
02.
        objDSCapBuff = Nothing 'altes Objekt zerstören <- Erklä ich noch #1 
03.
 
04.
        Dim descCapBuff As DSCBUFFERDESC 
05.
        Dim capFormat As WAVEFORMATEX 
06.
        'Was für ein Format soll die Wavedatei haben? 
07.
 
08.
        descCapBuff = Nothing 
09.
         
10.
 
11.
        '//Das Aufnahmeobjekt erstellen 
12.
        '//wir verwenden das Standardgerät (vbNullString) 
13.
        Try 
14.
            objDSCap = objDX.DirectSoundCaptureCreate(vbNullString) 
15.
        Catch Error_ As COMException 
16.
            MsgBox("Es ist kein Gerät am Audio-In angeschlossen!", MsgBoxStyle.Critical) 
17.
            Error_ = Nothing 
18.
            Application.Exit() 
19.
        End Try 
20.
 
21.
        '//Das Wiedergabeobjekt erstellen 
22.
        'objDS = objDX.DirectSoundCreate(vbNullString) 
23.
 
24.
        '//Format festlegen, in dem wir aufnehmen wollen 
25.
        With capFormat 
26.
            .nFormatTag = CONST_DSOUND.WAVE_FORMAT_PCM 
27.
            .nChannels = 1 'wir nehmen in mono auf 
28.
            .lSamplesPerSec = 44100 
29.
            .nBitsPerSample = 8 
30.
            .nBlockAlign = .nChannels * .nBitsPerSample / 8 
31.
            .lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign 
32.
            .nSize = 0 
33.
        End With 
34.
 
35.
        '//Unseren Aufnahmebuffer für DX "beschreiben" 
36.
        With descCapBuff 
37.
            .fxFormat = capFormat 
38.
            .lBufferBytes = capFormat.lAvgBytesPerSec * 20 
39.
            .lFlags = CONST_DSCBCAPSFLAGS.DSCBCAPS_WAVEMAPPED 
40.
        End With 
41.
 
42.
        '//Den Buffer erstellen, auf den wir aufnehmen können 
43.
        Try 
44.
            objDSCapBuff = objDSCap.CreateCaptureBuffer(descCapBuff) 
45.
        Catch Error_ As NullReferenceException 
46.
        End Try 
47.
 
48.
        objDSCapBuff.Start(CONST_DSCBSTARTFLAGS.DSCBSTART_DEFAULT)  
49.
 
50.
    End Function


01.
Private Function Catch_Record_Buffer() As Int32() 
02.
         
03.
        Dim descBuff As DSBUFFERDESC = Nothing 'beschreibt den Sec.Buffer 
04.
        Dim waveFormat As WAVEFORMATEX 'beschreibt die Aufnahme 
05.
        Dim curInfo As DSCURSORS 
06.
 
07.
        '/////////////////////////////////////////////////// 
08.
        '//zuerst müssen wir den Capture- in eine SecondaryBuffer 
09.
        '//umwandeln, damit wir ihn speichern können 
10.
 
11.
        'Informationen über den CaptureBuffer erhalten 
12.
        objDSCapBuff.GetCurrentPosition(curInfo) 
13.
 
14.
        'Deskriptor für Sec.Buffer erstellen 
15.
        With descBuff 
16.
            'Die benötigte Größe bestimmen 
17.
            .lBufferBytes = curInfo.lWrite + 1 
18.
            'das Format muss übernommen werden 
19.
            objDSCapBuff.GetFormat(waveFormat) 
20.
            .fxFormat = waveFormat 
21.
        End With 
22.
 
23.
       objDSCapBuff.GetCurrentPosition(curInfo) 
24.
 
25.
            With descBuff 
26.
                'Die benötigte Größe bestimmen 
27.
                .lBufferBytes = curInfo.lWrite + 1 
28.
                'das Format muss übernommen werden 
29.
                objDSCapBuff.GetFormat(waveFormat) 
30.
                .fxFormat = waveFormat 
31.
            End With 
32.
 
33.
        'anhand dieser Daten den Sec.Buffer erstellen 
34.
        Try 
35.
            objDSBuff = objDS.CreateSoundBuffer(descBuff) 
36.
        Catch ex As NullReferenceException 
37.
        End Try 
38.
 
39.
        'jetzt müssen noch die Daten rüberkopiert werden 
40.
        ReDim Catch_Record_Buffer(curInfo.lWrite) 
41.
 
42.
        Dim gc As GCHandle = GCHandle.Alloc(Catch_Record_Buffer, GCHandleType.Pinned) 
43.
        Try 
44.
            objDSCapBuff.ReadBuffer(0, UBound(Catch_Record_Buffer), _ 
45.
                                  Marshal.UnsafeAddrOfPinnedArrayElement(Catch_Record_Buffer, 0), CONST_DSCBLOCKFLAGS.DSCBLOCK_DEFAULT) 
46.
            objDSCapBuff.WriteBuffer(0, UBound(Catch_Record_Buffer), _ 
47.
                                     Marshal.UnsafeAddrOfPinnedArrayElement(Catch_Record_Buffer, 0), CONST_DSCBLOCKFLAGS.DSCBLOCK_DEFAULT) 
48.
        Catch ex As Exception 
49.
            MsgBox("Schwerer Ausnahmefehler") 
50.
            Application.Exit() 
51.
        End Try 
52.
 
53.
        gc.Free() 
54.
 
55.
        objDSCapBuff.Stop() 'Das angefangene aufnehmen wieder beenden 
56.
 
57.
    End Function
Das sind nun meine beiden Hauptfunktionen.
Ich muss aber zugeben, dass ich die mir so zusammengeschustert habe und dann versucht habe sie zu verstehen.
Ich hoffe du weißt mehr damit anzufangen?
Ich glaube folgendes passiert hier:
1. Es werden ganz viele Objekte und Beschreibungen erstellt damit man überhaupt mit der Soundkarte komunizieren kann.
Das komische an der 1. Funktion ist, dass man damit schon aufnehmen kann.
Ist die letzte Zeile.
2. In dieser Funktion wird wieder ein Buffer erstellt, der praktisch erstmal eine leere Kopie vom "echten" Soundkartenbuffer ist.
Dann soll dann der echte ausgelesen werden (das readbuffer...) und dann werden die Daten in das Array Catch_Record_Buffer geschrieben.

So dazu 2 Sachen.
1. Bei read buffer kann man nicht nur z.B.: 10 Arrays aus der Soundkarte auslesen. Da geht nur das Ubound(). Warum?
Ich habe irgendwie auch das Gefühl, das wenn ich z.B.: nur 100 Arrays dann schreibe, dass der "Rest" im echten buffer bleibt.
Das war nämlich kurios als ich während der Laufzeit von meinem Programm die Eingangsfrequenz geändert habe aber das Proggi erst so ca. 10 sekunden später diese Frequenz angezeigt hat. In 99% der Fälle kan da auch ein Fehler, der alles zum Abstürzen brachte.
Das war wenn der Catch_Record_Buffer() = Nothing war. Der Grund dafür kommt glaube ich jetzt:
2. Mich ärgern immer noch diese Zeilen:

01.
            With descBuff 
02.
                'Die benötigte Größe bestimmen 
03.
                .lBufferBytes = curInfo.lWrite + 1 <<<<<<<<<<<< DA 
04.
                'das Format muss übernommen werden 
05.
                objDSCapBuff.GetFormat(waveFormat) 
06.
                .fxFormat = waveFormat 
07.
            End With 
08.
             
09.
        'anhand dieser Daten den Sec.Buffer erstellen 
10.
        Try 
11.
            objDSBuff = objDS.CreateSoundBuffer(descBuff) 
12.
        Catch ex As NullReferenceException <<<<<<<<<<< DA 
13.
        End Try
Es passiert ganz oft (80% der Fälle), dass descBuff den Fehler NullReferenceException auslöst.
Der Grund ist der, dass in .lBufferBytes = curInfo.lWrite + 1 nix steht also curInfo den Wert 0 hat. Warum?
Und das ist so ziemlich immer der Grund warum mein Programm komplett abstürzt.

Aber nun zum eigentlichen Problem:
Wenn ich nun eine Frequenzmessung vornehmen will, dann wollte ich das so machen, das ich einen Button klicke
und dass dann erstmal nur die ganzen Objekte erstellt werden die nötig sind. Dann sollen Daten aufgenommen werden. Kommen als 32 bit Integer. Dazu eine Frage: Wird da immer der gesamte buffer ausgelesen und dann gelöscht oder so random irgendwas?
Und, füllt sich der Buffer immer mit der selben größe an Daten oder ist das abhängig davon wie oft man die Daten abruft?
Wenn dann angenommen der Buffer voll ist, soll "irgendwas" sagen, Buffer voll und nun soll function xyz Die Daten auslesen und weiterverarbeiten. Zum Schluss wird mir eine Frequenz ausgegeben. Wie das nun zu rechnen ist, das habe ich zu 100% gelöst.
(Wenn auch die Aufnahmequalität *** ist. Zu viele Schwankungen im Signal. Keine saubere Rechteckkurve/Sinuskurve.)
Wenn ich nun das wissen hätte so was schreiben zu können würde ich das ganze folgendermaßen aufbauen:
1. Beim laden der Form werden alle "Standartobjekte" erstellt, die sich auch nicht mehr ändern.
2. Wenn man Daten aufnehmen will, soll das dann auch passieren und wenn es fertig ist soll ein Ereignis einer Auswertfunktion sagen, "nun mach mal".
Das #1 habe ich da reingeschrieben, da dann komischerweise diese "Restdaten" verschwunden waren.
Wenn ich meine Eingangsfrequenz geändert habe dann kam auch prompt diese auf meinem Programm.
Dazu musste ich aber auch immer alles andere neu erstellen lassen, wo dann auch sehr oft Fehler verschiedenster Art auftauchen.
So was wie HRESULT (hex-code).

Da ich ja keine Realtimeverarbeitung machen kann, wäre es wegen der enormen Menge an anfallenden Daten (44100 pro Sekunde)
auch cool, wenn ich der Soundkarte sagen könnte: Bitte nehme nur 100 Samples auf und dann gib den Befehl zum Abarbeiten.

Das soll sozusagen der "Rechenkern" in meinem Programm sein.
Wenn Funktion A Daten braucht ,soll diese Funktion immer dann wenn wenn Daten da sind weitermachen.
Wenn Funktion B Daten braucht so soll dies analog gehen.

Jetzt fällt mir z.B. ein konkretes Problem ein:
Wenn ich eine Kalibrierung durchführen möchte, dann spiele ich eine wav Datei ab mit einer Kalibrierfrequenz. (1000 Hz)
So, und es dauert nun ein bisschen, bis dann auch die Datei spielt/Daten im Buffer stehen. Wenn jetzt aber meine jetzige Lösung mit den Timern z.B.: zu früh das Signal zum Abarbeiten gibt, dann stürzt mein Proggi ab. Manchmal auch einfach so ohen das was passiert ist.
Darum will ich unbedingt von solchen "statischen" Abfragen weg.

Is ne Menge Krempel, ich weiß, aber zum Schluss ein sehr schönes Programm.
Wenn es dann gehen würde.

bis denne

florengray
Bitte warten ..
Mitglied: florengray
26.10.2009 um 21:03 Uhr
Was ist denn nu los?
Ja ich weiß, der Code ist bei weitem nicht das wahre. Aber davon mal abgesehen bin ich ja daran das noch zu verbessern.
Ich habe jetzt rausgefunden wie ich Events auslösen kann. *freu*
Dazu habe ich mir ein Testbeispiel ausgedacht:

Public Event Ein_Ereignis(ByVal EventNumber As Integer)
Public WithEvents Ereigniscontainer As Form1

Public Sub test(ByVal Ereignisnummer As Integer) Handles Ereigniscontainer.EinEreignis
MsgBox("Ereignisnummer: " & CStr(Ereignisnummer))
End Function

Private Sub Button1_Click() Handles Button2.Click
AddHandler Ein_Ereignis AddressOf test
RaiseEvent AnEvent(1)
End Sub

Wenn ich das nun richtig verstanden habe macht man hier folgendes:
1. Man deklarieert eine Variable as Event und kann ich wie sinst auch Parameter übergeben
2. Man kriert ein Art Container der zu der Klasse Form1 gehört, wo man dann die Ereignisse abfragen kann.
3. Man hat dann ein Sub wo zufälligerweise auch eine Variable übergeben werden muss und ein Ereignis auf dieses Sub gelegt, dass das ausgeführt wird, wenn das Ereignis ausgelöst wird.
4. Da ich nun das Ereignis auch auslösen möchte muss ich zuerst noch das Ereignis wirklich "erstellen"???
Das macht das AddHandler. Ich habe den Syntax so verstanden:
Erstelle eine Handle das Ein_Ereignis heißt und zu dem Sub test gehört.
Da eine Frage: Warum muss ich da was mit AddressOf angeben? Wozu dient das? Kann dann das Event nur in Zusammenhang mit test benutzt werden?
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (8)

Frage von schaurian zum Thema DSL, VDSL ...

Windows Netzwerk
gelöst Problem mit PSexec64 von Sysinternals (8)

Frage von MaxMoritz6 zum Thema Windows Netzwerk ...

Windows Server
gelöst Problem nach DC-Installation unter Server 2012 R2 (9)

Frage von manuel1985 zum Thema Windows Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...