Problem mit Label.Caption

  • VB6

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gloem.

    Problem mit Label.Caption

    Ich hab ein kleineres Problem mit der Beschriftung meines Labels:

    Zur Laufzeit wird dort die Beschriftung nicht geändert, wenn ich im debuggmodus bin und an der Stelle einen Breakpoint setze wird er jedoch geändert. Woran kann das liegen?

    Visual Basic-Quellcode

    1. ' Setzen des Status
    2. Form_Laengstprofil.L_TS_Status.Caption = "Eintragen in Listbox"
    3. ' Bei Fehler -> Sprung zur Fehlermarke
    4. On Error GoTo err_datenbank_tss
    5. With recordset
    6. ' An den Anfang springen
    7. If (.RecordCount > 0) Then
    8. .MoveFirst
    9. End If
    10. ' Setzen des Fortschrittbalkens
    11. Form_Laengstprofil.Pb_TS_Fortschritt.Value = 0
    12. Form_Laengstprofil.Pb_TS_Fortschritt.max = .RecordCount
    13. ' Leeren der Listbox
    14. Form_Laengstprofil.Lb_TS_TSPunkte.Clear
    15. ' Eintragen aller TS-Punkte in das Listenfeld (NameTS, X, Y, Kilometrierung, [Handle])
    16. Do While Not (.EOF)
    17. Form_Laengstprofil.Lb_TS_TSPunkte.AddItem (.Fields("NameTS"))
    18. Form_Laengstprofil.Lb_TS_TSPunkte.List(Form_Laengstprofil.Lb_TS_TSPunkte.ListCount - 1, 1) = Format(.Fields("X"), "0.000")
    19. Form_Laengstprofil.Lb_TS_TSPunkte.List(Form_Laengstprofil.Lb_TS_TSPunkte.ListCount - 1, 2) = Format(.Fields("Y"), "0.000")
    20. Form_Laengstprofil.Lb_TS_TSPunkte.List(Form_Laengstprofil.Lb_TS_TSPunkte.ListCount - 1, 3) = Format(.Fields("Kilometrierung"), "0.000")
    21. Form_Laengstprofil.Lb_TS_TSPunkte.List(Form_Laengstprofil.Lb_TS_TSPunkte.ListCount - 1, 4) = .Fields("Handle")
    22. Form_Laengstprofil.Pb_TS_Fortschritt.Value = Form_Laengstprofil.Pb_TS_Fortschritt.Value + 1
    23. .MoveNext
    24. Loop
    25. End With
    26. ' Löschen des Status
    27. Form_Laengstprofil.L_TS_Status.Caption = ""
    28. 'Zurücksetzen des Fortschrittbalkens
    29. Form_Laengstprofil.Pb_TS_Fortschritt.Value = 0
    30. ' Bei Fehler -> Normales Verhalten
    31. On Error GoTo 0
    Hallo, Gloem.

    Erstmal: Herzlich Willkommen im VB Paradise-Forum!

    Leider werde ich aus deiner Fehlerbeschreibung nicht so wirklich schlau. Von welchem Label wird der Inhalt zur Laufzeit nicht geändert und im Debug-Modus schon? In deinem Quellcode kommt zweimal das Label L_TS_Status vor und an beiden Stellen wird der Inhalt geändert. Insofern würde ich mir eine genauere Schilderung deines Problems wünschen (ggf. mit Screenshots).

    mfG

    Malcolm
    Ich bin mir ziemlich sicher, dass es sich um

    Visual Basic-Quellcode

    1. Form_Laengstprofil.L_TS_Status.Caption = "Eintragen in Listbox"
    handelt. Du musst unter diese Zeile ein

    Visual Basic-Quellcode

    1. DoEvents
    schreiben, da das Fenster sonst nicht neu gezeichnet wird.
    Danke für die Antworten.

    Genau um das Label handelt es sich. In meinem Formular sind noch weitere Objekte aber das ganze tut ja nicht viel zur Sache von daher hab ich es weggelassen. Bei der normalen Ausführung der obigen Methode funktioniert das Programm nur eben ohne die Beschriftung des Labels zu ändern. Wenn ich einen Haltepunkt an der Stelle mit dem label.caption setze dann ändert sich das Label jedoch. Wenn ich dann auch noch einen Haltepunkt an der zweiten Stell mit dem label.caption setze wird es auch wieder zurückgesetzt, ohne Haltepunkt nicht.

    Von einem DoEvent hab ich noch nie was gehört. Warum sollte ich es da ausführen? Ich mach das ja auch nicht nachdem ich einen Button mit enable oder mit caption änder und das funktioniert ja auch.

    Ach ja, das ganze wird in AutoCad ausgeführt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gloem“ ()

    Hi!

    Bei Windows funktionieren Fenster mit sogenannten 'Windows Messages', die sagen, was passiert ist. z.B. Buttonklick, Texteingabe oder eben Text in Label geändert. Wenn der Text in nem Label geändert wurde, muss das Label neu gezeichnet werden, bevor du die Änderung siehst. Mit DoEvents bringtst du VB dazu, dass es diese Messages abruft und abarbeitet; wenn du vorher den Label-Text geändert hast, ist eine Message dabei, die VB zum neuzeichnen der Form bringt.

    Indirekt gesehen, bewirkt hier DoEvents also nix anderes als, dass die Form neu gezeichnet wird und der geänderte Text somit angezeigt wird.
    Wenn du kein DoEvents einfügst, wird die Nachricht erst nach beenden der aktuellen Sub abgerufen und zu dem Zeitpunkt ist das Label schon wieder leer.

    Ach ja, das ganze wird in AutoCad ausgeführt
    Dann hättest du eigentlich in den VBA-Bereich (Visual Basic for Applications) posten müssen, es handelt sich ausnahmsweise aber um ein allgemeines VB-Problem.
    Da acad, soweit ich weiß, eine vollständige VBA-Implementation hat, gibt es auch dort sicherlich DoEvents :)
    Danke für die Erklärung. Kann das leider erst am Montag ausprobieren.

    Also versteh ich das jetzt richtig:
    VB zeichnet nach jeder Funktion oder Methode das Formular neu.
    Will ich zur Laufzeit der Methode oder Funktion etwas ändern und am Ende erneut, muss ich beim ersten Mal ein DoEvent aufrufen damit das Formular neu gezeichnet und die Änderung sichtbar wird. Das ganze ist dann bestimmt bei Labels, Buttons etc. nötig jedch nicht bei ProgressBars, oder?
    Hi!

    Nach beenden einer Sub (also wenn du in keiner Sub bist), befindet sich VB im Leerlauf. Der Leerlauf ist eine Endlosschleife, die immer wieder DoEvents ausführt und dann wartet. Wenn du ein Label änderst, kommt eine Message, dass das Label geändert wurde.
    Im Leerlauf oder wenn du DoEvents verwendest, rufst VB diese Nachricht ab und, wenn eine "... wurde geändert" dabei ist, zeichnet VB das Fenster eigenständig neu. Wenn in der Sub nix geändert wird, zeichnet VB das Fenster auch nicht neu, wenns im Leerlauf ist.

    Bei einer Progressbar musst du das eigentlich auch machen, wenn sie innerhalb von einer Sub mehrmals bearbeitet wird (z.B. eine Schleife von 0 auf 100). Dort packst du das DoEvents am besten in die Schleife rein.


    PS: mit 'VB' meine ich hier den Teil deines Programms, den VB fertig zu Verfügung stellt. In C++ muss man diese Leerlauf-Schleife bspw. selbst programmieren.
    Hey Gloem,

    was Mad Andy da so schön erklärt ist im Prinzip alles richtig, aber um ein Label dazu zu bringen, dass es das anzeigt, was es soll, braucht man nicht gleich die Kontrolle WINDOWS (was man ja mit DoEvents tut) zu überlassen.
    Für solche Fälle steht in VB fast für jedes Steuerelement die Refresh-Methode zur Verfügung. Sie erzwingt (also bevor weiterer Code ausgeführt wird) eine vollständige Neudarstellung eines Steuerelements (oder auch eines Formulars).
    Versuchs mal so:

    Visual Basic-Quellcode

    1. Form_Laengstprofil.L_TS_Status.Caption = "Eintragen in Listbox"
    2. Form_Laengstprofil.L_TS_Status.Refresh
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    Hey Gloem,

    programmierst Du mit VB6 oder mit VBA?

    Wenn Du mit VB6 programmierst, dann muss Dein Label die Refresh-Methode besitzen - oder hat jemand anderer aus dem Forum schon mal etwas von 'refreshlosen' Labels gehört? Wenn ja, dann würde mich schon interessieren, wann bzw. unter welchen Umständen dies auftritt!

    mfg DHB