Ver Mensaje Individual
  #4  
Antiguo 11-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Reputación: 0
lento manu Va por buen camino
opción DB to HTML de Marco Cantu

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.
Responder Con Cita