PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : do Schleife in VB beenden???


Vertex
2003-03-19, 20:30:27
Hab da n Problem in VB mit Do:

do while (z= Not 9)


End ...

Wie beende ich so eine do Schleife (... ; bzw. was muss ich statt den 3 Punkten schreiben). Gibt es noch ne andere Möglich keit außer "Not" um "z!=9" zu sagen.


BITTE HELFEN!!

stabilo_boss13
2003-03-19, 20:55:43
Hi!

Do Schleifen enden in VB mit LOOP!

Do While ...
Loop

Ungleich wird in VB so geschrieben: <>

Do While z<>9
...
Loop

Ausserdem kannst du mit Exit eine zusätzliche Abbruchbedingung setzen:

Do While z<>9
If z=3 Then
Exit Do
End If
Loop


Wenn du die Syntax mal vergessen hast, dann setzt einfach den Cursor im VB auf das Schlüsselwort (hier: Do) und drücke die F1-Taste.
Oder schaue in der Onlinehilfe nach:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconusingdoloop.asp

Vertex
2003-03-19, 21:05:55
thx

funzt perfekt!

Vertex
2003-04-02, 17:54:31
Hab da leider noch mal ein Anliegen, wo ich nichts gefunden habe:

Habe in meinem VB Prgramm mehrere Forms und wenn man das Proggi ganz normal mit meiner selbst erstellten Beenden Taste beendet funzt alles perfekt. (Habe mit dem "End" Befehl beendet)

So und jetzt hab ich mal durch zufall ausprobiert was is, wenn ich auf das X vom Windowsfenster klicke. Er beendet nur die eine Form, da ich die anderen Formen (min. 1) im Hintergrund laufen lassen muss. --> Das Programm beendet sich nicht und man sieht auch davon nichts mehr. (Nur noch über Task Manager beendbar)

Kann ich diesen X Button irgendwie deaktivieren wie die zwei anderen, oder hab ich die Möglichkeit manuell zu verändern was er machen soll bzw. zusätzlich machen soll, wenn beendet wird.

any idea???

stabilo_boss13
2003-04-02, 20:46:21
Originally posted by Vertex
Hab da leider noch mal ein Anliegen, wo ich nichts gefunden habe:

Habe in meinem VB Prgramm mehrere Forms und wenn man das Proggi ganz normal mit meiner selbst erstellten Beenden Taste beendet funzt alles perfekt. (Habe mit dem "End" Befehl beendet)

So und jetzt hab ich mal durch zufall ausprobiert was is, wenn ich auf das X vom Windowsfenster klicke. Er beendet nur die eine Form, da ich die anderen Formen (min. 1) im Hintergrund laufen lassen muss. --> Das Programm beendet sich nicht und man sieht auch davon nichts mehr. (Nur noch über Task Manager beendbar)

Kann ich diesen X Button irgendwie deaktivieren wie die zwei anderen, oder hab ich die Möglichkeit manuell zu verändern was er machen soll bzw. zusätzlich machen soll, wenn beendet wird.

any idea??? Es gibt natürlich die Möglichkeit, das X zu deaktivieren. Du musst nur in den Eigenschaften des Fensters die ControlBox auf False setzen. Aber das ist imo nicht die feine englische Art.

Das letzte Ereignis, das jedes Fenster kurz vor seinem Tod aufruft heisst QueryUnload. Alles was beim Programmende geschehen soll, gehört da hinein.

So machst du das:
Du öffnest den Quelltexteditor für das betroffene Formular. Oben links wählst du aus der Box Form aus. Dann erscheinen rechts in der Scrolldownbox die Ereignisse für die Form. Wähle dort QueryUnload aus.

Nun bist du im Quelltext des Ereignisses QueryUnload. Schreibe dort deine gewünschten Befehle rein. Der letzte sollte (muss) End sein!

Das Ereignis, das bisher den End-Befehl enthalten hat, musst du nun ändern. Also falls du einen Button hast, dann kommt das ins Click-Ereignis. Du ersetzt einfach den Befehl End durch Unload Me.

Was passiert jetzt:
Wenn der Anwender auf den Menüpunkt oder Button für das Programmende klickt, dann wird durch Unload Me das Formular entladen. Da das letzte Ereignis immer QueryUnload ist, wird das jetzt aufgerufen. Sollte der Anwender aber das X klicken, dann wird auch das Formular entladen und selbstverständlich auch das Ereignis QueryUnload aufgerufen.

Das funktionert auch dann, wenn der Anwender Alt+F4 drückt, um das Fenster zu schließen, oder links oben im Fenster zweimal auf das Icon klickt oder aus dem Systemmenü Schließen auswählt oder das minimierte Fenster in der Taskbar mit der rechten Maustaste anklickt und Schließen wählt usw.

Du könntest also z.B. im QueryUnload mit einer MessageBox abfragen, ob das Programm wirklich beendet werden soll. Über den Parameter Cancel (Cancel = True) des Ereignisses kannst du das Entladen nämlich jederzeit abbrechen.

Ach ja: Du darfst natürlich in das Ereignis QueryUnload niemals den Befehl Unload Me schreiben. Der ruft ja das Ereignis wieder selbst auf. So hast du eine schöne Endlosschleife!

Vertex
2003-04-02, 22:13:59
thx!

klappt schon so weit nur mit der Msgbox hats was:

da muss ich des eingebn:

Msgbox( prompt, ...

Laut Hilfe is prompt ein String, aber ich weiß echt nicht was ich da einfügen soll. (hab schon einiges ausprobiert)

Sorry wenn ich die ganze Zeit solche dummen Fragen stelle nur ich muss mir die Sprache irgendwie selber beibringen und des is immerhin mein ersten Proggi mit VB. (da hängt alles drinnen was ich bis jetzt weiß)

Unregistered
2003-04-02, 22:20:27
Eine Msgbox kannst du so ausgeben:
msgbox("Dies ist eine Messagebox")

Vertex
2003-04-02, 22:24:55
Originally posted by Unregistered
Eine Msgbox kannst du so ausgeben:
msgbox("Dies ist eine Messagebox")

ja, aber was is wenn ich dann noch bestimmen will, dass es einen ja und einen nein button gibt und ich abfragen will welcher gedrückt wurde.

genauer:
If MsgBox(???prompt???, vbYesNo, "Wollen Sie wirklich Beenden?", , "Beenden") = vbYes Then

stabilo_boss13
2003-04-03, 08:00:20
Originally posted by Vertex


ja, aber was is wenn ich dann noch bestimmen will, dass es einen ja und einen nein button gibt und ich abfragen will welcher gedrückt wurde.

genauer:
If MsgBox(???prompt???, vbYesNo, "Wollen Sie wirklich Beenden?", , "Beenden") = vbYes Then
Hier ein Beispiel:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("Wollen Sie das Programm wirklich beenden?", vbQuestion + vbYesNo, "Programmende") = vbYes Then
' Hier allen Code zum Beenden einfügen!
End
Else
' oder Programm nicht beenden!
Cancel = True
End If

End Sub

Unregistered
2003-04-03, 16:42:13
Originally posted by stabilo_boss13

Hier ein Beispiel:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("Wollen Sie das Programm wirklich beenden?", vbQuestion + vbYesNo, "Programmende") = vbYes Then
' Hier allen Code zum Beenden einfügen!
End
Else
' oder Programm nicht beenden!
Cancel = True
End If

End Sub


Sollte das nicht
Else
' oder Programm nicht beenden!
Cancel = False
End If

heissen?

stabilo_boss13
2003-04-03, 18:22:43
Originally posted by Unregistered


Sollte das nicht
Else
' oder Programm nicht beenden!
Cancel = False
End If

heissen?
Nein!
Cancel ist die Abbruchbedingung. Wird diese auf True (in Wirklichkeit auf eine Zahl ungleich 0) gesetzt, dann wird die Ereignisprozedur QueryUnload abgebrochen.
Hier der Originaltext aus der VB-Hilfe:
cancel
An integer. Setting this argument to any value other than 0 stops the QueryUnload event in all loaded forms and stops the form and application from closing.

Vertex
2003-04-03, 21:13:17
Originally posted by stabilo_boss13

Hier ein Beispiel:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("Wollen Sie das Programm wirklich beenden?", vbQuestion + vbYesNo, "Programmende") = vbYes Then
' Hier allen Code zum Beenden einfügen!
End
Else
' oder Programm nicht beenden!
Cancel = True
End If

End Sub


thx!

Hab schon mitbekommen, dass ich mich da irgendwie verhaut habe. Hatte den Text "Wollen Sie das Programm wirklich beenden?" ganz nach hinten geschrieben (hatte ich irgendwo her) und wusste somit nicht mehr was ich vorne hinschreiben sollte. Funzt jetzt aber alles.
Juhu;D;D;D bin jetzt bald mit meinem Proggi fertig.

Vertex
2003-04-08, 17:49:26
Hab da leider schon wieder ein Prob:

Hab nen Wert (Frequenz) die berechnet wird.
is ein int Wert, der leider ab und zu zuviel Kommastellen hat.

will jetzt den Wert runden:

takt = Round(takt2, 20)

und wenn ich jetzt takt ausgebe rundet er mir das ohne einer einzigen Kommastelle. Hätte aber gerne so ca. 2 Kommastellen.

Gibts irgend nen anderen Befehl (hab sonst nix gefunden), oder soll ich mir selbst schnell was zusammenschreiben???

stabilo_boss13
2003-04-08, 20:00:17
Originally posted by Vertex
Hab da leider schon wieder ein Prob:

Hab nen Wert (Frequenz) die berechnet wird.
is ein int Wert, der leider ab und zu zuviel Kommastellen hat.

will jetzt den Wert runden:

takt = Round(takt2, 20)

und wenn ich jetzt takt ausgebe rundet er mir das ohne einer einzigen Kommastelle. Hätte aber gerne so ca. 2 Kommastellen.

Gibts irgend nen anderen Befehl (hab sonst nix gefunden), oder soll ich mir selbst schnell was zusammenschreiben??? Das mit der Round-Funktion ist schon richtig so. Die Parameter sind zuerst der zu rundende Wert und dann die Anzahl der Nachkommastellen:

Debug.Print Round (5.2894, 2)

gibt also 5.29 aus.

Du schreibst, dass der Wert ein Integer ist. Das wäre hier falsch, da Integerwerte keine Nachkommastellen haben!
Sowohl Takt als auch Takt2 solltest du als Double deklarieren.
Dann sollte dein Ergebnis auch stimmen:

Dim Takt As Double, Takt2 As Double

Takt2 = 231.46344461
Takt = Round (Takt2, 2)
Debug.Print Takt


Du kannst auch auf die Zeile mit der Round-Funktion einen Breakpoint setzen. Dann bleibt das Programm nach dem Start auf dieser Zeile stehen und du kannst die Werte von Takt und Takt2 überprüfen, in dem du einfach den Mauszeiger ein paar Sekunden über die entsprechende Variable hältst.

stabilo

Vertex
2003-04-08, 20:16:03
Originally posted by stabilo_boss13
Das mit der Round-Funktion ist schon richtig so. Die Parameter sind zuerst der zu rundende Wert und dann die Anzahl der Nachkommastellen:

Debug.Print Round (5.2894, 2)

gibt also 5.29 aus.

Du schreibst, dass der Wert ein Integer ist. Das wäre hier falsch, da Integerwerte keine Nachkommastellen haben!
Sowohl Takt als auch Takt2 solltest du als Double deklarieren.
Dann sollte dein Ergebnis auch stimmen:

Dim Takt As Double, Takt2 As Double

Takt2 = 231.46344461
Takt = Round (Takt2, 2)
Debug.Print Takt


Du kannst auch auf die Zeile mit der Round-Funktion einen Breakpoint setzen. Dann bleibt das Programm nach dem Start auf dieser Zeile stehen und du kannst die Werte von Takt und Takt2 überprüfen, in dem du einfach den Mauszeiger ein paar Sekunden über die entsprechende Variable hältst.

stabilo

Thx!

Hab mich da wohl wieder mal selbst in die Irre geführt.

Außerdem handelt es sich um Takt2 und Takt in dem Fall um ein Textfeld (diesesmal is es richtig!)

Is zwar nicht mehr wichtig für mein Prob, aber was hat denn ein Textfeld für nen Variablentyp, damit meine ich in was für einen Typ er den String umwandelt. Intelligentes raussuchen???

Funzt perfekt!!

Vertex
2003-04-23, 16:41:58
2 Sachen wären da zu klären:

1. Hab ne Statusleiste mit Panels und hab etwas zum Ausführen wenn auf ein Spezielles geklickt wird. Hab allerdings nur die Möglichkeit gefunden wenn man auf irgendein Panel klickt, dass dann der code ausgeführt wird.

Es geht eigentlich um einen Zustand der geändert wird wenn auf ein Panel geklickt wird, allerdings sollte das nicht passieren wenn man irgendwo in der Statusleiste herumklickt... und ich würde auch noch gerne auf einem anderen Panel nen code ausführen (nur bei Klick)


2. Da ich bald mit meinem Proggi fertig sein muss und das ganze wie ne Art Wettkampf is, muss ich natürlich noch irgendwas einfügen was die Augen auf mein Proggi zieht. (da der eigentliche Code sehr wenig is muss man ja fast noch irgendwas anderes machen)

Hat irgendwer ne Idee was ich noch einfügen kann (völlig sinnloses geht auch, hauptsache es sieht gut aus). Irgendetwas das wirkt. Bis zu welcher Schwierigkeitsstufe... naja... ich hab ja euch zum nachfragen.

THX!

Vertex
2003-05-06, 19:18:47
Letztes und sehr böses Prob in meinem Proggi:
Sorry falls es nicht super programmiert is, aber ich arbeite auch noch nicht so lange mit VB (Verbesserungsvorschläge sind erwünscht)

Erstmal den Sourcecode: (das ganze dient nacher mal zur Frequenzmessung, is aber nur die Hälfte)

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvDSR

CD = MSComm1.DSRHolding


If MSComm1.DSRHolding = True Then
Shape8.FillColor = RGB(255, 0, 0)
jkl = 0
Else
Shape8.FillColor = RGB(0, 0, 0)
jkl = 1
End If

If (jkl = 0) Then
shpLampe.FillColor = RGB(255, 0, 0)
jkl = 1
Timer5.Enabled = True
End If

If jkl = 1 Then
shpLampe.FillColor = RGB(0, 0, 0)
Timer5.Enabled = False
aktpio = pio
jkl = 0
Label18 = aktpio
End If

End Sub

Kurz zur Erklärung:

Eigentlich sollte dieses Commevent (comEvDSR) zuschlagen wenn sich was auf der DSR Leitung tut. Dann sollte der aktuelle Zustand gespeichert (boolean) werden und die Farbe des shape8 angepasst werden.

Der Zustand wird als jkl gespeichert (warum auch immer). Und dann wird shpLampe, das den Zustand darstellen soll, verändert. Ebenfalls wird nochmal ein Timer en/disabled. (pio, aktpio, label18, shape8 können ignoriert werden)

Mein Prob/Erfahrung: Habe verschiedene Zustände an DSR angelegt (+-12V) und nach ca. 2bis3 Zustandsänderungen hat sich was getan (leider nur wenig):

Die Zeile hat ausgeführt: Label18 = aktpio

Sonst macht er nix. Keine Farbänderung, oder sonst was. Der Zustand wird auch garantiert nicht zu schnell geändert. Er macht den Befehl scheinbar auch nur 1 mal.

Irgendwelche Fehler gefunden, oder sonstige Vorschläge? ???

stabilo_boss13
2003-05-06, 19:56:13
Originally posted by Vertex

If (jkl = 0) Then
shpLampe.FillColor = RGB(255, 0, 0)
jkl = 1
Timer5.Enabled = True
End If

If jkl = 1 Then
shpLampe.FillColor = RGB(0, 0, 0)
Timer5.Enabled = False
aktpio = pio
jkl = 0
Label18 = aktpio
End If

End Sub [/code]

Hab es nur mal schnell überflogen. Wenn du in der fettgedruckten Zeile jkl auf 1 setzt, dann wird der darunterliegende Teil (if jkl=1 then) immer ausgeführt.

Es ist also egal, ob jkl 0 oder 1 ist, shpLampe.FillColor ist immer RGB(0, 0, 0)!

Vorschlag:

Select Case jkl
Case 0
shpLampe.FillColor = RGB(255, 0, 0)
usw.
Case 1
shpLampe.FillColor = RGB(0, 0, 0)
usw.
Case Else
' Fehler!
End Select

Vertex
2003-05-06, 20:05:14
THX!!!:D

Lösungsvorschlag:

If MSComm1.DSRHolding = True Then
Shape8.FillColor = RGB(255, 0, 0)
jkl = 0
Else
Shape8.FillColor = RGB(0, 0, 0)
jkl = 1
End If

If (jkl = 0) Then
shpLampe.FillColor = RGB(255, 0, 0)
---
Timer5.Enabled = True
End If

If jkl = 1 Then
shpLampe.FillColor = RGB(0, 0, 0)
Timer5.Enabled = False
aktpio = pio
---
Label18 = aktpio
End If

Dabei bringst du mich auf ne Idee. Hab des ganze leider schon vor ner ganzen weile programmiert und ich werde jetzt mal schauen ob des jkl noch irgendwo verwendet wird...:sulkoff:

noch ne kleine Frage:
Was für einen Befehl brauch ich um einen Text im Textfeld zu markieren. Text soll einfach markiert sein. ???

stabilo_boss13
2003-05-06, 20:08:37
Du könntest aber auch einfach aus der Sub rausspringen:

If (jkl = 0) Then
shpLampe.FillColor = RGB(255, 0, 0)
Timer5.Enabled = True
Exit Sub
End If

Vertex
2003-05-06, 20:10:24
Originally posted by stabilo_boss13
Du könntest aber auch einfach aus der Sub rausspringen:

If (jkl = 0) Then
shpLampe.FillColor = RGB(255, 0, 0)
Timer5.Enabled = True
Exit Sub
End If


bringt das was, außer theoretischem Speedvorteil?

Vielleicht, dass ich sicher stellen kann, dass er nicht in die andere If anweisung reingeht?

Schaust dir nochmal die neue Frage dort oben an (letzter Post), bitte?

Weils grad so lustig is: (Hab keine mögliche Lösung dazu gefunden)

Hab ne Statusleiste mit Panels und hab etwas zum Ausführen wenn auf ein Spezielles geklickt wird. Hab allerdings nur die Möglichkeit gefunden wenn man auf irgendein Panel klickt, dass dann der code ausgeführt wird.

Es geht eigentlich um einen Zustand der geändert wird wenn auf ein Panel geklickt wird, allerdings sollte das nicht passieren wenn man irgendwo in der Statusleiste herumklickt... und ich würde auch noch gerne auf einem anderen Panel nen code ausführen (nur bei Klick)

Vertex
2003-05-06, 20:18:39
Originally posted by stabilo_boss13
Hab es nur mal schnell überflogen. Wenn du in der fettgedruckten Zeile jkl auf 1 setzt, dann wird der darunterliegende Teil (if jkl=1 then) immer ausgeführt.

Es ist also egal, ob jkl 0 oder 1 ist, shpLampe.FillColor ist immer RGB(0, 0, 0)!

Vorschlag:

Select Case jkl
Case 0
shpLampe.FillColor = RGB(255, 0, 0)
usw.
Case 1
shpLampe.FillColor = RGB(0, 0, 0)
usw.
Case Else
' Fehler!
End Select


Werde mir dein edit noch mal anschauen und auch meinen code abändern. Es funzt auf alle Fälle.

stabilo_boss13
2003-05-06, 20:25:51
Originally posted by Vertex


bringt das was, außer theoretischem Speedvorteil?

Vielleicht, dass ich sicher stellen kann, dass er nicht in die andere If anweisung reingeht?Naja.
Das ist halt der typische Sideeffekt. Du wirfst irgendwo eine Zeile raus (hier jkl=1) und schon bricht an anderer Stelle etwas zusammen, weil du nicht berücksichtigt hast, dass du vielleicht jkl da noch brauchst. Wenn du einfach aus der Sub rausspringst, dann kannst du den vermeintlich fehlerhaften Code (jkl=1) drinlassen.

Um so was zu verhindern, hat man ja die objektorientierte Programmierung erfunden. ;)
Schaust dir nochmal die neue Frage dort oben an (letzter Post), bitte? Mach ich. Aber ich bin jetzt zu Hause, da hab ich kein VB. Muss mir das mit dem Panel aber anschauen können.

