Newsgroup: it.comp.lang.delphi
Titolo: Stampare da un DBGrid

Alla ricerca di una semplice funzione di stampa da DBGrid mi ero imbattuto 
in un componente piuttosto vecchio chiamato Prtgrd.pas che ho provato a 
compilare, ma purtroppo dà il seguente errore:
[DCC Error] PRTGRID.PAS(1105): E2091 Segment/Offset pairs not supported in 
Borland 32-bit Pascal
 
E infatti sul sito Embarcadero ho trovato la spiegazione:
32-bit code no longer uses the segment/offset addressing scheme that 16-bit 
code used.
In 16-bit versions of Object Pascal, segment/offset pairs were used to 
declare absolute variables, and as arguments to the Ptr standard function. 
Note that absolute addresses should not be used in 32-bit protected mode 
programs. Instead appropriate Win32 API functions should be called.
 
Non ho capito molto e taglio corto: come si può fare altrimenti ? Avete 
suggerimenti ? grazie
 
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com
 
 

 suggerimenti ? grazie
 
Non e' che puoi farci vedere il sorgente?
(ammetto che se come temo si tratta di assembler poi non so aiutarti) 
 
ciao
Giacomo

Ciao,
  scusami se non quoto ma, se usi dbgrid prova a dare uno sguardo alla 
smdbgrid della scalabium.
E' ottima, e quasi quasi come (e per certi versi forse anche superiore) alla 
dbadvstringgrid della tms.
Prima di passare alle tms ho usato (e in certi casi la uso ancora) la 
smdbgrid che se non ricordo male ha diversi componenti aggiuntivi (per fare 
una miriade di cose a cui non mi sono mai interessato) tra le quali anche la 
stampa.
E' FREE anche per commercial.
 
www.scalabium.com
 
 
Ciao
 
Daniele 
 

"Giacomo Degli Esposti"  ha scritto nel messaggio 
news:5052a6aa-44c1-4c41...@googlegroups.com...
Non e' che puoi farci vedere il sorgente?
(ammetto che se come temo si tratta di assembler poi non so aiutarti)
ciao
Giacomo
 
No, è in Delphi. Ma è qualche pagina e non so se è consentito postare una 
roba così lunga. Spero di non fare male a spedirtela direttamente..
Altrimenti dimmi come fare 


 Altrimenti dimmi come fare 
 
Ricevuto.  Comunque bastava postare il codice vicino al punto dove
ti dava l'errore, visto che e' uno solo! ;-) 
 
Lo faro' io e gia' che ci sono ti indico come sono arrivato
alla soluzione, cosi' la prossima volta puoi arrivarci senza
il nostro aiuto. :-)
 
Il codice e' questo (con un QUI DA ERRORE nel punto dove
da errore)
 
function TPrintGrid.GetOrientation : TPrinterOrientation;
var
  FDevice:     PChar;
  FDriver:     PChar;
  FPort:       PChar;
  FHandle:     THandle;
  FDeviceMode: PDevMode;
begin
  GetMem (FDevice, 255);
  GetMem (FDriver, 255);
  GetMem (FPort, 255);
  Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
  if FHandle = 0 then
  begin
    { driver not loaded }
    Printer.PrinterIndex := Printer.PrinterIndex;
    { force Printer object to load driver }
    Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
  end;
  if FHandle <> 0 then
  begin
     FDeviceMode := Ptr(FHandle, 0); // <---- QUI DA ERRORE 
     { FDeviceMode now points to Printer.DeviceMode }
     { Following fix is from Steve Turner }
     case FDeviceMode^.dmOrientation of
        dmOrient_Portrait:   result := poPortrait;
        dmOrient_Landscape:  result := poLandscape;
     else
        result := poLandscape;
     end; { end case }
 
...eccetera
 
Allora... per risolvere il problema ho guardato da dove
arrivava il valore di fHandle per capire cosa rappresenta. 
 
fHandle non e' assegnata esplicitamente quindi e' probabile
che sia usata come parametro var di una funzione.
 
Guardando nell'HELP la funzione Printer.getPrinter vedo
che l'ultimo parametro e' proprio un parametro var.
 
Leggendo la sua descrizione leggo che :
"DeviceMode returns the handle to a memory buffer containing 
device-specific initialization data for the device driver. 
Use the GlobalLock function to convert this handle into a 
pointer to a DeviceMode record (Delphi) or DEVMODE structure (C++)."
 
A questo punto guardo cosa e' sta funzione GlobalLock e vedo che:
"Locks a global memory object and returns a pointer to the first 
byte of the object's memory block."
 
Perfetto, trasforma un handle in un puntatore e proprio per
caso fDeviceMode e' di tipo PDeviceMode che puzza di puntatore
lontano un Km !
 
Ho provato a sostituire la riga incriminata :
 
FDeviceMode := GlobalLock(FHandle);
 
e l'errore e' sparito! Occhio pero' che leggendo l'HELP della
funzione GlobalLock vedrai che e' necessario fare uso anche
della sua funzione gemella GlobalUnlock altrimenti fa del casino.
 
Questo te lo lascio da fare come compito a casa! :-)
 
ciao
Giacomo
 
 
 
 

Ho provato a sostituire la riga incriminata :
FDeviceMode := GlobalLock(FHandle);
e l'errore e' sparito! Occhio pero' che leggendo l'HELP della
funzione GlobalLock vedrai che e' necessario fare uso anche
della sua funzione gemella GlobalUnlock altrimenti fa del casino.
Questo te lo lascio da fare come compito a casa! :-)
ciao
Giacomo
 
Adesso mi guardo meglio la tua correzione, poi tento la mia.. Così si che si 
impara, ma alla mia età  mi sa che per me ormai è troppo tardi. O non è mai 
troppo tardi ?!


Adesso funziona, ma la stampa di default assegna alle colonne degli spazi 
enormi in stampa. Praticamente stampa due, tre colonne al massimo. Ho 
provato a vedere come stabilisce gli spazi da assegnare ai campi, ma è 
troppo complicato per me e pertanto non riesco ad usare il componente. 
