Announcement

Collapse
No announcement yet.

Delphi4: Stringgrid-Inhalt farbig drucken

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

  • Delphi4: Stringgrid-Inhalt farbig drucken

    Hallo Delphianer,
    wie kann ich den Inhalt eines StringGrid (ca. 180 Zeilen x 600 Spalten) ausdrucken ? Ich habe schon versucht, den Inhalt der Zelle in einen String zu schreiben, zu formatieren und dann zu drucken. Nur keine 180 Zeilen x 600 Spalten. Und die unterschiedlichen Farbattribute der Zellen sollten auch gedruckt werden.

    Hättest Du ein Beispiel oder einen Tip für mich, wie ich dieses Problem gelöst bekomme ?
    MfG.
    Uwe

  • #2
    Hallo Uwe, ich gestern abend schon mal ein Antwort zusammengebastelt, die dann aber wohl nicht im Forum angekommen ist...

    Versuche mal, dem TPrinter.Canvas den TStringGrid.Canvas zuzuweisen. Habe ich noch nicht probiert, ist also nur eine kurze fixe Idee. Und: wie hast Du denn im TString-Grid den einzelnen Zellen separate Farben zugewiesen? Wenn Du dazu eine von TStringGrid abgeleitete Komponente benutzt, solltest Du als erstes überprüfen, daß die Einfärbung auch tatsächlich über TStringGrid.Canvas läuft. Ansonsten klappt die o.g. Zuweisung natürlich nur unter Verlust des Farbattributes. Ggf. maile ich Dir meine von TStringGrid abgeleitete TColorStringGrid-Komponente.

    Gruß Jürge

    Comment


    • #3
      Hallo Jürgen,
      ich färbe die Stringgrid-Zellen folgendermaßen ein. In DrawCell prüfe ich, ob in der Zelle das Wort 'Urlaub' steht. Wenn ja, dann wird die Zelle gefärbt.
      Ich kann nicht sagen, ob dies eine elegante Lösung ist, aber sie funktioniert.

      procedure TFormModPFP.StringGrid1DrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
      var
      sSichText : String;
      begin
      with StringGrid1 do
      begin
      if (Cells[ACol,ARow] = 'Urlaub' then
      begin
      sSichText := Cells[ACol,ARow];
      Canvas.Brush.Color := clRed;
      Canvas.Font.Color := clWhite;
      canvas.TextRect(Rect, Rect.left, Rect.top, sSichText);
      end;
      end; //Ende von 'with StringGrid1 do'
      end;

      Ist es mit Deiner Komponente einfacher ?
      Gruß Uw

      Comment


      • #4
        Hallo Uwe, Dein Weg ist natürlich absolut gangbar! Letztendlich macht es meine Komponente auch nicht anders. Nur gefällt MIR an der o.g. Lösung eines nicht: ich muß stets den INHALT der Zellen im Auge behalten. Und wenn ich so einige StringGrids mit Farben (oder z.B. auch mit nur/zusätzlich Bitmaps) fülle, dann mag ich es lieber in der Art:

        ClrStringGrid1.TextColorZeile[5]:=clRed;

        ClrStringGrid2.BackGrndColorZelle[2,3]:=clBlue;

        ClrStringGrid4.BmpZelle[12,3]:='DUMMGELAUFEN.BMP' (oder z.B. Index einer Image-List).

        Allerdings hat meine Komponente einen Nachteil: ich verbrate die Objects-Eigenschaft des Grids für diese Spielerei. Wenn Du also die Objects für etwas anderes brauchst, ist meine Komp untauglich.
        Das eigentliche Malen des Canvas mache ich aber im Prinzip genauso wie Du. Nur hänge ich es nicht ans Ereignis OnDrawCell in der Formular-Unit(was hat das Einfärben der Zelle in der Formular-Unit zu suchen? Was hat die Konstante "Urlaub" im Quelltext zu suchen? Das Einfärben sollte Angelegenheit des Grids bleiben, und nicht die Funktionalität des Formulars überfrachten. => Geschmackssache). Ich habe also in meiner von StringGrid abgeleiteten Komponente die Methode DrawCell hart überschrieben. Und das geht bei großen Grids auch flinker als Deine Methode (ich habe meine ersten Einfärb-Versuche genauso gemacht wie Du).
        Nur: Dein eigentliches Problem war das Übernehmen der Farben beim Druck. Hat das mit der Canvas-Zuweisung an TPrinter geklappt?

        Gruß Jürge

        Comment


        • #5
          Hallo Jürgen,
          war mal wieder längere Zeit unterwegs, deshalb erst jetzt meine Antwort.
          Die Canvas-Zuweisung an TPrinter habe ich noch nicht ausprobiert.
          Zu Deiner Frage der Überfrachtung: Ich bin dabei, ein Programm zu schreiben, das sich mit Fehlzeitenplanung beschäftigt. Der Bediener markiert einen Zeitbereich, trägt dann den Fehlgrund ein (Urlaub, Krankheit usw.). Dann überprüfe ich jede Zelle auf ihren Inhalt. Wenn dann irgendwo z.B. 'Urlaub' steht wird diese eingefärbt. Vielleicht nicht die eleganteste Lösung. Nur fiel mir keine Bessere ein. Oder gibt es eine bessere, schnellere Möglichkeit ? Momentan versuche ich, einzelne, nicht zusammenhängende Zellen zu markieren (so wie in EXCEL mit STRG uns Mausklick). Nur gibt es im StringGrid keine Unterstüzung für diese Vorgehensweise. Laß von Dir hören.

          Gruß Uw

          Comment


          • #6
            Hallo Uwe,

            wie wärs denn mit folgendem Lösungsansatz:

            1. Du definierst Dir einen Zeittyp etwa in der Art:

            TZeitMoeglichkeiten = ( Urlaub, krank, aufArbeit, verschlafen );

            TZeit = class

            fZeit:TZeitMoeglichkeiten;

            end;

            2. pro Cell-Eintrag hängst Du ein Objects[ACol,ARow] vom Typ TZeit rein. (Achtung, nur Createn, das fZeit einstellen und an Objects übergeben; kein Free!)

            3. im OnDraw-Ereignis wertest du im prinzip nur objects[i,j] aus, nämlich mittels farb-hintergrund

            4. im destroy vom string-grid free'st du alle objects.

            Ergebnis: deine cells sind nur noch gefüllte farben. Also spaltenkopf z.b. datum, zeilenkopf name, und schon siehst du an hand der farbe, wer wie oft warum gefehlt hat. selbstverständlich läßt sich das auch prima zählen:

            for i:=1 to RowCount-1 do // pro mitarbeiter abzüglich spaltenkopf

            for j:=1 to colCount-1 do // pro tag abzüglich Namen-Feld

            case ((Objects[j,i] as TZeit).fZeit of
            Urlaub: inc(ZaehlerUrlaub);
            krank : inc(ZaehlerKrank);
            aufArbeit: inc(ZaehlerSelberDranSchuld)
            verschlafen: inc(ZaehlerSchlafSchoen)
            end;

            Mit diesen Ergebnissen kannst Du dann die herrlichsten Statistik-Charts füllen und die Krank-Spitzenreiter prämieren usw. (Freut den Datenschutzbeauftragten!)

            Nur: überfülle doch das Grid nicht mit diesen lächerlichen konstanten(!!!!!) Einträgen "Urlaub/krank/usw.". Das verwirrt nur!

            Gruß Jürge

            Comment

            Working...
            X