Entwickler-Ecke

Sonstiges (Delphi) - Stringgrid text rechtsbundig oder Linksbündig druckrn


stathis - Do 01.09.05 11:49
Titel: Stringgrid text rechtsbundig oder Linksbündig druckrn
Hallo!

ich habe in meinem Programm ein stringgrid mit ondrawcell :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  //Text linksbündig ohne Zeilenumbruch in der ersten Zeile
 // if ARow = 0 then
  //  StringGridAlignment(StringGrid1, Rect, ACol, ARow, taLeftJustify, False);

  //Text zentriert mit Zeilenumbruch in der zweiten Zeile
  if (ARow = 1or (ARow = 0 ) then
    StringGridAlignment(StringGrid1, Rect, ACol, ARow, taCenter, True);

  //Text rechtsbündig ohne Zeilenumbruch restliche Zeilen
  if ARow > 1 then
    StringGridAlignment(StringGrid1, Rect, ACol, ARow, taRightJustify, False);
  if ACol = 6 then
   StringGridAlignment(StringGrid1, Rect, ACol, ARow, taLeftJustify, False);

end;

formatiert.

Ich drucke dieses stringgrid mit folgende Code:

procedure TForm2.Button1Click(Sender: TObject);
var z,zh,s,sb,gr:integer;//zh=zeilenhöhe;sb=spaltenbreite
begin
If PrintDialog1.Execute
then
  begin
   Printer.Title:='Text';//angezeigter Text im Druckmanager
   Printer.Canvas.Font.Size:=9;
   Printer.BeginDoc;
   gr:=Printer.Canvas.Font.Height*-1 div Printer.Canvas.Font.size;
   zh:=0;//Abstand oben
   For z:=0 to StringGrid1.RowCount-1 do
    begin
    if (z=1or (z=0then
    begin
      printer.canvas.brush.color:=clsilver;
    end
    else
    begin
     printer.canvas.brush.color:=clwhite;
    end;
     sb:=0;//Absand beim Drucken von links
     For s:=0 to StringGrid1.ColCount-1 do 
      begin
       //Rechteck
       Printer.Canvas.Rectangle(sb,zh,sb+StringGrid1.ColWidths[s]*gr,zh+StringGrid1.RowHeights[z]*gr);
       //Text 
       Printer.Canvas.TextOut(sb+3*gr,zh+3*gr,StringGrid1.Cells[s,z]);
       sb:=sb+StringGrid1.ColWidths[s]*gr; 
      end;
     zh:=zh+StringGrid1.RowHeights[z]*gr; 
     If Printer.PageHeight-zh-StringGrid1.RowHeights[z+1]*gr<0
      then 
       begin
        zh:=0;//Abstand oben 
        Printer.NewPage;
       end
    end;
   Printer.EndDoc; 
  end;
end;

aber die formatierung wirt nicht mitausgedruckt (links- oder rechtsbündig). :(

haben Sie eine Lösung für mich?

Ich danke Ihnen

Stathis

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Martin1966 - Do 01.09.05 11:59

Was meinst du mit Formatierung? Links- und Rechtsbündig? Warum sollte diese Formatierung auch mit ausgedruckt werden? Jedenfalls sehe ich in der Druck-Procedure keine Sonderbehandlung wie du es in der OnDrawCell Procedure gemacht hast.

Lg Martin


stathis - Do 01.09.05 12:29

also mit dem Ondrawcell wenn das stringgrid1 angezeigt wird auf dem Monitor der Text ist rechtsbündig(auf die rechte Seite der Spalte) aber wenn den Stringgrid ausgedruckt ist der Text lingsbündig(auf die linke Seite der Spalte).

ich danke dir

Stathis


Martin1966 - Do 01.09.05 12:35

Danke für das nochmalige erklären deiner Frage. ;-) Ich hab diese aber verstanden.

Aber anscheind hast du meine Antwort nicht verstanden. Du musst, genauso wie in der OnDrawCell-Procedure, eine Behandlung einbauen die deinen Text auf das Priter.Canvas Objekt Rechts- oder Linksbündig zeichnet.

Da du das bei der OnDrwaCell Procedure auch hinbekommen hast sollte das für die Printer-Procedure eigentlich kein Problem sein.

Lg Martin


stathis - Do 01.09.05 12:45

Die beide Proceduren habe ich irgendwo im Internet gefunden. Kannst du mir villeicht mit dem Code weitzer helfen?


Martin1966 - Do 01.09.05 12:54

In Zeile 51 wird folgendes aufgerufen:

Delphi-Quelltext
1:
Printer.Canvas.TextOut(sb+3*gr,zh+3*gr,StringGrid1.Cells[s,z]);                    

damit zeichnest du den Text auf das Priter-Objekt. Der erste Parameter gibt die horizontale Position an wo der Text gezeichnet werden soll. Damit du jetzt einen Text rechtsbündig zeichnen kannst musst du zuvor die Zellenbreite kennen (StringGrid1.ColWidths[s]) und den Platz den der eigentliche Text benötigt (Printer.Canvas.TextWidth).

Mit hilfe dieser beiden Angaben kannst du dann den Text rechtsbündig ausrichtigen. In dem du einfach die Zellenbreite minus die Textbreite nimmst. Dann erhälst du die Horizontale Position an dem der Text gezeichnet werden muss.

Such mal hier im Forum nach Suche in: Delphi-Forum, Delphi-Library CANVAS RECHTSB?NDIG.

Lg Martin


stathis - Do 01.09.05 13:25

Ich weiss nicht aber geht es nicht, ich kann das nicht machen

trotzdem ich danke dir