Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid.OnDrawCell ohne Anzeige auslösen (https://www.delphipraxis.net/89373-stringgrid-ondrawcell-ohne-anzeige-ausloesen.html)

messie 30. Mär 2007 09:36


StringGrid.OnDrawCell ohne Anzeige auslösen
 
Moin,

ich erstelle zur Druckvorbereitung zur Laufzeit ein Stringgrid. Ich habe eine Routine OndrawCell zur Formatierung der Zellen beim Füllen. Die wird ja nur aufgerufen, wenn ich das Grid auch anzeige, was ich nicht will.
Wie kann ich die OnDraw-Message senden, ohne das Form mit dem Stringgrid anzeigen?

Danke, Messie

uwewo 30. Mär 2007 10:08

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Zitat:

Zitat von messie
Moin,
Die wird ja nur aufgerufen, wenn ich das Grid auch anzeige, was ich nicht will.

oder Du füllst es mit Daten.
Zitat:

Zitat von messie
Moin,
Wie kann ich die OnDraw-Message senden, ohne das Form mit dem Stringgrid anzeigen?

Warum willst Du ein Grid zeichnen, wenn man es nicht sieht????

Delphi-Quellcode:
Grid.Invalidate;

messie 30. Mär 2007 10:58

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Das Grid soll danach auf einen Printer geschickt werden, deshalb soll es komplett im Hintergrund sein.
Das Grid wird schon mit Daten gefüllt, dabei durchläuft es aber eben nicht die OnDrawCell-Routine. Erst wenn ich es einem Form zuweise und das anzeige, werden die Routinen ausgelöst.
Es reicht schon, Visible auf false zu setzen und OnDraw wird nicht durchlaufen.

Grüße, Messie

uwewo 30. Mär 2007 11:15

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Kannst du nicht mit Hide das Formular verschwinden lassen, und Grid.Invalidate aufrufen?

messie 30. Mär 2007 12:08

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Zitat:

Zitat von uwewo
Kannst du nicht mit Hide das Formular verschwinden lassen, und Grid.Invalidate aufrufen?

Nee, dann wird OnDraw wieder nicht aufgerufen. Die Message scheint nur zu kommen, wenn die Canvas des Forms in den Grafikspeicher geschrieben wird.

Grüße, Messie

uwewo 30. Mär 2007 12:20

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Kannst Du mir sagen wie, oder durch welche function das Grid an den Drucker geschickt wird?
Würde das Problem gerne nachstellen.

messie 30. Mär 2007 12:55

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Zitat:

Zitat von uwewo
Kannst Du mir sagen wie, oder durch welche function das Grid an den Drucker geschickt wird?
Würde das Problem gerne nachstellen.

Delphi-Quellcode:
  form := TTntForm.Create(Application);
  form.Width := 200; //nur damit das Grid nicht beschnitten wird. Denn auch dann
  form.Height := 300;//wird das OnDrawCell für nicht sichtbare Zellen übersprungen.
  SG := TTntStringGrid.Create(form);
  SG.Parent := form;
  SG.Align := alClient;
  SG.Font.Size := 8;
  //Zuweisung der Events - entspricht den Ondrawcell was auch im Form stehen könnte
  SG.OnDrawCell := ObjectUtils.SGDrawCell;
  SG.OnGetEditMask := ObjectUtils.SGGetEditMask;
  dpihor:=GetDeviceCaps(Printer.Handle, LOGPIXELSX);
  dpiver:=GetDeviceCaps(Printer.Handle, LOGPIXELSY);
  //in ShowHeizProg wird das Grid gefüttert - wird im Prog mehrfach benutzt
  //wenn die Forms gezeigt werden, wird auch OnDrawCell aufgerufen
  //im OnDrawCell werden die Größe der Zellen der Schrift angepaßt
  //und Zeilenumbrüche eingebaut.
  ShowHeizProg(SG,Eval.Heizprog);
  //form.ShowModal; -> damit gehts, aber dann muß ich ja das From wegklicken.
 
  //hier wird dann gedruckt. Zellenweise zu Fuß, da scheint es nichts besseres zu geben
  //am elegantesten wäre es, ans Canvas des Grids zu kommen aber das läuft nicht.
  PrintGrid(PP.Canvas,SG,dpihor,dpiver,x,y);

  SG.Free;
  form.Free;
Im Prinzip könnte man das Malen von Kästen und Text ja gleich ganz zu Fuss machen statt über ein Grid aber alle anderen Routinen sind ja schon vorhanden. Überhaupt ist die Windows-Druckerei ein Graus aber das steht auf einem anderen Blatt.

Grüße, Messie

shmia 30. Mär 2007 13:30

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Delphi-Quellcode:
// (Win-)Control auf Drucker ausgeben
StringGrid1.PaintTo(printer.Canvas.Handle, 120, 200);
Problem ist jetzt nur, dass Bildschirm und Drucker unterschiedliche Auflösungen haben.

messie 2. Apr 2007 08:54

Re: StringGrid.OnDrawCell ohne Anzeige auslösen
 
Zitat:

Zitat von shmia
Delphi-Quellcode:
// (Win-)Control auf Drucker ausgeben
StringGrid1.PaintTo(printer.Canvas.Handle, 120, 200);
Problem ist jetzt nur, dass Bildschirm und Drucker unterschiedliche Auflösungen haben.

Ich habe das mal probiert, unabhängig von der Druckerauflösung zu drucken:
Delphi-Quellcode:
 
  bmp := TBitmap.Create;
  bmp.Height := SG.Height;
  bmp.Width := SG.Width;
  SG.PaintTo(bmp.Canvas,0,0);
  rect.TopLeft.X := x;
  rect.TopLeft.Y := y;
  rect.BottomRight.X := x + GetPrintSize(dpihor,SG.Width);//Anpassung an mmHiMetric
  rect.BottomRight.Y := y + GetPrintSize(dpihor,SG.Height);
  PP.Canvas.StretchDraw(rect,bmp);
Der Nachteil ist, dass man offensichtlich das Bitmap immer mit 72 dpi vorliegen hat. Kann man das irgendwo einstellen? Die Alternative wäre, ein großes Grid mit großem Schriftgrad herunterzuskalieren.

Edit: das Grid wird beim PaintTo auch von der Zeilen- und Spaltenskalierung nicht korrekt dargestellt. Und nach dem PaintTo sind height und width auf unerklärlichen Werten. Scheint also besser, weiter zu Fuss zu zeichnen. Aber mit dem PaintTo kann ich endlich die OnDrawCell-Routine auslösen ohne etwas auf dem Bildschirm anzeigen zu müssen.

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz