AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid.OnDrawCell ohne Anzeige auslösen

Ein Thema von messie · begonnen am 30. Mär 2007 · letzter Beitrag vom 2. Apr 2007
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 10:36
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
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 11:08
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 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????

Grid.Invalidate;
Uwe
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 11:58
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
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 12:15
Kannst du nicht mit Hide das Formular verschwinden lassen, und Grid.Invalidate aufrufen?
Uwe
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 13:08
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
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#6

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 13:20
Kannst Du mir sagen wie, oder durch welche function das Grid an den Drucker geschickt wird?
Würde das Problem gerne nachstellen.
Uwe
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#7

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 13:55
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 30. Mär 2007, 14:30
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.
Andreas
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

Re: StringGrid.OnDrawCell ohne Anzeige auslösen

  Alt 2. Apr 2007, 09:54
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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