| |
VB.NET - Ein- und UmsteigerNach Time_Tick zum nächsten Label | | | Autor: Erwin1 | Datum: 11.12.17 14:29 |
| Hallo,
mal wieder eine Frage an der ich hängen bleibe. Ich nutze VB 2010 Express.
Ich habe eine Form mit zwei untereinander angeordneten Reihen mehrerer Label erstellt, in denn ich Zahlen von einem Prozess nacheinander nach Ablauf einer Time_Tick Funktion anzeigen möchte. Im ersten Label klappt dies auch bis zum Ablauf des Timers. Nun zu meiner Frage :
1. Wie erreiche ich, das er nach dem ersten Time_Tick zum nächsten Label wechselt und dort mit der Anzeige weitermacht, vom selben Prozess mit der selben Zeit?
Vielleicht ist dabei noch hilfreich zu erwähnen, das ich in der ersten Reihe fortlaufend durch einen eingelesen Prozess die Zahlen von 1 bis~ einlesen und darstellen kann und möchte.
Private Sub Score11_Paint(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Score11.Paint
Dim file_ini As String
file_ini = Application.StartupPath & ".\Einstellung.ini"
If IO.File.Exists(file_ini) Then
End If
Dim farbe, farbe1 As Integer
farbe = INI_ReadValueFromFile("LastscoreFenster", "Hintergrundfarbe", _
"", file_ini)
farbe1 = INI_ReadValueFromFile("LastscoreFenster", "ScoreZahlenfarbe", _
"", file_ini)
Score11.BackColor = Color.FromArgb(farbe)
Score11.ForeColor = Color.FromArgb(farbe1)
Dim buffer As Integer
ReadProcessMemory(CInt(processHandle), &H624BCC, buffer, 4, 0) '
' auslesen Rundenanzeige
Lbround1.Text = CStr(buffer)
Dim buffer1 As Integer
ReadProcessMemory(CInt(processHandle), &H624BDC, buffer1, 4, 0) '
' auslesen Punkte Player 1
Score11.Text = CStr(buffer1)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
Score11.Text = DateTime.Now.ToString
second = second + 1
If second >= 3 Then
Timer1.Stop() 'Stoppt Timer
End If
End Sub
Beitrag wurde zuletzt am 11.12.17 um 14:31:35 editiert. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Manfred X | Datum: 11.12.17 15:18 |
| Hallo!
So weit ich verstanden habe ...
Indem Du die Labels in einer List(of Label) anordnest und bei
Bedarf im Timer-Event die formular-global definierte Indexvariable,
die sich auf diese Listen bezieht, hochsetzt.
'Im Formular:
Dim lbround as new list(of Label)
Dim score as new list(of label)
Dim LabelIndex as integer = 0
'Die benötigten Label-Objekte der Listen jeweils in einer Schleife erstellen
'und anordnen
'z.B. im Form_Load_Event
In der Display-Routine:
Score(LabelIndex).Text = ....
Im Timer:
LabelIndex += LabelIndex
If labelindex >= Score.Count-1 then LabelIndex = 0 | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Erwin1 | Datum: 11.12.17 17:07 |
| Hallo Manfred,
meinst Du mit dieser List(of Label) dies von combit? Die ist ja ziemlich preisgünstig, oder verstehe ich da etwas falsch?? So ein Steuerelement kann ich sonst nicht finden. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Manfred X | Datum: 11.12.17 21:10 |
| Diese generische Liste (Klasse) ist integrierter Teil des Framework:
Namespace - System.Collections.Generic | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: sv00010 | Datum: 12.12.17 17:26 |
| Ich denke du solltest dir überlegen, die ganze Arbeit im Timer zu erledigen und nichts in der OnPaint-Routine machen.
Die OnPaint-Routine sollte keine Aufgaben erledigen, welche nicht auch der Timer erledigen kann.
Beitrag wurde zuletzt am 12.12.17 um 17:26:43 editiert. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Erwin1 | Datum: 12.12.17 20:04 |
| Hallo,
@ sv00010, Danke für Deine Antwort, aber die bringt mich erst mal nicht weiter.
@ Manfred,
als Anfänger in Sachen VB.net habe ich es nach Stunden geschafft, etwas in der Form zur Anzeige zu bringen, was aber jetzt noch größere Probleme aufwirft. Erst mal der Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Dim lbround As New List(Of Label)
Dim score As New List(Of Label)
Dim LabelIndex As Integer = 0
Timer1.Interval = 10000
Timer1.Start() 'Timer starts functioning
For Each label As Label In Me.Controls.OfType(Of Label)()
If label.Name.StartsWith("lbround") Then
label.Visible = True
End If
Next
For Each label As Label In Me.Controls.OfType(Of Label)()
If label.Name.StartsWith("lbscore") Then
label.Visible = True
End If
Next
' 10 Label neu erzeugen
For i As Integer = 0 To 9
Dim lbround As New List(Of Label)
Dim score As New List(Of Label)
Dim TabIndex As Integer = 0
' Erste Reihe Label erzeugen
lbArray(i) = New Label
' Das erzeugte Label verwenden:
With lbArray(i)
' Parent festlegen und Controls-Collection erweitern
.Parent = Me
.Parent.Controls.Add(lbArray(i))
' Verwaltungsinformationen zuweisen
.Name = "Lbround" & CStr(i)
.TabIndex = i
' Darstellung: Beschriften und positionieren
.Text = ""
.Size = New Size(54, 39)
.Location = New Point(16, 66 + i * 1 * .Height)
.Visible = True
.BorderStyle = BorderStyle.FixedSingle
.TextAlign = ContentAlignment.MiddleCenter
End With
Next i
For i As Integer = 0 To 9
' Zweite Reihe Label erzeugen
lbArray(i) = New Label
' Das erzeugte Label verwenden:
With lbArray(i)
' Parent festlegen und Controls-Collection erweitern
.Parent = Me
.Parent.Controls.Add(lbArray(i))
' Verwaltungsinformationen zuweisen
.Name = "Lbscore" & CStr(i)
.TabIndex = i
' Darstellung: Beschriften und positionieren
.Text = ""
.ForeColor = Color.Black
.Size = New Size(54, 39)
.Location = New Point(182, 66 + i * 1 * .Height)
.Visible = True
.BorderStyle = BorderStyle.FixedSingle
.TextAlign = ContentAlignment.MiddleCenter
End With
Next i
End Sub
Private Sub Lbround1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Me.Click
Dim buffer As Integer
ReadProcessMemory(CInt(processHandle), &H624BCC, buffer, 4, 0) '
' auslesen Rundenanzeige
[u]lbArray(CInt(CStr("Lbround"))).Text = CStr(buffer)
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
TabIndex += TabIndex
[u]If TabIndex >= score.Count - 1 Then TabIndex = 0
second = second + 1
If second >= 10 Then
Timer1.Stop() 'Stoppt Timer
End If
End Sub
End Class Bei den unterstrichenen Zeilen scheinen Fehler zu sein. Mit der anderen Deklaration geht es gar nicht, da er den Index in den Verwaltungsinformationen nicht möchte, deshalb der TabIndex.
Im Label zeigt es so auch erst mal nichts an, geschweige, das es zum nächsten geht?????
Kann ich überhaupt so ein Label dann ansprechen????
Wo ist da jetzt der Fehler???( außer bei mir):confused
Beitrag wurde zuletzt am 12.12.17 um 20:05:34 editiert. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: sv00010 | Datum: 12.12.17 21:22 |
| Erwin1 schrieb:
Zitat: | |
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
TabIndex += TabIndex
If TabIndex >= score.Count - 1 Then TabIndex = 0 | |
Ich vermute mal, statt TabIndex muss es dort LabelIndex heißen.
Zitat: | |
lbArray(CInt(CStr("Lbround"))).Text = CStr(buffer) | |
Statt diesem, dann einfach nur:
lbArray(LabelIndex).Text = CStr(buffer) | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Erwin1 | Datum: 12.12.17 21:54 |
| @ sv00010, so hatte es mir Manfred ja schon geschrieben. Nur hatte ich erwähnt, das dieses leider nicht funktioniert und mir angezeigt wird, das es nicht deklariert wurde. Deswegen habe ich dort TabIndex geschrieben. Außer das da alles gut ist, passiert aber auch nicht mehr | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: sv00010 | Datum: 12.12.17 22:35 |
| Ich denke es wird das beste sein, dass gesamte Projekt in einen zip-Ordner zu verpacken und hier zum Download anzubieten.
Das ist zur Zeit mehr raten, als alles andere. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Manfred X | Datum: 13.12.17 15:07 |
| Vielleicht hilft dieses Beispiel weiter?
Den Code in ein frisches Windows.Forms.Form kopieren
(Name: frmShowSomeThing)
Keine Labels auf das Formular ziehen !!!!
Public Class frmShowSomething
Dim labelindex As Integer = 0
Dim lblDisplay As New List(Of Label)
Dim WithEvents timDisplay As New Timer With {.Interval = 5000}
Dim WithEvents timShow As New Timer With {.Interval = 1000}
Private Sub frmShowSomething_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Labels erstellen und positionieren
For i As Integer = 0 To 3
lblDisplay.Add(New Label With {.Parent = Me, _
.Top = i * 30, .Width = 300, _
.BackColor = Color.White, _
.BorderStyle = BorderStyle.FixedSingle})
Next i
timDisplay.Enabled = True
timShow.Enabled = True
lblDisplay(labelindex).BackColor = Color.Yellow
End Sub
Private Sub timDisplay_Tick(sender As Object, _
e As System.EventArgs) Handles timDisplay.Tick
'Auf nächstes Label umschalten
lblDisplay(labelindex).BackColor = Color.White
labelindex += 1
If labelindex >= lblDisplay.Count Then labelindex = 0
lblDisplay(labelindex).BackColor = Color.Yellow
End Sub
Private Sub timShow_Tick(sender As Object, _
e As System.EventArgs) Handles timShow.Tick
'Etwas im aktuellen Label anzeigen
lblDisplay(labelindex).Text = Now.ToString
End Sub
End Class
Beitrag wurde zuletzt am 13.12.17 um 15:11:16 editiert. | |
Re: Nach Time_Tick zum nächsten Label | | | Autor: Erwin1 | Datum: 13.12.17 19:58 |
| Hallo Manfred,
genau in dem Prinzip soll es ablaufen. Super Arbeit, [u]herzlichen Dank.
Jetzt bräuchte ich nur nochmal das selbe rechts davon und das ich da jeweils die Daten der ausgelesenen Prozesse (ReadProcessMemory(CInt(processHandle), &H624BCC, buffer, 4, 0)
' auslesen Rundenanzeige
und ReadProcessMemory(CInt(processHandle), &H624BDC, buffer1, 4, 0) '
' auslesen Punkte Player 1
reinbekomme. Linkes Feld -Runde / Rechtes Feld -Punkte
Ich bin am basteln | |
Bei neuer Runde zum nächsten Label-Paar | | | Autor: Manfred X | Datum: 13.12.17 23:14 |
| Muß das ganze nicht so gestaltet sein, daß die
Label jeweils erst nach Ablauf einer Runde wechseln
und während der Runde der Runden-Score hochgesetzt wird.
Ich simuliere Deine Process-Abfragen durch zwei
Variablen sim_round, sim_score, deren Werte ein Timer ändert.
Public Class frmSimulation
'===============================================================
'Simulation
'===============================================================
Dim sim_round As Integer, sim_score As Integer
Dim WithEvents timSimulation As New Timer With {.Interval = 1000}
Private Sub timSimulation_Tick(sender As Object, _
e As System.EventArgs) Handles timSimulation.Tick
'Hier wird der Fortschritt des Rennens simuliert
Dim rndm As New Random
If rndm.NextDouble > 0.9 Then
'neue Runde
sim_round += 1 : sim_score = 0
Else
'aktuelle Runde fortsetzen (Score erhöhen)
sim_score += rndm.Next(0, 6)
End If
End Sub
'===============================================================
Const LabelCount As Integer = 5
Const LabelWidth As Integer = 200
Dim lblRound As New List(Of Label)
Dim lblScore As New List(Of Label)
Dim Labelindex As Integer = 0
Dim WithEvents timDisplay As New Timer With {.Interval = 500}
Private Sub frmSimulation_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Height = LabelCount * 30 + 60
Me.Width = LabelWidth * 2 + 20
'Labels erstellen und positionieren
For i As Integer = 0 To LabelCount - 1
lblRound.Add(New Label With _
{.Parent = Me, .Top = i * 30, .Width = LabelWidth})
lblScore.Add(New Label With _
{.Parent = Me, .Top = i * 30, .Width = LabelWidth, _
.Left = LabelWidth + 10})
Next i
'Simulation starten
timSimulation.Enabled = True
'Anzeige initialisieren
lblRound(Labelindex).Text = sim_round.ToString
lblScore(Labelindex).Text = sim_score.ToString
lblRound(Labelindex).BackColor = Color.Yellow
lblScore(Labelindex).BackColor = Color.Yellow
'Anzeige starten
timDisplay.Enabled = True
End Sub
Private Sub timDisplay_Tick(sender As Object, _
e As System.EventArgs) Handles timDisplay.Tick
If CInt(lblRound(Labelindex).Text) <> sim_round Then
'Neue Runde -> aktuelles Labelpaar Farbe zurücksetzen
lblRound(Labelindex).BackColor = Color.White
lblScore(Labelindex).BackColor = Color.White
Labelindex += 1
If Labelindex = lblRound.Count Then Labelindex = 0
'Nächstes Runden-Label füllen
lblRound(Labelindex).BackColor = Color.Yellow
lblScore(Labelindex).BackColor = Color.Yellow
lblRound(Labelindex).Text = sim_round.ToString
End If
'Scorelabel stets füllen
lblScore(Labelindex).Text = sim_score.ToString
End Sub
End Class | |
Re: Bei neuer Runde zum nächsten Label-Paar | | | Autor: Erwin1 | Datum: 14.12.17 18:31 |
| Hallo Manfred,
das ist so genial und das Programm wird immer besser. Ich komme fast nicht hinterher, all Deine Lösungsansätze zu verarbeiten, aber es wird immer besser.
Habe gestern noch das andere alles verarbeitet und es funktioniert bisher tadellos. Vielen herzlichen Dank nochmal an dieser Stelle. Hätte ich ohne Deine Hilfe nicht geschafft.
Aus Deiner Simulation kann ich auch einen Teil verwenden, nur das Finale soll dann nicht über einen Timer gelöst werden. Der war nur für die Simulation gedacht. Aber das Prinzip ist in etwa so. Schlussendlich, da es sich um eine Anzeige für vier Player handeln soll, erstmal die Abfrage der Player( wieviel Punkteanzeigen werden überhaupt benötigt) und da ich die Player, Rundenzahl wie auch die Punkte mit einem Prozess auslese, das er solange die Punkte hoch zählt, bis die Rundenzahl um eins erhöht wird und anhand der Playeranzahl, wohin gezählt werden soll( in welche Punktespalte).
Da werde ich wahrscheinlich nochmal Hilfe brauchen
Beitrag wurde zuletzt am 14.12.17 um 18:32:58 editiert. | |
Re: Bei neuer Runde zum nächsten Label-Paar | | | Autor: Erwin1 | Datum: 17.12.17 19:32 |
| Habe jetzt erst mal alles so hingebracht, wie es werden soll. Nun hänge ich wie schon gedacht an der nächsten Stelle. Habe versucht, eine Abfrage unter Playernamen2 zu starten ( ist auskommentiert und unterstrichen), das wenn da kein Text steht, er die weiteren Label gar nicht erst erstellt soll. Aber trotz da ein Name stehen müsste, weil der in der .ini ja vorhanden ist, erstellt er nur die vor dem???
Weiß da jemand einen Rat?? | |
Re: Bei neuer Runde zum nächsten Label-Paar | | | Autor: Erwin1 | Datum: 17.12.17 19:34 |
| Private Sub frmShowSomething_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'RundenLabel erstellen und positionieren
For i As Integer = 0 To 10
lbround.Add(New Label With {.Parent = Me, _
.Size = New Size(54, 39), .Location = New Point(16, _
66 + i * 1 * .Height), _
.BackColor = Color.White, _
.BorderStyle = BorderStyle.FixedSingle,
.TextAlign = ContentAlignment.MiddleCenter,
.Font = New Font("Microsoft San Serif", 14, _
FontStyle.Bold)})
Next i
timDisplay.Enabled = True
timShow.Enabled = True
lbround(labelindex).BackColor = Color.Yellow
' Label Name Player 1 erstellen und positionieren
Dim name1 As String
name1 = GedPrivateProfileString("Players", "1", "", ".\Einstellung.ini")
For i As Integer = 0 To 0
Playername1.Add(New Label With {.Parent = Me, _
.Size = New Size(164, 44), .Location = New Point( _
134, 9 + i * 1 * .Height), _
.Name = "Playername1", _
.BackColor = Color.Gold, _
.BorderStyle = BorderStyle.FixedSingle,
.TextAlign = ContentAlignment.MiddleCenter,
.Font = New Font("Microsoft San Serif", 14, _
FontStyle.Bold),
.Text = name1})
Next i
'Punkte Player1 erstellen und positionieren
For i As Integer = 0 To 10
lbscore.Add(New Label With {.Parent = Me, _
.Size = New Size(54, 39), .Location = New Point(182, 66 _
+ i * 1 * .Height), _
.BackColor = Color.White, _
.BorderStyle = BorderStyle.FixedSingle,
.TextAlign = ContentAlignment.MiddleCenter,
.Font = New Font("Microsoft San Serif", 14, _
FontStyle.Bold)})
Next i
timDisplay.Enabled = True
timShow.Enabled = True
lbscore(labelindex).BackColor = Color.Yellow
' Label Name Player 2 erstellen und positionieren
Dim name2 As String
name2 = GedPrivateProfileString("Players", "2", "", ".\Einstellung.ini")
[u] 'Dim c As Control = Me.Controls("Playername2") 'auf Eintrag prüfen _
[u] 'If Me.Controls("Playername2").Text = Text Then
For i As Integer = 0 To 0
Playername2.Add(New Label With {.Parent = Me, _
.Size = New Size(164, 44), .Location = New Point( _
320, 9 + i * 1 * .Height), _
.Name = "Playername2", _
.BackColor = Color.Gold, _
.BorderStyle = BorderStyle.FixedSingle,
.TextAlign = ContentAlignment.MiddleCenter,
.Font = New Font("Microsoft San Serif", 14, _
FontStyle.Bold),
.Text = name2})
Next i
'Else
'End If
'Punkte Player2 erstellen und positionieren
For i As Integer = 0 To 10
lbscore1.Add(New Label With {.Parent = Me, _
.Size = New Size(54, 39), .Location = New Point(372, 66 _
+ i * 1 * .Height), _
.BackColor = Color.White, _
.BorderStyle = BorderStyle.FixedSingle,
.TextAlign = ContentAlignment.MiddleCenter,
.Font = New Font("Microsoft San Serif", 14, _
FontStyle.Bold)})
Next i
timDisplay.Enabled = True
timShow.Enabled = True
lbscore1(labelindex).BackColor = Color.Yellow
Beitrag wurde zuletzt am 17.12.17 um 19:36:19 editiert. | |
Re: Bei neuer Runde zum nächsten Label-Paar | | | Autor: Erwin1 | Datum: 18.12.17 09:08 |
| Habe es selbst herausgefunden, trotzdem DAnke | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|