Wydruk tabeli z formatowaniem

0

Witam wszystkich ;)
Mam mały problem.. otóż nie wiem jak wydrukować tabele bez obramowania (ścianek nie ma być widać na wydrukowanej stronie.. gdyby się tak nie dało.. to mogą być ewentualnie białe).

SZUKAŁEM na forach i znalazłem tylko informację które mi dużo nie pomogą..

Kiedyś używałem metody Printer i Canvas.. lecz to nie zdaje egzaminu, ponieważ nie działa na wszystkich drukarkach :(

Nie chodzi mi też o StringGrida... odpada.. chyba że da się formatować kod a później to wydrukować w takim samym stanie jak na formie... a może ListView?! Da się formatować na nim kod.. a później go wydrukować??

Może powiem dokładniej...
PRZYKŁAD: Macie do zrobienia program.. powiedzmy małą bazę z danymi personalnymi.. Po jednej stronie imię a po lewej nazwisko.. Te dane wpisujecie, a na wydrukowanej kartce są one po różnych stronach.. np. Jan Kowalski. Nazwisko jest pogrubione (znajduję się po prawej stronie) a imię jest na napisane kursywą i na czerwono(na lewo).

Myślałem nad Richedit i stworzeniu tabeli, a później na wydrukowaniu jego (richedit) zawartości.. ale nie wiedziałem jak się odwołać do stworzonych tabel i zmienić ich kolor i pogrubienie

A może są/masz lepsze pomysły jak to zrobić?!

Czy może mi ktoś pomóc..?? Z góry dziękuję za każdy post ;)

Ps. Jeśli nie rozumiesz o co dokładnie mi chodzi to pisz [email protected]

JESZCZE RAZ DZIĘKI ;) ;) ;)

0

Printer.Canvas nie działa na wszystkich drukarkach?

0

Niestety nie... dałem program w obieg i okazało się że niektóre drukarki mają w nosie pozycję naniesioną przez printer na drukarkę i wcały tekst jest w jednej lini... :-/

0
PoP_Gniezno napisał(a)

