Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 7 odgovora
  • 5.936 pregleda

Najnovija ↓

Stampanje ListViewa 24.04.2003. u 14:28 · pre 286 meseci #1
Da li zna neko kako da ostamtam ListView kolone i ostalo...
Potpis
by samadhi
Let there be Pascal and God made Lazarus and blessed Linux
Re: Stampanje ListViewa 30.04.2003. u 03:55 · pre 286 meseci #2
Evo da odgovorim sam sebi ko sto rece covek sa yudelphi news servera

skinite komponentu sa www.tmssoftware.com za source cete morati da
izdvojite neku paru...
Potpis
by samadhi
Let there be Pascal and God made Lazarus and blessed Linux
Re: Stampanje ListViewa 30.04.2005. u 00:06 · pre 261 mesec #3
Ova komponenta treba da se plati. Ima li neko kod koji bi odstampao listview? Ja sam nasao sledeci
Code:

procedure TMainForm.FormCreate(Sender: TObject);
var
  RReg: TRegIniFile;
  Status: Integer;
begin
  Caption := produktname;
  RReg := TRegIniFile.Create(Reg);
  try
    with RReg do
    begin
      Status := ReadInteger('Window', 'State', 1);
      case Status of
        1:
          begin
            MainForm.WindowState := wsNormal;
            MainForm.ClientWidth := ReadInteger('Window', 'Width', 610);
            MainForm.ClientHeight := ReadInteger('Window', 'Height', 366);
            MainForm.Top := ReadInteger('Window', 'Top', 10);
            MainForm.Left := ReadInteger('Window', 'Left', 10);
          end;
        2: PostMessage(MainForm.Handle, wm_SysCommand, sc_Minimize, 0);
        3: MainForm.WindowState := wsMaximized;
      end;
    end;
  finally
    RReg.Free;
  end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var
  RReg: TRegIniFile;
begin
  RReg := TRegIniFile.Create(Reg);
  try
    with RReg do
    begin
      case MainForm.WindowState of
        wsNormal:
          begin
            WriteInteger('Window', 'Width', MainForm.ClientWidth);
            WriteInteger('Window', 'Height', MainForm.ClientHeight);
            WriteInteger('Window', 'Top', MainForm.Top);
            WriteInteger('Window', 'Left', MainForm.Left);
            WriteInteger('Window', 'State', 1);
          end;
        wsMinimized: WriteInteger('Window', 'State', 2);
        wsMaximized: WriteInteger('Window', 'State', 3);
      end;
    end;
  finally
    RReg.Free;
  end;
end;

procedure TMainForm.PrintListview(oListView: TListView);
//-----------------------------------------------------
var
  pWidth, pHeight, i: Integer;
  v, h: Real;
  CurItem, iColumnCount: Integer;
  //aCols: array[0..50] of Integer; // Delphi 3
  aCols: array of Integer; // Delphi 5
  iTotColsWidth, iInnerWidth, TopMarg, LinesOnPage, CurLine, TekstHeight, CurCol: Integer;
  CurRect: TRect;
  CurStr: string;
  CurLeft, NumPages, TmpPos: Integer;