Vertex
2003-05-06, 20:35:01
THX!

Vielleicht ging aber noch was anderes.
Bräuchte ne Möglichkeit zu stoppen, d.h. über Systemzeit. Nur wie liest man in VB die Systemzeit aus. Es sollte wenn möglich im ms Bereich sein, sonst bringt es sich nichts???

Mit nem Timer der immer 1ms zählt und ne Variable erhöht is es zu langsam.

stabilo_boss13
2003-05-06, 20:53:56
Akkurate Zeitmessungen sind in VB schwierig. Aber du kannst über die Api-Funktion GetTickCount schon vernünftige Messungen im Millisekundenbereich machen.


Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub MeasureTime()

Dim lngTickStart As Long
Dim lngTickStop As Long

lngTickStart = GetTickCount()
' Mach dies und mach das
lngTickStop = GetTickCount()

Debug.Print lngTickStop-LngTickStart;" Millisekunden vergangen"

End Sub

Demirug
2003-05-06, 21:08:16
Wenn dir GetTickCount immer noch nicht genau genug ist gäbe es noch QueryPerformanceCounter und QueryPerformanceFrequency.

Vertex
2003-05-06, 21:14:18
Originally posted by Demirug
Wenn dir GetTickCount immer noch nicht genau genug ist gäbe es noch QueryPerformanceCounter und QueryPerformanceFrequency.

