Listbox Adressbuch

  • VB6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MiNe93.

    Listbox Adressbuch

    Hallo,

    ich hab da für euch wahrscheinlich ein einfaches Problem.

    Ich hab ein Adressbuch erstellt bzw. möchte eins erstellen.
    Als erstes habe ich mir dann ein paar Felder erstellt, wo man Daten (Name usw.) eingeben kann und die sind auch schon mit einer Access-Datenbank verknüpft. Ich kann bearbeiten, löschen, hinzufügen..

    Jetzt möchte ich folgendes machen:

    Meine Einträge sind in einer Listbox gelistet.

    Klicke ich auf einen Eintrag in der Listbox, werden die Daten übertragen und angezeigt - alles wunderbar.

    Jetzt soll es so, dass wenn ich irgendwas änder und auf den nächsten Listboxeintrag klicke eine Meldung kommt "Möchten Sie die Änderung speichern?".

    Also:

    - Klick von einen Eintrag auf einen anderen (Klick auf Listeneintrag der ungleich dessen ist, auf dem ich mich gerade befinde)

    - Prüfe: Hat sich was verändert?

    Wenn ja: "Möchten Sie die Änderung speichern?", [Ja oder Nein]?

    Wenn ja: speichern und weiter zum angeklickten Eintrag

    Sonst: weiter zum angeklickten Eintrag

    Sonst: weiter zum angeklickten Eintrag

    Den Fettmarkierten Text brauch ich jetzt nur noch in Programmiercode :D

    Danke schonmal!
    Globale boolsche Variable deklarieren. In den Textfeldern wenn sich was ändert (Text_Change Event) die Variable auf True setzten.

    Listbox Index_Changed Event prüfen ob die Variable auf True ist, ist dies der Fall, List Index zurück auf den davor gewählten setzten, Messagebox ausgeben ob die Daten gespeichert werden sollen.

    PS: Unter VB6 heißen die Events evlt. anders, kann das gerade nicht nachprüfen, aber der Ablauf bleibt trotzdem der gleiche.
    ah stimmt, kleiner Denkfehler meiner seits. Früher habe ich sowas mit noch einer Variablen gelöst, die auf False gesetzt wurde wenn ein Datensatz geladen wird und danach wieder auf True, im Text_Change prüft man dann zunächst ob die Variable False ist, wenn ja wird die andere Variable nicht gesetzt weil es sich ums Laden handelt.

    Besser ist denke ich jedoch wenn du anstatt des Text_Change Events, das KeyPress Event nimmst. Vlt sogar noch besser, wenn du alle Werte die aus der DB gelesen werden in einem Array zusätzlich mitspeicherst und beim Index wechsel prüfst du die Einträge in der Textbox mit den original Datern aus dem Array, wenn etwas ungleich ist, wurde es geändert und die MsgBox poppt auf.

    Du siehst es gibt viele Wege sowas zu realisieren, kannst dir einen aussuchen der dir am besten und vorallem für dich verständlich zum Umsetzten erscheint.

    Edit: das auch bereits bei VB6 die Textboxen über eine Tag-Eigenschaft verfügen, könntest du auch dort die ursprünglichen Daten reingschreiben, dann bräuchtest kein extra Array (was unter VB6 nämlich doof zu handeln ist).
    Es tut soweit, nur dass nicht gespeichert wird :D

    Ich glaube ich hänge an diesem Satz " List Index zurück auf den davor gewählten setzten" - kannst du mir ein Codebeispiel geben oder eine ganz andere Lösung, wenn ich auf dem Holzweg bin?

    EDIT: Ich muss ja, wenn ich "Möchten Sie speichern?" bestätige, auf den Eintrag (Index?) zurückspringen, von dem ich herkomme. Sonst beruht sich das speichern ja wieder auf den bereits angeklickten Eintrag und es verändert sich nichts - hab ich das so richtig?

    EDIT2:

    Ich hab mir das jetzt so aufgeschrieben:

    Bei Klick auf "Ja" -> zurück auf den alten Eintrag -> speichern -> zum angeklickten Eintrag -> Eintrag in der Listbox markieren (Dieser angeklickte Eintrag muss markiert sein, da man sonst wieder was ändern kann und das Programm beim Klick auf der Speichernschaltfläche einen Fehler meldet)

    Ist es und wie ist dies praktikabel?

    Am liebsten nur Denkanstöße :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MiNe93“ ()

    Nun zum einen könnte man das auch mir einer globalen Variablen lösen. Weiß nicht ob es EventArgs gibt, indem der zuvor angeklickte ListIndex gespeichert ist.

    Ansonsten eben im IndexChange-Event die Variable mit dem aktuellen ListIndex setzten. Nun änderst du etwas am Datensatz, klickst ein anderes Item an, nun wird der Code ausgeführt, welcher checkt ob Änderungen gemacht wurden, ist dies der Fall, wird die Messagebox ausgegeben. Wird dort Ja gewählt werden die Änderungen gespeichert und dann der neue Datensatz geladen und die Variable auf den neuen Index gesetzt. Wird nein gewählt, wird gleich der neue Datensatz gewählt. Wird Abbrechen gewählt, setzt du den ListIndex auf die Variable, die ja nun noch nicht verändert worden ist. Da hierbei natürlich auch wieder ein IndexChange Event gefeuert wird, musst du checken ob der aktuelle Index NICHT dem gespeicherten Index der Variable entspricht.

    Also PseudoCode etwa so

    Quellcode

    1. lIndex = -1
    2. Sub IndexChanged
    3. If Not listbox.index = lIndex Then
    4. ' Code um auf änderungen zu checken
    5. ' änderungen festgestellt
    6. result = MsgBox("Änderungen speichern?")
    7. if result = Yes Then
    8. ' Datensatz speichern
    9. end if
    10. if result = cancel then
    11. listbox.index = lIndex
    12. exit sub
    13. end if
    14. ' wenn No gewählt wurde
    15. ' Datensatz laden
    16. lIndex = listbox.index
    17. End If
    18. End Sub
    Danke dir ;)

    Ich hatte einen Speicher-Button, der nur aufpopt, wenn sich auch was geändert hat.

    Also war die globale boolsche Variable gar nicht mehr nötig, da man dies als Erkennungszeichen für eine Änderung nehmen konnte. Darauf muss man erstmal kommen.



    Nochmals danke für die HIlfe ;)