vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 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

VB.NET - Ein- und Umsteiger
Nach 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Re: Bei neuer Runde zum nächsten Label-Paar 
Autor: Erwin1
Datum: 18.12.17 09:08

Habe es selbst herausgefunden, trotzdem DAnke
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