Declare Function QueryPerformanceCounter Lib "kernel32.dll" () As Long

Private Sub MeasureTime()

Dim lngTickStart As Long
Dim lngTickStop As Long

lngTickStart = QueryPerformanceCounter ()
lngTickStop = QueryPerformanceCounter ()

aktpio = lngTickStop - lngTickStart
End Sub


Mal einfach so geraten: würde das so in etwa gehen?

erster Versuch sagt: funzt nicht

Demirug
2003-05-07, 11:38:48
Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long



Dim Frequency as Currency
Dim Count0 as Currency
Dim Count1 as Currency
Dim HowLong as Double
Dim ErcL as Long

ErcL = QueryPerformanceFrequency Frequency

If ErcL = 0 then End ' Timer ist nicht verfügbar

QueryPerformanceCounter Count0
.
. (code)
.
QueryPerformanceCounter Count1

HowLong = Cdbl((Count1-Count0) / Frequency) 'Zeitdifferenz in Sekunden


Wenn man genauer als eine Sekunde messen möchte muss man "Frequency" vorher entsprechend teilen.

Zum Beispiel durch 1000 für millisekunden.

stabilo_boss13
2003-05-07, 14:24:45
Originally posted by Vertex
1. Hab ne Statusleiste mit Panels und hab etwas zum Ausführen wenn auf ein Spezielles geklickt wird. Hab allerdings nur die Möglichkeit gefunden wenn man auf irgendein Panel klickt, dass dann der code ausgeführt wird.