begin
  if PrintDialog1.Execute then
  begin
    iColumnCount := oListview.Columns.Count;
    SetLength(aCols, iColumnCount + 1); // + 1 nodig ??? Delphi 5
    Printer.Title := 'Listview Print';
    Printer.Copies := 1;
    Printer.Orientation := poPortrait;
    Printer.BeginDoc;
    pHeight := Printer.PageHeight;
    pWidth := Printer.PageWidth;

    v := (pHeight + (2 * GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY))) / (29.7 * 0.95);
    //0.95 is a strange correction factor on the clients printer
    h := (pWidth + (2 * GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX))) / 21;

    // calculate total width
    iTotColsWidth := 0;
    for i := 0 to iColumnCount - 1 do
      iTotColsWidth := iTotColsWidth + oListView.Columns[i].Width;

    // calculate space between lMargin and rMargin
    aCols[0] := Round(1.5 * h); //left margin ?
    aCols[iColumnCount + 0] := pWidth - Round(1.5 * h); //rigth margin ?
    iInnerWidth := aCols[iColumnCount + 0] - aCols[0]; // space between margins ?

    //calculate start of each column
    for i := 0 to iColumnCount - 1 do
      aCols[i + 1] := aCols[i] + Round(oListView.Columns[i].Width / iTotColsWidth * iInnerWidth);
    TopMarg := Round(2.5 * v);
    with Printer.Canvas do
    begin
      Font.Size := 10;
      Font.Style := [];
      Font.Name := 'Times New Roman';
      Font.Color := RGB(0, 0, 0);
      TekstHeight := Printer.Canvas.TextHeight('dummy');
      LinesOnPage := Round((PHeight - (5 * v)) / TekstHeight);
      NumPages := 1;

      // gather number of pages to print
      while (NumPages * LinesOnPage) < oListView.Items.Count do
        inc(NumPages);
      // start
      CurLine := 0;
      for CurItem := 0 to oListView.Items.Count - 1 do
      begin
        if (CurLine > LinesOnPage) or (CurLine = 0) then
        begin
          if (CurLine > LinesOnPage) then Printer.NewPage;
          CurLine := 1;
          if Printer.PageNumber = NumPages then
          begin
            MoveTo(aCols[1], topMarg);
            for i := 1 to iColumnCount - 1 do
            begin
              LineTo(aCols[i], TopMarg + (TekstHeight * (oListView.Items.Count - CurItem + 2)));
              MoveTo(aCols[i + 1], topMarg);
            end;
          end
          else
          begin
            // draw vertical lines between data
            for i := 1 to iColumnCount - 1 do
            begin
              MoveTo(aCols[i], topMarg);
              LineTo(aCols[i], TopMarg + (TekstHeight * (LinesOnPage + 1)));
            end;
          end;

          Font.Style := [fsBold];
          // print column headers
          for i := 0 to iColumnCount - 1 do
          begin
            TextRect(Rect(aCols[i] + Round(0.1 * h), TopMarg - Round(0.1 * v), aCols[i + 1] - Round(0.1 * h)
              , TopMarg + TekstHeight - Round(0.1 * v)), ((aCols[i + 1] - aCols[i]) div 2) +
              aCols[i] - (TextWidth(oListview.Columns.Items[i].Caption) div 2),
              TopMarg - Round(0.1 * v), oListview.Columns.Items[i].Caption);
            //showmessage('print kolom: '+IntToStr(i));
          end;

          // draw horizontal line beneath column headers
          MoveTo(aCols[0] - Round(0.1 * h), TopMarg + TekstHeight - Round(0.05 * v));
          LineTo(aCols[iColumnCount] + Round(0.1 * h), TopMarg + TekstHeight - Round(0.05 * v));

          // print date and page number
          Font.Size := 8;
          Font.Style := [];
          TmpPos := (TextWidth('Date: ' + DateToStr(Date) + ' Page: ' +
            IntToStr(Printer.PageNumber) + ' / ' + IntToStr(NumPages))) div 2;

          TmpPos := PWidth - Round(1.5 * h) - (TmpPos * 2);

          Font.Size := 8;
          Font.Style := [];
          TextOut(TmpPos, Round(0.5 * v), 'Date: ' + DateToStr(Date) +
            ' Page: ' + IntToStr(Printer.PageNumber) + ' / ' + IntToStr(NumPages));

          // print report title
          Font.Size := 18;
          if TmpPos < ((PWidth + TextWidth(EditReport.Text)) div 2 + Round(0.75 * h)) then
            TextOut((PWidth - TextWidth(EditReport.Text)) div 2, Round(1 * v), EditReport.Text)
          else
            TextOut(Round(3 * h), Round(1 * v), EditReport.Text);

          Font.Size := 10;
          Font.Style := [];
        end;

        CurRect.Top := TopMarg + (CurLine * TekstHeight);
        CurRect.Bottom := TopMarg + ((CurLine + 1) * TekstHeight);

        // print contents of Listview
        for CurCol := -1 to iColumnCount - 2 do
        begin
          CurRect.Left := aCols[CurCol + 1] + Round(0.1 * h);
          CurRect.Right := aCols[CurCol + 2] - Round(0.1 * h);
          try
            if CurCol = -1 then
              CurStr := oListView.Items[CurItem].Caption
            else
              CurStr := oListView.Items[CurItem].SubItems[CurCol];
          except
            CurStr := '';
          end;
          CurLeft := CurRect.Left; // align left side
          // write string in TextRect
          TextRect(CurRect, CurLeft, CurRect.Top, CurStr);
        end;
        Inc(CurLine);
      end;
    end;
    Printer.EndDoc;
  end;
end;

procedure TMainForm.BtnQuitClick(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.BtnPrintClick(Sender: TObject);
begin
  PrintListview(Listview);
end;

ali imam gdesku kad ga pozivam "list index out of bounds (5)" Ima li neko neku ideju?
Re: Stampanje ListViewa 30.04.2005. u 01:04 · pre 261 mesec #4
a da recimo generises html kod u kome ces lepo da napravs tabelu i iskoristis internet explorer da odstampas to?
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Re: Stampanje ListViewa 30.04.2005. u 13:05 · pre 261 mesec #5
Kako to da uradim?

Nasao sam jednostavan kod koji od listview pravi bitmap. Kako da odstampam taj bitmap?
Re: Stampanje ListViewa 30.04.2005. u 20:10 · pre 261 mesec #6
Nemase li neka funcija scanlines ili nesto da pristupas na bitmapu
pa to kad imas prekopiras sve piksele na printer canvas
i to bi trebalo da radi malo sam ispao iz delfija ali trebalo bi
da radi...
Potpis
by samadhi
Let there be Pascal and God made Lazarus and blessed Linux
Re: Stampanje ListViewa 30.04.2005. u 22:12 · pre 261 mesec #7
a da jednostavno prekopiras Bitmap.Canvas u Printer.Canvas? Mislim da ima Printer direktno da se pristupa Canvasu. Kopiranje moze sa BitBlt, tako je najbrze
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Re: Stampanje ListViewa 30.04.2005. u 23:06 · pre 261 mesec #8
Prepravio sam ceo program i umesto listview koristim modifikovani stringgrid koji ima opciju print.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme