Announcement

Collapse
No announcement yet.

DBCtrlGrid - Probleme Delphi 5

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBCtrlGrid - Probleme Delphi 5

    Wird während der Eingabe in ein DBCtrlGrid (Delphi 5) auf die darunter liegende Tabelle ein Post ausgelöst, "verschwindet" der Cursor und zeigt nicht mehr an, in welchem Tabellenfeld er aktiv ist. Der Cursor erscheint auch dann nicht, wenn die Tabelle mit Edit wieder in den Edit-Modus versetzt wird.

  • #2
    Hallo,

    den Effekt kann ich reproduzieren - es gibt allerdings einen einfachen Workaround dafür:
    <pre>
    procedure TForm1.Table1AfterPost(DataSet: TDataSet);
    begin
    DBEdit1.SetFocus;
    end;
    </pre>
    Für das Ereignis <b>AfterPost</b> der Datenmenge (TTable) wird eine Ereignisbehandlungsmethode angelegt und dort der Fokus auf das erste Eingabefeld im TDBCtrlGrid gesetzt

    Comment


    • #3
      Ansich richtig. Allerdings noch nicht die Lösung meines Problemes. Dazu kurz mehr:
      Für eine Auftragsverarbeitung sind in dem DBCTRLGrid Felder wie Anzahl, Nettopreis, Bruttopreis und Artikelnummer vorgesehen. Beim Verlassen des Feldes "Anzahl" muß nun natürlich der Nettopreis/Bruttopreis neu kalkuliert werden. Um sicher zu sein, daß die Routine, die die Werte kalkuliert auch die richtigen Werte erhält, wird mit einem Post die Datenbank "eingefroren" (ohne post kam es gelegentlich zu "Rechenfehlern"). Die Rechenroutine ist jeweils an das "OnExit"-Ereignis angehängt, um immer beim Verlassen ein Berechnen der neuen Werte zu generieren. In manchen Fällen wurde auch ein "OnEnter"-Ereignis an das Feld gehängt, um bestimmte Vorgaben zu machen, wenn das Feld betreten wird (Beispiel: wenn die Artikelnummer sich nicht ändert, braucht auch nicht upgedatet zu werden...). Tritt nun das Phänomen auf, daß der Cursor verschwindet, wird auch z. B. das OnExit-Ereignis bzw. OnEnter-Ereignis nicht angesprungen. Ansonsten wäre das mit dem SetFocus kein problem, da ich ja dann in der "OnExit" schauen kann, welches Feld als nächstes angesprungen werden würde und dementsprechend reagieren kann bzw. beim OnEnter ein SelectAll machen könnte, um den Cursor sichtbar zu machen. Aber dat geht leider nicht..

      Comment


      • #4
        <p>Hallo Markus,<br>
        <br>
        wenn sich die Position und Anzahl nach dem Post nicht ändert, kannst Du den aktuellen Datensatz<br>mit einem Bookmark merken. Nach erfolgtem Post, kannst Du dann mit GotoBookmark wieder zu dem Datensatz<br>an dem der Cursor positioniert war, springen.<br>
        <br>
        Gruß Thomas<br></p&gt

        Comment


        • #5
          Hallo,

          die grundlegende Frage ist, bei welchem Ereignis die Berechnungen durchgeführt werden. Wenn die berechneten Werte in die Datenbank geschrieben werden, würde ich alle Berechnungen nicht an die visuellen Controls (DBEdit etc.) hängen, sondern an die Ereignisse der Datenquelle (<b>BeforePost</b>, <b>OnCalcFields</b>, <b>OnUpdateData</b> oder <b>OnDataChange</b>). Somit spielt es keine Rolle mehr, wie sich die sichtbaren Controls verhalten - die Integrität der Datenbank wird in jedem Fall auch dann sichergestellt, wenn die visuellen Controls noch einige Bugs haben.

          Gerade das Ereignis <b>OnDataChange</b> sollte am besten für diesen Fall geeignet sein: "<i>Das Ereignis OnDataChange wird ausgelöst, wenn der aktuelle Datensatz geändert wurde und in der Anwendung von einem Feld bzw. Datensatz zu einem anderen der zugeordneten Datenmenge gewechselt wird.</i>&quot

          Comment

          Working...
          X