Avatar billede microtec Nybegynder
29. december 2000 - 14:35 Der er 10 kommentarer og
1 løsning

God ide søges til rapport med grafisk baggrund

Jeg er ved at lave et lille program, som skal udprinte en tekst-fil på en Windows-printer. Programmet skal tilføje en grafik-fil med logo mv., som skal fungere som baggrund på udskriftet.

Jeg mangler en god ide til hvordan jeg får lagt min ASCII-tekst \"over\" grafikken og udskrevet det hele.

Har overvejet at hente grafikken ind i en Image og så skrive ASCII-teksten ovenpå med Canvas.TextOut
Problemet med Canvas.TextOut er bare at jeg kun kan tilføje en linie tekst til min Image ad gangen. Dette betyder meget beregning da der skal angives kordinater i Pixel for hver linie der skrives med Canvas.TextOut

En Memo med grafisk-baggrund, hvor hele skidtet kan printes ville være smart.

Gode ideer efterlyses!!!!!
Avatar billede johnbp Nybegynder
29. december 2000 - 15:05 #1
Avatar billede pellelil Nybegynder
29. december 2000 - 16:25 #2
Hvis du ikke har noget imod at bruge QuickReport (QR) så skulle det være en smal sag at have et billede i baggrunden også have tekst oven på.

Hvis du ikke vil bruge QR, så bør det stadig være nemt og \"meget beregning\" med TextOut vil jeg kalde en overdrivelse. Du skal bare incremente din Y værdi for hver linie du skriver !?
Avatar billede microtec Nybegynder
29. december 2000 - 16:52 #3
johnbp >> Hvad har det med spørgsmålet at gøre ??????????????

pellelil >> Kan QR anvendes til det? Det er ikke en database application jeg skal lave. Jeg kikker lige lidt på QR. Du må gerne give mig et hint om hvordan jeg placere grafik som baggrund.

Jeg syntes du negligerer problemet med TextOut. Det er rigtigt at man \"bare\" skal lægge linie-afstanden til Y-værdien. Problemet er bare at lilie-afstanden er forskellig alt efter hvilken font-type og font-højde brugeren vælger.

Avatar billede nico26 Nybegynder
29. december 2000 - 17:44 #4
microtec >> Problemet med at afgøre linieafstanden kan løses med TextHeight
Avatar billede microtec Nybegynder
29. december 2000 - 17:55 #5
nico22 >> Med TextHeight kan du finde ud af hvor høj den valgte font er, men hvor meget skal der ligges til som \"luft\" mellem linierne. Er det en procent-sats som er liniært afhængig af text-højden?
Jeg mener også der er forskel på \"luften\" mellem linierne alt efter hvilken font der er valgt.
Avatar billede nico26 Nybegynder
29. december 2000 - 18:15 #6
microtec >> ja luften er afhængig af fontens størrelse. Nedenstående kode kan afgøre hvor høj teksten er samt luften for oven.

procedure TForm1.Button1Click(Sender: TObject);
var
  Metrics: TTextMetric;