Es geht eigentlich um einen Zustand der geändert wird wenn auf ein Panel geklickt wird, allerdings sollte das nicht passieren wenn man irgendwo in der Statusleiste herumklickt... und ich würde auch noch gerne auf einem anderen Panel nen code ausführen (nur bei Klick)Ich gehe mal davon, dass du ein Statusbar-Steuerelement mit ein paar Panels auf deinem Formular angelegt hast.

Die einzelnen Panels stehen in der Panels-Auflistung. So kannst du z.B. mit
MsgBox StatusBar1.Panels.Count
die Anzahl der Panels ermitteln oder mit

StatusBar1.Panels.Add
ein weiteres Panel hinzufügen.

Auf die einzelnen Panels greifst du über deren Index zu:

Private Sub StatusBar1_PanelClick(ByVal Panel As ComctlLib.Panel)

MsgBox "Gewähltes Panel " & Panel.Index

End Sub
Das angeklickte Panel wird dir hierbei als Parameter (ByVal Panel As ComctlLib.Panel) übergeben.

Um also verschiedenen Code für die einzelnen Panels auszuführen, kannst du so vorgehen:


Private Sub StatusBar1_PanelClick(ByVal Panel As ComctlLib.Panel)

Select Case Panel.Index
Case 1
' Tu dies
Case 2
' Tu das
Case 3
' Tu gar nichts
Case Else
' Fehler
End Select

