Announcement

Collapse
No announcement yet.

Ermitteln des ersten DS der im DBCtrlGrid angezeigt ist

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

  • Ermitteln des ersten DS der im DBCtrlGrid angezeigt ist

    Hallo,

    Zur Synchronisation der angezeigten Daten eines DBCtrlGrids mit einem Diagramm, in dem nur Werte angezeigt werden sollen, die auch aktuell im Grid angezeigt werden, benötige ich das Ereignis, das beim Scrollen im Grid ausgelöst wird sowie den ersten angezeigten Datensatz um auf die Änderung reagieren zu können.

    Wer kann mir weiterhelfen???

    Gruß, Heike

  • #2
    Hallo Heike,

    ein Ereignis das direkt auf das Scrollen im DBGrid zugeschnitten ist gibt es meines Wissens nicht. Du kannst aber das Ereignis OnDrawColumnCell "mißbrauchen". Dies wird immer dann aufgerufen, wenn sich an der Darstellung des DBGrid etwas ändert, also neue Zeile markiert oder eben auch ein Scroll. In der OnDrawColumnCell rufst Du die Methode DefaultDrawColumnCell auf, um die Standardzeichnung des DBGrid zu realisieren und plazierst danach Deinen Code für das Diagramm.
    Die erste angezeigte Zeile wird in der Eigenschaft TopRow des DBGrid gespeichert.

    Gruß, Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      danke für den Tipp!
      Allerdings gibt es das Ereignis OnDrawColumnCell nicht im DBCtrlGrid. Auch die Eigenschaft TopRow ist nicht vorhanden.
      Wie könnte ich stattdessen vorgehen?

      Gruß, Heik

      Comment


      • #4
        ... man sollte eben richtig lesen :-( ..
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          <p>Hallo Heike,<br>
          <br>
          ich gehe einmal davon aus, dass das CtrlGrid mit einer Datasource verbunden ist. Wenn ja, dann kannst Du das Ereignis "OnDataChange" der DataSource benutzen.<br>
          <br>
          Gruß Thomas</p&gt

          Comment


          • #6
            Danke, Thomas.

            Aber wie finde ich heraus, welcher Datensatz denn nun als erster jeweils im Grid angezeigt wird? Denn letztendlich wird das Ereignis "OnDataChange" ja bei jedem Manöver in der Datenmenge ausgelöst. Es muss doch eigentlich ein Ereignis geben, das auch Delphi-intern das Neuzeichnen (Scrollen) des DBCtrlGrids auslöst, sowie ein Hinweis auf den ersten Datensatz, der angezeigt wird, der sich ja vom ersten DS der Datasource unterscheiden kann.
            Müsste es hierfür nicht eigentlich eine popel-einfache Lösung geben ??? ;-)

            Gruß, Heik

            Comment


            • #7
              Hallo Heike,

              ich habe mir die Hilfe zum DBCtrlGrid nochmal angesehen. Es gibt dort ein Ereignis OnPaintPanel - dieses könnte man sicherlich benutzen, um rauszukriegen wann sich im DBCtrlGrid etwas ändert (Scrollen o.ä.). Die Eigenschaft PanelIndex gibt das aktuell ausgewählte Panel (aktueller Datensatz) an - ist also sozusagen ein Offset zum Anfang des DBCtrlGrid. Aus dem aktuellen Datensatz (aus der DataSource) und PanelIndex kannst Du also schließen, welcher Datensatz als erster im DBCtrlGrid steht. Das ist jetzt reine Theorie und ich habe es noch nicht ausprobiert aber es könnte Dein Problem lösen!?

              Gruß Fal
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk, danke für Deinen Hinweis!

                Habe schon öfter mal mit dem Ereignis OnPaintPanel gearbeitet, aber dabei festgestellt, dass dieses Ereignis so oft ausgelöst wird, dass es die Verarbeitungsgeschwindigkeit doch ziemlich verlangsamt. Außerdem finde ich doch, es ist ein ziemlicher Hinkefuß, wenn ich auf Daten (nämlich die der ersten angezeigten Gridzeile) über Fünf Ecken und einem Locate in der Datenmenge zugreifen muss, die doch eigentlich direkt vor meiner Nase vorhanden sein müssten...(Gibt es keinen Werte-Array für das Grid, das man einfach auslesen kann?) <br>
                Nun habe ich versucht, meine Daten über ein DBGrid anzuzeigen und das Ereignis OnDrawColumnCell zu nutzen. Dabei sind folgende Progleme aufgetreten:

                1. Die Eigenschaft TopRow finde ich nicht...

                2. Ich muss für jeden Eintrag in einer Spalte eine andere Hintergrundfarbe der Zelle setzen - abhängig vom zugehörigen Feldwert. <br>
                Z.B. Wert = 1 -> Color = rot, Wert = 2 -> Color = gelb etc.<br>
                Doch die Farbe wird immer für die nächste Zeile gesetzt...

                Gibt es nicht ein simples Beispiel, nach dem ich mich richten könnte???

                Gruß, Heik

                Comment


                • #9
                  Hallo Heike,

                  zu dem ersten Problem: Ich habe noch mal den Quelltext durchgesehen, wo ich sowas ähnliches schon mal gemacht habe. Es war dann doch etwas komplizierter. Ich stand vor dem Problem das ich rausbekommen mußte in welcher Zeile der Anwender per Drag and Drop einen Eintrag hat fallenlassen - also welche Zeile im DBGrid repräsentiert den meinen aktuellen Datensatz. Mit den Eigenschaften des DBGrid ist das meiner Meinung nicht machbar. Ich habe mir deshalb eine Neue Klasse von TDBGrid abgeleitet und dort die ursprünglich von TCustomGrid als Protected vererbte Eigenschaft ROW über Public sichtbar gemacht.:

                  type<br>
                  TDragDBGrid = class(TDBGrid)<br>
                  public<br>
                  { Public-Deklarationen }<br>
                  property Row;<br>
                  end;<br>

                  In dieser Klasse TDragDBGrid hatte ich dann die Eigenschaft Row zur Verfügung, die den aktuell selektierten Datensatz als Offset zur Ersten Zeile darstellt. Wenn also Row bspw. 5 ist, und Dein DBGrid kann 10 Datensätze anzeigen, dann weißt Du, das Du vom aktuellen Datensatz aus 4 Datensätze vorher und 5 Datensätze nachher in Deinem Diagramm anzeigen mußt.

                  Zum zweiten:<br>

                  procedure TMainForm.grd_SendungDrawDataCell(Sender: TObject;<br>
                  const Rect: TRect; Field: TField; State: TGridDrawState);<br>
                  var<br>
                  Bitmap : TBitmap;<br>
                  begin<br>
                  if IsStatFlagSet(DB_SendungStat.Value, st_Termin) then with grd_Sendung.Canvas do<br>
                  begin<br>
                  if DB_SendungTermin_D.Value - DB_SpbCarrierDate.Value > 1 then<br>
                  Font.Color := clMaroon<br>
                  else Font.Color := clRed;<br>
                  if DB_SendungTermin_D.Value - DB_SpbCarrierDate.Value < 0 then<br>
                  begin<br>
                  Bitmap := bmp_TerminHot;<br>
                  Font.Style := Font.Style + [fsBold];<br>
                  end<br>
                  else Bitmap := bmp_Termin;<br>
                  end<br>
                  else begin<br>
                  Font := grd_Sendung.Font;<br>
                  Bitmap := nil;<br>
                  end;<br>
                  if Field.FieldName = 'STAT' then with grd_Sendung.Canvas do<br>
                  begin<br>
                  Brush.Color := grd_Sendung.FixedColor;<br>
                  FillRect(Rect);<br>
                  Draw(Rect.Left + 2, Rect.Top + 1, Bitmap);<br>
                  end<br>
                  else grd_Sendung.DefaultDrawDataCell(Rect, Field, State);<br>
                  end;<br>

                  Das Bsp. demonstriert, wie Du in einem DBGrid Einträge in unterschiedlichen Farben und Felder (z.B. Statusfelder) auch mit einem Symbol (hier als kleines Bitmap) darstellen kannst.

                  Ich hoffe das hilft Dir erst mal weiter. :-)

                  Gruß Fal
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment

                  Working...
                  X