begin
  Canvas.Font.Name := \'MS Comic Sans\';
  Canvas.Font.Size := 24;
  GetTextMetrics(Canvas.Handle, Metrics);
  Canvas.TextOut(10, 10, Format(\'H: %d, IL: %d\', [Metrics.tmHeight, Metrics.tmInternalLeading]));
end;
Avatar billede nico26 Nybegynder
30. december 2000 - 05:34 #7
Nedenstående kode centrerer logoet på siden, og udskriver textfilen

uses
  Printers;

procedure PrintLogo(Logo: TBitmap; const Text: TextFile);
var
  Y, PixelsX, PixelsY,
  NumPixelsX, NumPixelsY,
  PrintWidth, PrintHeight,
  OffSetX, OffSetY: Integer;
  PrintRect: TRect;
  Linie: string;
begin
  NumPixelsX := GetDeviceCaps(Printer.Handle, HORZRES); //højde i pixels
  NumPixelsY := GetDeviceCaps(Printer.Handle, VERTRES); //bredde i pixels
  PixelsX := GetDeviceCaps(Printer.Handle, LOGPIXELSX); //pixels pr inch
  PixelsY := GetDeviceCaps(Printer.Handle, LOGPIXELSY); //pixels pr inch

  PrintWidth := Round(Logo.Width * (PixelsX / Screen.PixelsPerInch));
  PrintHeight := Round(Logo.Height * (PixelsY / Screen.PixelsPerInch));
  OffSetX := (NumPixelsX - PrintWidth) div 2;
  OffSetY := (NumPixelsY - PrintHeight) div 2;

  //Logoets placering på siden
  PrintRect := Rect(OffSetX, OffSetY,
                    PrintWidth + OffSetX, PrintHeight + OffSetY);

  Printer.BeginDoc;
  y := 10;

  with Printer.Canvas do
  begin
    StretchDraw(PrintRect, Logo);
    Brush.Style := bsClear;
    Font.Name := \'Comic Sans MS\';
    Font.Size := 12;

    while not Eof(Text) do
    begin
      Application.ProcessMessages;
      Readln(Text, Linie);
      TextOut(0, Y, Linie);
      Y := Y + TextHeight(Linie);
    end;
  end;

  Printer.EndDoc;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Logo: TBitmap;
  Text: TextFile;
begin
  AssignFile(Text, \'Tekst.txt\');
  Logo := TBitmap.Create;

  try
    Reset(Text);
    Logo.LoadFromFile(\'Logo.bmp\');
    PrintLogo(Logo, Text);
  finally
    CloseFile(Text);
    Logo.Free;
  end;
end;
Avatar billede microtec Nybegynder
30. december 2000 - 20:24 #8
nico22 >> Hold inde!!! *LOL*
Jeg skulle bare have en ide og nu serverer du en komplet source-kode ;o)
Det ender sgu med at jeg er nød til at give dig points, selv om jeg er igang med at lege med QR :o)

Kikker lige nærmere på dit kode. Jeg har lidt problemer med QR da jeg ikke kan få lov til at vælge printer direkte fra mit program (kun fra QR´s egen printer-dialog).
Måske vælger jeg din løsning. Vender snart tilbage.
Avatar billede microtec Nybegynder
02. januar 2001 - 20:05 #9
Tja, jeg kan vist ikke finde noget at være utilfreds med :o)
Jo, det skulle da være at man skal benytte en BMP-fil som baggrund. Nå, skidt det rettede jeg selv ved at ændre TBitmap til TGraphic så kan man anvende både BMP og WMF ;o)
Lige en enkelt rettelse, hvis andre skulle anvende koden. TextHeight(Linie) bliver 0 hvis der er tale om en tom linie, så der kommer ingen \"linie-skift\". Ændres dog let ved at ændre dette til TextHeight(\'Dummy\').

Din kode virker upåklagelig. Har skrottet QR, selv om jeg næsten havde lavet funktionen her. Jeg skal nemlig ikke benytte database-delen, så der er jo ingen grund til at slæbe mere en højest nødvendigt med.

Ville gerne have givet lidt points til pellelil også, men du har desværre ikke oprettet et \"svar\".

Tak for hjælpen.
   
Avatar billede nico26 Nybegynder
02. januar 2001 - 20:38 #10
selv tak. Koden mangler måske også at tage højde for flere sider. Dette kan gøres ved at akkumulere liniernes højde og sammen ligne med sidens højde i pixels.
Avatar billede microtec Nybegynder
02. januar 2001 - 20:47 #11
nico22 >> Skal bruge det til \"printer-spooler\" for et bogføringsprogram, som ikke har mulighed for at designe egne faktura-sider (man SKAL benytte fortrykt), så der udskrives altid kune en side af gangen.

Faktisk var det jo kune en god ide jeg efterlyste og så serverer du kode. Dejligt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester