Te pego código aquí para q valores esta opción. Lo difícil es paginar el Explorer, pero basando en cm el patrón, se consiguen resultados excelentes. Asimismo, puedes usar el componente TPageProcucer, o sus primos DB, como si fuera un servidor web, pero pasas el htm directamente al explorer. Los resultados son los mismos.
Con el ejemplo de Cantu he podido generar listados de sitios web enteros, así como impresión matricial.
Todos los méritos de Marco Cantu (unidad HTMLstr.pas):
Código:
unit HtmlStr;
interface
uses
Classes, DB;
type
THtmlStrings = class (TStringList)
public
procedure AddHeader (Title: string);
procedure AddFooter;
procedure OutputTable (Data: TDataSet);
private
procedure AddTableContents (Data: TDataSet);
end;
implementation
uses
SysUtils;
procedure THtmlStrings.AddHeader (Title: string);
begin
Clear;
Add ('<HTML>');
Add ('<HEAD>');
Add ('<TITLE>' + Title + '</TITLE>');
Add ('</HEAD>');
Add ('<BODY>');
Add ('<H1><CENTER>' + Title + '</CENTER></H1>');
end;
procedure THtmlStrings.AddFooter;
begin
Add ('<HR>');
Add ('Generado por el programa ' +
ExtractFileName (ParamStr(0)));
Add ('</BODY>');
Add ('</HTML>');
end;
procedure THtmlStrings.OutputTable (Data: TDataSet);
var
I: Integer;
begin
// iniciamos la tabla con bordes
Add('<table border>');
// nueva fila, con las cabeceras de tabla (etiqueta <th>)
Add('<tr>');
for I := 0 to Data.FieldCount - 1 do
if Data.Fields[i].Visible then
Add('<th>' + Data.Fields[i].FieldName + '</th>');
Add('</tr>');
// nueva fila para cada registro, con los campos apropiados
AddTableContents (Data);
// hecho
Add('</table>');
end;
procedure THtmlStrings.AddTableContents (Data: TDataSet);
var
Bookmark: TBookmark;
I: Integer;
begin
// inhabilitamos el UI
Data.DisableControls;
try
// almacenamos la posición actual
Bookmark := Data.GetBookmark;
try
// exploramos la tabla de base de datos
Data.First;
while not Data.EOF do
begin
Add('<tr>'); // nueva fila, con los datos de la tabla (etiqueta <td>)
for I := 0 to Data.FieldCount - 1 do
if Data.Fields[i].Visible then
Add('<td>' + Data.Fields[i].DisplayText + '</td>');
Add('</tr>');
Data.Next;
end;
finally
// volvemos a la anotación y la destruimos
Data.GotoBookmark (Bookmark);
Data.FreeBookmark (Bookmark);
end;
finally
// rehabilitamos los controles
Data.EnableControls;
end;
end;
end.
He tenido que quitar las etiquetas Delphi, ya q se veía destrozado el texto. Ahora el método para llamar a esta unidad y generar la salida pre_impresa:
Código Delphi
[-]
procedure TMainForm.SpeedButton2Click(Sender: TObject);
var
Str: THtmlStrings;
begin
SaveDialog1.FileName := ChangeFileExt (
Table1.TableName, '.htm');
if SaveDialog1.Execute then
begin
Str := THtmlStrings.Create;
try
Str.AddHeader (Caption);
Str.OutputTable (Table1);
Str.AddFooter;
Str.SaveToFile (SaveDialog1.Filename);
if CheckBox1.Checked then
ShellExecute (Handle, 'open',
PChar (SaveDialog1.FileName),
'', '', sw_ShowNormal);
finally
Str.Free;
end;
end;
end;
Enseguida entenderas como funciona y es un método perfectamente extensible. He generado Facturación y más listados a PRN matricial, y va estupendo. Además no tienes ningún problema con las imágenes gif o JPG.
Tambien estan los comonentes para listados de HTMLreport. La versión de prueba no tiene limitación de uso, solo firma el documento de salida. Hace lo mismo de otra manera. Su sitio es
http://www.htmlreport.com pero parece colgada.
Espero q te sirva.