End Sub
Auflistungen (Collections) begegnen dir in VB übrigens ziemlich oft.

Vertex
2003-05-07, 15:00:47
THX an beide!

@stabilo_boss13: funzt... wieder mal was neues gelernt.

@Demirug: Habs noch nicht ganz hin bekommen, da ich gerade nicht sonderlich viel Zeit habe, werds mir aber noch mal anschauen.


ErcL = QueryPerformanceFrequency (Frequency)

irgendwo in der Zeile hat er sich aufgeregt: (werds dann wohl erst morgen nochmal ausprobieren)

HowLong = Cdbl((Count1-Count0) / Frequency) 'Zeitdifferenz in Sekunden

Cdbl??? Kann mir jemand dazu was schreiben, bzw. was is das?

stabilo_boss13
2003-05-07, 18:34:11
Originally posted by Vertex
Cdbl??? Kann mir jemand dazu was schreiben, bzw. was is das? Die mit einem 'C' beginnenden Funktionen sind Konvertierungsfunktionen:

CBool
CByte
CChar
CDate
CDbl
CDec
CInt
CLng
CObj
CShort
CSng
CStr

Da sie Inline ausgelegt sind, sollen sie besonders schnell sein.

Dim MyDouble, MyString
MyDouble = 437.324 ' MyDouble als Double.
MyString = CStr(MyDouble) ' MyString enthält jetzt "437.324".
Ich nutze sie, wenn ich etwas in eine Datenbank schreiben will, um sicher zu stellen, dass der Datentyp korrekt ist.

Vertex
2003-05-09, 15:22:13
Hab da jetzt eine Art Zustandsabfrage gemacht: (Diesmal ne rein logische Frage)

zb.: Hier sollte der Leitungsausgangszustand von DTR (Serielle Pinbelegung) in die Variable State geschrieben werden.
State = MSComm1.DTREnable

Kann dieser Code den Zustand dieser Leitung beeinflussen- also führt er MSComm1.DTREnable aus? (Zustandsänderung auf True)

Mit diesem Programmteil läuft gar nix mehr, sonst läufts schon. Is nur ein Verdacht, dass es sich um das handeln könnte.

Vertex
2003-05-09, 15:31:58
Hab das mal jetzt so gelöst: (und es funzt so wieder)

If MSComm1.DTREnable = True Then
State = True
Else
State = False
End If

... kann mal jemand erklären warum der bei einer Zuweisung wie im vorhergehenden Post den code ausführt bzw. den Zustand ändert. (kann nicht belegen dass er das macht)

Auf der Seriellen Schnittstelle war eigentlich gar nichts zu messen. Anstatt -12V oder +12V lagen ca. 0,8~=0V (würde man ca. auf nem Eingang messen)

Vertex
2003-05-09, 16:01:07
Lag wohl doch nicht dran. Argh...

Aber man könnte mir vielleicht doch anders helfen.??? Das Problem wäre auch gelöst wenn ich bei der Panelklickfunktion eine Auswahl für die linke Maustaste und die rechte Maustaste hätte (so wie bei Mousemove)

stabilo_boss13
2003-05-09, 16:30:55
Originally posted by Vertex
Lag wohl doch nicht dran. Argh...

Aber man könnte mir vielleicht doch anders helfen.??? Das Problem wäre auch gelöst wenn ich bei der Panelklickfunktion eine Auswahl für die linke Maustaste und die rechte Maustaste hätte (so wie bei Mousemove) Das geht mit einer globalen Variablen für die Maustaste ganz einfach:Dim iMouseButton As Integer

Private Sub StatusBar1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

iMouseButton = Button

End Sub

Private Sub StatusBar1_PanelClick(ByVal Panel As ComctlLib.Panel)

MsgBox "Button " & iMouseButton & " Panel " & Panel.Index

End SubDie Ereignisse werden der Reihe nach (zuerst Mousedown, dann Panelclick) abgearbeitet.

Vertex
2003-05-09, 16:37:56
Thx! des Panel funzt jetzt zumindest richtig!