Pregunta: | 11730 - COMO SABER CUANTAS HOJAS OCUPA CUALQUIER ARCHIVO |
Autor: | Maria del Carmen Ontiveros |
Hola! Necesito ayuda con esto por favor envienme algo relacionado con mi inquietud.
Estoy realizando una aplicación donde obtengo un archivo de cualquier directorio, necesito saber cuantas páginas ocupa ese archivo para mandarlo a imprimir. |
Respuesta: | Luis Fernandez |
Bueno, como la anterior respuesta ha sido un poco pobre ahi te mando algo de código que he hecho. Analizalo y veras como te va bien. Yo lo he probado y funciona. Es un poco mas extendido de lo que necesitas pero pienso que asi es mejor. Si tienes dudas consultamelo sin problemas
Esta no tiene nada que ver con lo que pides pero es muy interesante ==================================================================== function CountLines(const Filename:String):Integer; const BufferSize=1024; SearchByte=10; var FileHandle,BytesRead,Index:Integer; Buffer:array[1..BufferSize] of byte; begin try FileHandle:=FileOpen(Filename,fmOpenRead or fmShareDenyWrite); BytesRead:=FileRead(FileHandle,Buffer[1],BufferSize); if(BytesRead>0) then Result:=1 else Result:=0; repeat for index:=1 to Min(BufferSize,BytesRead) do begin if (Buffer[index]=SearchByte) then inc(Result); end;//for BytesRead:=FileRead(FileHandle,Buffer[1],BufferSize); until (BytesRead<=0); finally fileclose(FileHandle); end; end; ================================================================================ Esta es por si quieres ponerle cabecera al escrito (¡¡¡con logo y todo!!!) procedure TForm1.Cabecera(iMargenIzq, iMargenDer, iMargenSup, iPagina: Integer; sTitulo: String);// logo: TBitmap); var X, Y: Integer; Rect1: TRect; begin // Añade al título el número de página. sTitulo := sTitulo + '. Página: ' + IntToStr(iPagina); X := iMargenIzq; Y := iMargenSup div 4; // Dibuja el título de la página. Printer.Canvas.TextOut(X, 3 * Y, sTitulo); // dibuja el logotipo de la empresa. X := Round(iMargenDer * 0.75); Rect1 := Rect(X, Y, iMargenDer, 3 * Y); //Printer.Canvas.StretchDraw(Rect1, logo); // Dibuja una línea de separación. Printer.Canvas.MoveTo(iMargenIzq, iMargenSup); Printer.Canvas.Pen.Width := 2; Printer.Canvas.LineTo(iMargenDer, iMargenSup); end; =============================================================== Esta es la que pides procedure TForm1.SpeedButton2Click(Sender: TObject); var sTitulo: String; iInterLinea: integer; iNumLinea: integer; iTotalLineas: integer; x, y, i: integer; iMargenIzq, iMargenDer, iMargenInf, iMargenSup : Integer; begin if PrintDialog1.Execute then begin try Screen.Cursor := crHourGlass; // Abre el fichero a imprimir. // Inicia el trabajo de impresión. Printer.BeginDoc; // Imprime con el mismo tipo de fuente definida // en el control TRichEdit. // Debe tenerse en cuenta que si TRcihEdit es demasiado // ancho no se imprimirá la línea completa. Printer.Canvas.Font.name:=RichEdit1.Selattributes.name; Printer.Canvas.Font.Size:=RichEdit1.SelAttributes.size; Printer.Canvas.Font.color:=RichEdit1.SelAttributes.color; Printer.Canvas.Font.style:=RichEdit1.SelAttributes.style; // Calcula el espacio entre líneas. iInterLinea := Printer.Canvas.TextHeight('A') + 10; // Inicializa el aspecto del documento. iMargenIzq := Printer.PageWidth div 5; iMargenDer := Round(Printer.PageWidth * 0.95); iMargenSup := iInterLinea * 4; iMargenInf := Printer.PageHeight - iInterLinea * 2; sTitulo := 'Hola';//FormMemo.Caption; // Cálculo del total de líneas por página. iTotalLineas := (iMargenInf - iMargenSup) div iInterLinea; // Imprime la cabecera de página. //Cabecera(iMargenIzq, iMargenDer, iMargenSup, Printer.PageNumber, sTitulo);//, logo); iNumLinea := 1; for i:= 0 to RichEdit1.Lines.Count -1 do begin // Imprime línea a línea. Y := iNumLinea * iInterLinea + iMargenSup; X := iMargenIzq; //Printer.Canvas.TextOut(X,Y,RichEdit1.Lines[i]); // Actualiza el número de línea. Si se alcanza // el final de la página se abre una nueva. Inc(iNumLinea); If iNumLinea > iTotalLineas Then begin iNumLinea := 1; Printer.NewPage; Edit2.Text:=inttostr(Printer.PageNumber); //aqui te indica en numero de paginas //Cabecera(iMargenIzq, iMargenDer, iMargenSup, Printer.PageNumber, sTitulo);//, logo); end; end; // Cierra el trabajo de impresión. Printer.Abort; //Printer.EndDoc; //Si sequiere imprimir desactivar linea anterior // y activar esta except Printer.Abort; end; end; Screen.Cursor := crDefault; end; |
Respuesta: | Luis Fernandez Fernandez |
La solucion más rapida y sencilla es utilizar QuickReport y en vez de ejecutar Print, hacerlo con Preview. De esta forma ves en pantalla el informe con el numero total de paginas y si te interesa desde alli lo mandas imprimir.
Otra mas costosa es contar las lineas que tiene el fichero; por ejemplo cargado en un Memo; implementas una funcion que imprima X lineas por pagina y hallar las paginas es sencillo basta con dividir |