DBGrid und onscroll?



  • Im Prinzip möchte ich ein anderes Objekt verbergen, wenn die aktuelle Zeile durch Scrollen, oder eine Pfeiltaste verlassen wird. Erkennen, ob eine Pfeiltaste gedrückt wurde ist ja kein Problem. Nur zu erkennen wann gescrollt wurde schon. Jedenfalls für mich. Ich bin aber gerne offen für andere Ansätze.



  • Pat781 schrieb:

    mein nächstes Problem währe dann nur, dass dieses Ereignis auch ausgelöst wird, wenn das DBGrid neu gezeichnet wir.

    Habe ich im Zusammenhang mit dem AfterScroll-Ereignis noch nie erlebt. Beim DataChanged-Ereignis steht das ja in der Hilfe.

    Gruß,

    Alexander



  • Kann ich jetzt nix zu sagen, nur das es so leider nicht funktioniert. Liegt vielleicht an einer Nebenroutine, mit der ich eine zweite Liste abgleiche. In der Hilfe zu AfterScroll steht ja drinnen, dass dieses Ereignis auch ausgelöst wird, durch z.B. next,... Schätze mal, dass da das Problem liegt. Ich kann diese Routine aber nicht so einfach ändern, daher besteht bei mir weiterhin das selbe Problem.
    Vielleicht habt ihr ja noch einen Idee?

    Gruß Pat



  • Meinst Du mit Scrollen eigentlich "Auf den nächsten Datensatz im Grid wechseln" oder "Den Scrollbalken verschieben"?
    Dass das AfterScroll-Ereignis bei einem Datensatz-Wechsel, also auch bei First(), Next() usw. ausgelöst wird,
    ist mir schon klar. So wie Du es beschrieben hast, willst Du aber doch genau das, oder habe ich da was falsch
    verstanden?
    Wenn Du in Deiner "Nebenroutine" durch die Daten navigierst, navigierst Du natürlich auch automatisch im
    Grid - das ist ja eigentlich auch der Sinn der Sache. Wenn Du dabei das AfterScroll-Ereignis nicht behandeln
    möchtest, kannst Du's ja einfach vor der Routine ausblenden (Eigenschaft auf 0, bool-Variable etc.) und
    danach wieder aktivieren.

    Ansonsten wäre es vielleicht ganz gut, wenn Du mal etwas ausführlicher beschreiben könntest, was Du eigentlich
    machen willst. Vielleicht sogar mit etwas Quelltext?

    Gruß,

    Alexander



  • Ich mache im Prinzip einene Art Kalender. Er funktioniert auch. Dies soll nur eine art Update werden. Ich kann leider keine Codebeispiele geben, da mein Programm ca. 5000 Zeilen Code enthält.
    Ich versuche aber mein Problem nochmal deutlicher zu beschreiben:
    Ich habe ein DBGrid in welchem ich Datensätze habe und ich möchte automatisch erkennen, wenn die Zeile gewechselt wird, oder der Scroll Balken betätigt wird. Mit AfterScroll funktioniert dies leider nicht, da ich beim erzeugen der Liste den Fokus auf eine bestimmte Zeile legen muss. Wenn ich nun den Inhalt dieser Liste ändere (refresh) wird automatisch wieder ein AfterScroll Ereigniss gestartet, wegen der Postionierung.
    Ich brauche im Prinzip eine Idee oder Möglichkeit, wie ich erkenne wenn gescrollt wird oder eine Zeile gewechselt wird. Ich gebe zu das dies etwas ungeschickt ist. Ist aber leider aus anzeigetechnischen Gründen nicht wirklich besser realisierbar.

    Ich hoffe ich habe es nun besser erklärt.

    Pat



  • Ich kann mir zwar nur schwer vorstellen, dass das von Dir geschilderte Problem sämtliche 5000 Codezeilen
    betrifft, aber wie dem auch sei sollte die vorgeschlagene Lösung mit dem temporären Deaktivieren des
    Afterscroll-Ereignisses funktionieren.
    Optional könntest Du Dir natürlich auch noch die Ereignisse BeforeScroll, BeforeOpen und AfterRefresh
    anschauen, vielleicht helfen die Dir weiter.

    Gruß,

    Alexander



  • Das Problem betrifft natürlich nicht den gesamten Code.
    Hast du mir vielleicht auch einen guten Tipp, wie ich AfterScroll auch wieder aktiviere? Ich denke das müsste dann der richtige weg sein.

    Gruß Pat



  • Das Einfachste dürfte sein, mit einer Hilfsvarialbe zu arbeiten. Z.B. bool bAllowAfterScroll (unter private in Deinem Form). Im Konstruktor setzt Du Variable auf den passenden Wert (ich denke mal false dürfte hier richtig sein) und in OnShow als letztes setzt Du die Variable auf true.

    Zu Beginn der Methoden, in denen Du nicht willst, dass AfterScroll ausgeführt wird, setzt Du sie auf false, am Ende wieder auf true.

    In der AfterScroll fügst Du den Code in die Bedingung

    if (bAllowAfterScroll)
    {
      // Dein bisheriger Code
    }
    

    ein.



  • Die Alternative zur klassenweiten bool-Variable ist, die AfterScroll-Eigenschaft vorübergehend auf 0 zu setzen.
    Das könntest Du z.B. so machen:

    TDataSetNotifyEvent afterScroll = Query->AfterScroll; // Ursprüngliche Ereignisbehandlung merken
    Query->AfterScroll = 0; // AfterScroll-Ereignis "abschalten"
    try
    {
      // Hier alles machen, das ohne Auslösen des AfterScroll-Ereignisses gemacht werden muss
    }
    __finally
    {
      Query->AfterScroll = afterScroll; // AfterScroll-Ereignis wieder anschalten
      // Vielleicht soll das Ereignis anschließend noch einmal ausgelöst werden? Dann könnte man das so machen
      // if (afterScroll)
      //   afterScroll(Query);
    }
    

    Wenn Du das AfterScroll-Ereignis an mehreren Stellen abschalten willst, ist die bool-Variable wahrscheinlich
    der bessere Weg. Dann musst Du aber aufpassen, dass Du nicht irgendwo das Ereignis "aus Versehen" wieder
    anschaltest.

    Bei meinem Code sehe ich den Vorteil, dass alles was Du da mit dem An-/Abschalten anstellst wirklich nur
    an einer Stelle steht. Mir fällt es oft leichter den Code zu verstehen, wenn ich alles auf einmal sehe.

    Du könntest das ganze natürlich noch weiter treiben und verschiedene AfterScroll-Routinen einhängen - je
    nachdem, was Du gerade brauchst. Ob das dann aber übersichtlicher wird, ist zumindest fraglich...

    Gruß,

    Alexander



  • Perfekt, damit hats genau so hin gehauen, wie ich mir das vorgestellt habe. Ich dank euch für die schnelle Hilfe.

    Gruß Pat


Anmelden zum Antworten