Announcement

Collapse
No announcement yet.

Ende von OnDrawCell mitkriegen?

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

  • Ende von OnDrawCell mitkriegen?

    Hallo,

    eine Frage:
    Wie bekommt man im Stringgrid (Drawgrid) das Ende der Zeichenaktion (OnDrawCell) raus?
    Genauer gesagt, möchte ich eine bestimmte Aktion gleich im Anschluß an das Ende von OnDrawCell ausführen. Geht das?

    In OnDrawCell wird bei mir jede Zelle mehrmals gezeichnet. Ist das normal? (Wenn "ja", wie kann man das vermeiden?) Oder mache ich nur schlichtweg etwas falsch?

    Gruß
    Matthias

  • #2
    Hi

    Poste mal den Code des DrawCell Events. Ich vermute Du stellst solche Eigenschaften wie Brush.Color/Color/Font.Color ein. Dabei musst Du Vorsicht walten lassen, und genau wissen ob Du Canvas.Font.Color oder Grid.Font.Color einstellst. Im zweiten Falle würde nämlich das Grid beginnen sich immer wieder neuzuzeichen falls sich die Eigenschaft tatsächlich ändert.

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,

      ich arbeite eigentlich nur mit dem Canvas:

      procedure THauptFormular.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
      var l: Integer;
      fl: TStringLIst;
      begin
      with (sender as TDrawgrid) do begin
      if (sender as TDrawgrid)=sgr then begin
      if aCol+sgr.colcount*aRow>sgranzahl-1 then exit;
      if not assigned(Thumblistr) then exit else fl:=thumblistr;
      stmp:=fordnerr;
      end else begin
      if aCol+sgl.colcount*aRow>sglanzahl-1 then exit;
      if not assigned(thumblistl) then exit else fl:=Thumblistl;
      stmp:=fordnerl;
      end;
      if fl.count<1 then exit;
      if (arow=row) and (acol=col) then
      canvas.brush.color:=clHighLight
      else
      canvas.brush.color:=hauptformular.color;
      Canvas.FillRect(Rect);
      if (acol+colcount*arow<fl.count) then begin
      Canvas.Draw(Rect.Left , Rect.Top ,
      MakeThumb(stmp+fl[aCol+colcount*aRow], 104,140,canvas.brush.color));
      l:=(rect.right-rect.left-canvas.textwidth(fl[aCol+colcount*aRow]))div 2;
      Canvas.TextOut(Rect.Left+l,Rect.bottom-20, fl[aCol+colcount*aRow]);
      end;
      end;
      end;

      Das Eigentliche ist die Routine MakeThumb.
      Nicht definierte Variable sind global definiert.

      Dieses sgdrawcell läuft und sogar sehr gut.
      Da sie aber bei jeder Zelle mehrfach aufgerufen wird, könnte es vielleicht noch etwas schneller gehen.

      Vielen Dank!
      Gruß
      Matthia

      Comment


      • #4
        Hallo Matthias,<br>Du würdest meine Motivation, mich mit Deinem Problem zu befassen, erheblich steigern, wenn Du Dein Source-Beispiel formatiert ins Forum stellst.<br>Jens Schuman

        Comment


        • #5
          Hallo ,

          'tschuldigung. Da habe ich wohl etwas übersehen. Hier noch mal<br> formatiert - hoffe ich :-):<br>

          procedure THauptFormular.sgDrawCell(Sender: TObject;<br>
          ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);<br>
          var l: Integer;<br>
          fl: TStringLIst; <br>
          begin<br>
          with (sender as TDrawgrid) do begin<br>
          if (sender as TDrawgrid)=sgr then begin<br>
          if aCol+sgr.colcount*aRow>sgranzahl-1 then exit;<br>
          if not assigned(Thumblistr) then exit else fl:=thumblistr;<br>
          stmp:=fordnerr;<br>
          end else begin<br>
          if aCol+sgl.colcount*aRow>sglanzahl-1 then exit;<br>
          if not assigned(thumblistl) then exit else fl:=Thumblistl;<br>
          stmp:=fordnerl;<br>
          end;<b>
          if fl.count<1 then exit;<br>
          if (arow=row) and (acol=col) then<br>
          canvas.brush.color:=clHighLight<br>
          else<br>
          canvas.brush.color:=hauptformular.color;<br>
          Canvas.FillRect(Rect);<br>
          if (acol+colcount*arow<fl.count) then begin<br>
          Canvas.Draw(Rect.Left , Rect.Top ,<br>
          MakeThumb(stmp+fl[aCol+colcount*aRow], 104,140,<br>
          canvas.brush.color));<br>
          l:=(rect.right-rect.left-canvas.textwidth(<br>
          fl[aCol+colcount*aRow] ))div 2;<br>
          Canvas.TextOut(Rect.Left+l,Rect.bottom-20,<br>
          fl[aCol+colcount*aRow]);<br>
          end;<br>
          end;<br>
          end;<br>

          Sonst gilt, was ich dazu geschrieben habe.

          Gruß<br>
          Matthia

          Comment


          • #6
            Hallo Matthias,<br>außer, das der Code etwas umständlich aussieht, kann ich nichts entdecken, was ein Neuzeichen des Grids veranlassen könnte. Unklar ist natürlich was in MakeThumb passiert. Sonst kann ich nur auf das verweisen, was Hagen geschrieben hat. Du darfst innerhalb der OnDrawCell Verarbeitung nichts machen, was das Grid dazu veranlasst sich erneut zu zeichnen.<br>Jens Schumann<br>
            Ach ja, das habe ich mit Formatiert gemeint:<br>
            <pre><font size="1" face="Verdana">
            procedure THauptFormular.sgDrawCell(Sender: TObject;ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
            var l: Integer;
            fl: TStringLIst;
            begin
            with (sender as TDrawgrid) do
            begin
            if (sender as TDrawgrid)=sgr then
            begin
            if aCol+sgr.colcount*aRow&gt;sgranzahl-1 then
            exit;
            if not assigned(Thumblistr) then
            exit
            else
            fl:=thumblistr;
            stmp:=fordnerr;
            end
            else
            begin
            if aCol+sgl.colcount*aRow&gt;sglanzahl-1 then
            exit;
            if not assigned(thumblistl) then
            exit
            else
            fl:=Thumblistl;
            stmp:=fordnerl;
            end;
            if fl.count&lt;&gt; then
            exit;
            if (arow=row) and (acol=col) then
            canvas.brush.color:=clHighLight
            else
            canvas.brush.color:=hauptformular.color;
            Canvas.FillRect(Rect);
            if (acol+colcount*arow&lt;fl.count) then
            begin
            Canvas.Draw(Rect.Left , Rect.Top ,
            MakeThumb(stmp+fl[aCol+colcount*aRow], 104,140,
            canvas.brush.color));
            l:=(rect.right-rect.left-canvas.textwidth(fl[aCol+colcount*aRow] ))div 2;
            Canvas.TextOut(Rect.Left+l,Rect.bottom-20,fl[aCol+colcount*aRow]);
            end;
            end;
            end;</font></pre&gt

            Comment


            • #7
              Hallo Jens,

              vielen Dank für Deine Mühe.
              Bei mir ist das normalerweise natürlich auch so fromatiert.
              Ich habe aber noch nie ein Stück Quelltext gepostet und - Asche auf mein Haupt - ich habe keine Ahnung von HTML (Will ich nicht!). Das <br> für die Zeilenschaltung kenne ich ja inzwischen. Aber ich wusste nicht, dass die Leerzeichen am Anfang der Zeile wegrationalisiert werden.
              Und einmal habe ich das "r" beim <br> vergessen. Deshalb ab da fett.

              Ich habe noch mal kontrolliert. In DrawCell scheint alles richtig zu sein. Der Fehler liegt in dem "Drumrum". Sobald ich bei StringGrid.visible:=true irgendwas an Row oder Col oder ColCount oder oder oder... verändere, wird eben neu gezeichnet. Ist ja eigentlich auch logisch! Irgendwo sehe ich da wohl den Wald vor lauter Bäumen nicht. Aber das kriege ich noch hin...

              (MakeThumb hat mit dem StringGrid nichts zu tun. Es passt nur Bild an die verlangte Größe an.)

              Vielen Dank noch mal!
              Gruß
              Matthia

              Comment


              • #8
                Hi

                Der Jens ist auch ein bißchen zurückhaltend mit dem Trick.
                Um gute und einfachste Formatierungen hinzubekommen benötigst Du am Anfang den Befehl < pre > und am Ende < / pre >.
                Natürlich OHNE Leezeichen.

                Gruß Hage

                Comment


                • #9
                  Hi

                  Wie ist <b>stmp:=fordnerr</b> deklariert ?
                  Nutzt Du die Events <b>OnGetEditText(), OnSetEditText()</b> ?
                  Rufts Du irgendwo im Source <b>.Invalidate, .Refresh </b> auf ?

                  Gruß Hage

                  Comment


                  • #10
                    Hallo Hagen,

                    vielen Dank! Also dann demnächst richtig formatiert.

                    stmp ist nur ein einfacher global definierter String.
                    Alles andere, was Du schreibst, ist nicht nötig.
                    Den Text habe ich ja sowieso in einer Stringliste (fl) und male auch den direkt auf das Canvas.

                    Vielen Dank, noch mal!
                    Gruß
                    Matthia

                    Comment

                    Working...
                    X