Kiedyś używałem metody Printer i Canvas.. lecz to nie zdaje egzaminu, ponieważ nie działa na wszystkich drukarkach :(

wina musiała być po Twojej stronie - drukarka drukuje tylko to co jej każesz. Jak możesz to podaj kod.

co do drukowania to masz całą masę darmowych raportów - od QuickReporta i RaveReporta które są razem z Delphi, przez darmowe FreeReport, ZReport, QReport i inne po komercyjne FastReport (i inne :P)

0

Na wasze życzenie kod... Nie wiem niby gdzie miałbym popełnić błąd...Ale jak coś znajdziecie to proszę pisać..Aha i proszę nie patrzeć na "estetykę" kodu bo nie tym się kierowałem..

[...]
var
   ost, x, y, o: integer;

procedure d(pogrubienie, rozmiar, Leftek, Topek : integer; tekst2: string);
var
  pogrubienie2: Tfontstyles;
begin
  case pogrubienie of
  0: pogrubienie2:= [];
  1: pogrubienie2:= [fsbold];
  end;
    with Printer.Canvas.Font do begin
      Name:='MS Sans Serif';
      Style:= pogrubienie2 ;
      Size:= rozmiar;
    end;
    Printer.Canvas.TextOut(leftek, topek, tekst2);
    ost:= topek;
end;

procedure drukuj;
begin
    x:= 50;
    y:= 8;
    o:= 130;
    Printer.Orientation:= poLandscape;
    Printer.BeginDoc;
    d(0,10, o, ost+80, 'Imię:');
    d(0,10, o, ost+80, 'Nazwisko');
    Printer.EndDoc;
end;

[...]

Taki kod wystarczy, aby zobaczyć co jest nie tak.. jest to tylko fragment ale WSZYSTKO wygłada dalej tak samo.. Everything opiera się na jednej procedurze: d(...); Niewiem co jest Tu nie tak.. Na niektórych drukarkach działa.. na innych nie.. Widzicie tu jakieś błędy bo ja nie...

0

AHA... i zapomnialem dodać... darmowe oraz komercyjne komponenty odpadają... mój pracodawca "nie życzy" sobie "babrania" się z instalowaniem dodatkowych komponentów w celu powiedzmy.. poprawienia lub zmodyfikowania programu.. rozumiecie o co mi chodzi?? To musi być coś prostego i zarazem nie sprawiającego problemu dla pracodawcy.. Wiem, że takie rozwiązanie może nie istnieć.. ale warto spytać..

0
  1. zamiast ost jako globalną lepiej topek przekazać z var i go modyfikować
  2. masz już w delphi QuickReport i jak masz D7 min prof to RaveReport
  3. zamiast TextOut spróbuj DrawText
  4. jak jest wszystko w jednej lini to zapisuj wartości zmiennej ost do pliku i zobacz czy to nie jej wina
0
Misiekd napisał(a)
  1. zamiast ost jako globalną lepiej topek przekazać z var i go modyfikować
  2. masz już w delphi QuickReport i jak masz D7 min prof to RaveReport
  3. zamiast TextOut spróbuj DrawText
  4. jak jest wszystko w jednej lini to zapisuj wartości zmiennej ost do pliku i zobacz czy to nie jej wina

Ok wszystko fajnie..
Po pierwsze.. topek nie może być zmienną globalną zamiast ost. ponieważ zmienna topek określa na jakiej pozycji ma być tekst.. topek + ost = poziom tekstu... zobacz dokładnie...

Po drugie.. Rave report i QuickReport nie ma w Dephi 2005.. trzeba zainstalować.. a jak już mówiłem pracodawca odrzuca taką opcję:(

Po trzecie.. Nie wiem czy coś da zmiana TextOut na Drawtext.. jak już mówiłem ta metoda nie działa na NIEKTÓRYCH drukarkach.. a nie na WSZYSTKICH... na większości jest dobrze.

Zobacz jeszcze raz dokładniej... Naprawdę nie mam pojęcia dlaczego tak się dzieję..

0

Przestań "upiększać" text bo to wzrok drażni

PoP_Gniezno napisał(a)

Po pierwsze.. topek nie może być zmienną globalną zamiast ost. ponieważ zmienna topek określa na jakiej pozycji ma być tekst.. topek + ost = poziom tekstu... zobacz dokładnie...

Oj czy ja gdzieś napisałem, żeby ją zrobić globalną? Napisałem "zamiast ost jako globalną lepiej topek przekazać z var i go modyfikować" czyli

procedure d(pogrubienie, rozmiar, Leftek: Integer; var Topek : integer; tekst2: string);
var
  pogrubienie2: Tfontstyles;
begin
  case pogrubienie of
  0: pogrubienie2:= [];
  1: pogrubienie2:= [fsbold];
  end;
    with Printer.Canvas.Font do begin
      Name:='MS Sans Serif';
      Style:= pogrubienie2 ;
      Size:= rozmiar;
    end;
    Printer.Canvas.TextOut(leftek, topek, tekst2);
    topek := Topek + 80;
end;

Po trzecie.. Nie wiem czy coś da zmiana TextOut na Drawtext.. jak już mówiłem ta metoda nie działa na NIEKTÓRYCH drukarkach.. a nie na WSZYSTKICH... na większości jest dobrze.

no jak nie wiesz co jest to trzeba kombinować. Może wiesz np. co to za drukarki, pod jakim systememe itp.

A tak swoją drogą jak chcesz wydrukować tabelę (czy to TTable czy jakąś tablicę 2D) to prościej będzie tak:

procedure Drukuj(Table: TTable);
var
  x, y: Integer;
  w, h: Integer; // wysokość i szerokość obszaru drukowania
  ml, mt: Integer; // margines lewy i górny
  lc: Integer; // liczba lini na stronę
  cl: Integer; // aktualna linia
  Odstęp: Integer;
begin
  Odstep := 4; // odstęp między kolejnymi wierszami
  w := 
  h := 
  ml := 
  mt := //pobranie tych wartości (jak nie wiesz jak to jest w serwisie)
  with Printer, Canvas do
  begin
    Font.Name := 'MS Sans Serif';
    Font.Size := 10;
    Font.Style := [fsBold];
    lc := h div (TextHeight('XX') + Odstep);
    BeginDoc;
    cl := 1;
    Table.First;
    while not Table.EoF do
    begin
      x := ml;
      y := mt + TextHeight('XX') + Odstep;
      TextOut(x, y, Table.FieldByName('pole1').AsString;
      x := x + 100;
      TextOut(x, y, Table.FieldByName('pole2').AsString;
      // reszta pól
      y := y + TextHeight('XX') + Odstep;
      Inc(cl);
      if lc = cl then
      begin
        cl := 1;
        y := mt + TextHeight('XX') + Odstep;
        NewPage;
      end;
      Table.Next;
    end;
    EndDoc;
  end;
end;

pisane z palca na szybko ale +- powinno działać. BTW na sieci jest masa kodów jak wydrukować bez dodatkowych komponentów tabelę czy grida. Ustawianie też za każdym razem tej samej nazwy czcionki to nie jest dobry pomysł - wypadało by wycinać niepotrzebne operacje

0
Misiekd napisał(a)
procedure Drukuj(Table: TTable);
var
  x, y: Integer;
  w, h: Integer; // wysokość i szerokość obszaru drukowania
  ml, mt: Integer; // margines lewy i górny
  lc: Integer; // liczba lini na stronę
  cl: Integer; // aktualna linia
  Odstęp: Integer;
begin
  Odstep := 4; // odstęp między kolejnymi wierszami
  w := 
  h := 
  ml := 
  mt := //pobranie tych wartości (jak nie wiesz jak to jest w serwisie)
  with Printer, Canvas do
  begin
    Font.Name := 'MS Sans Serif';
    Font.Size := 10;
    Font.Style := [fsBold];
    lc := h div (TextHeight('XX') + Odstep);
    BeginDoc;
    cl := 1;
    Table.First;
    while not Table.EoF do
    begin
      x := ml;
      y := mt + TextHeight('XX') + Odstep;
      TextOut(x, y, Table.FieldByName('pole1').AsString;
      x := x + 100;
      TextOut(x, y, Table.FieldByName('pole2').AsString;
      // reszta pól
      y := y + TextHeight('XX') + Odstep;
      Inc(cl);
      if lc = cl then
      begin
        cl := 1;
        y := mt + TextHeight('XX') + Odstep;
        NewPage;
      end;
      Table.Next;
    end;
    EndDoc;
  end;
end;

pisane z palca na szybko ale +- powinno działać. BTW na sieci jest masa kodów jak wydrukować bez dodatkowych komponentów tabelę czy grida. Ustawianie też za każdym razem tej samej nazwy czcionki to nie jest dobry pomysł - wypadało by wycinać niepotrzebne operacje

Ta procedura drukuje tylko ostatni rekord!!!

0
Sidney napisał(a)

Ta procedura drukuje tylko ostatni rekord!!!

tja

1 użytkowników online, w tym zalogowanych: 0, gości: 1