![]() |
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 |
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Zitat:
Zitat:
Delphi-Quellcode:
Grid.Invalidate;
|
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 |
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Kannst du nicht mit Hide das Formular verschwinden lassen, und Grid.Invalidate aufrufen?
|
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Zitat:
Grüße, Messie |
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. |
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Zitat:
Delphi-Quellcode:
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.
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; Grüße, Messie |
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Delphi-Quellcode:
Problem ist jetzt nur, dass Bildschirm und Drucker unterschiedliche Auflösungen haben.
// (Win-)Control auf Drucker ausgeben
StringGrid1.PaintTo(printer.Canvas.Handle, 120, 200); |
Re: StringGrid.OnDrawCell ohne Anzeige auslösen
Zitat:
Delphi-Quellcode:
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.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); 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 19:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz