Ada Gtk print probleen

Status
Niet open voor verdere reacties.

ldries46

Gebruiker
Lid geworden
1 mrt 2006
Berichten
445
Ik heb een probleem met printen in Gtk

Het programma is geprogrammeerd in Ada
Het draait onder Windows 10.
De ontwikkelomgeving is GNAT GPS.
Ik gebruik Gtkada, de laatste download op Adacore

Beschrijving van het probleem
De print werkt correct als ik een document met 19 pagina's print, maar bij
een document van 1 pagina krijg ik een lege pagina en zie ik de print dialoog niet.
hierbij delen waar het fout kan gaan:

In de On_Print procedure:

last_line := integer(nr) - 1;
Print_Op := new Gtkada_Print_Operation_Record;
Gtkada.Printing.Initialize (Print_Op);
Gtk_New(Print_Set);
Set_Current_Page (Print_Op, 1);
Number := long_float(last_line) / long_float(delta_lines);
Number := long_float'Rounding(Number + 0.4999999);
nr_Pages := Gint(Number);
Set_N_Pages (Print_Op, nr_Pages);
Set_Use_Full_Page(Print_Op, true);
Set_Unit (Print_Op, points);
Print_Op.Set_Print_Settings(Print_Set);
--------------------------------------------------------------------
-- procedure On_Draw_Page
-- (Self : not null access Gtk_Print_Operation_Record;
-- Call : Cb_Gtk_Print_Operation_Gtk_Print_Context_Gint_Void;
-- After : Boolean := False);
--------------------------------------------------------------------
On_Draw_Page(Print_Op, Draw);
Result := Connect_and_Run(Print_Op ,Action_Print_Dialog, Main_Window);

Draw is gedeclareerd als:

Draw : Cb_Gtk_Print_Operation_Gtk_Print_Context_Gint_Void
:= Draw_Page'Access;


and the Draw_Page procedure

procedure Draw_Page
(Op : access Gtk_Print_Operation_Record'Class;
Context : not null access Gtk_Print_Context_Record'Class;
Page_Number : Gint) is
Cr : Cairo_Context;
nr : integer;
width : integer;
rb : boolean;
-- re : boolean;
ok : boolean;
str : Unbounded_String;
begin
nr := first_line;
Cr := Get_Cairo_Context (Context);
Set_Source_Rgb (Cr, 0.0, 0.0, 0.0);
Select_font_face(Cr, "Monospace", CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_NORMAL);
Set_Font_Size(Cr, GDouble(9));
if nr = 1 then
pagenr := 1;
else
pagenr := pagenr + 1;
end if;
if pagenr rem 2 = 1 then
width := 70;
else
width := 40;
end if;
if last_page_line > last_line then
last_page_line := last_line;
end if;
ok := false;
while not ok loop
Get_Iter_At_Line(Main_Window.Draw_Buffer, first, Gint(nr));
Get_Iter_At_Line_Offset(Main_Window.Draw_Buffer, endln, Gint(nr),500);
move_to(cr, Gdouble(width), Gdouble((nr - first_line + 1) * 13 + 65));
str := To_Unbounded_String(Get_Text(Main_Window.Draw_Buffer,first,endln));
show_text(cr, To_String(str));
nr := nr + 1;
ok := nr >= last_page_line;
if nr <= last_line then
Forward_Line(first, rb);
end if;
end loop;
first_line := nr - 1;
last_page_line := last_page_line + delta_lines;
end Draw_Page
 
Plaats eerst de code in codetags en met de juiste inspringpunten om het fatsoenlijk leesbaar te maken.
 
Hiebij de gevraagde code tags
In de On_Print procedure:

Code:
last_line := integer(nr) - 1;
Print_Op := new Gtkada_Print_Operation_Record;
Gtkada.Printing.Initialize (Print_Op);
Gtk_New(Print_Set);
Set_Current_Page (Print_Op, 1);
Number := long_float(last_line) / long_float(delta_lines);
Number := long_float'Rounding(Number + 0.4999999);
nr_Pages := Gint(Number);
Set_N_Pages (Print_Op, nr_Pages);
Set_Use_Full_Page(Print_Op, true);
Set_Unit (Print_Op, points);
Print_Op.Set_Print_Settings(Print_Set);
--------------------------------------------------------------------
-- procedure On_Draw_Page
-- (Self : not null access Gtk_Print_Operation_Record;
-- Call : Cb_Gtk_Print_Operation_Gtk_Print_Context_Gint_Void;
-- After : Boolean := False);
--------------------------------------------------------------------
On_Draw_Page(Print_Op, Draw);
Result := Connect_and_Run(Print_Op ,Action_Print_Dialog, Main_Window);
Draw is gedeclareerd als:

Code:
Draw : Cb_Gtk_Print_Operation_Gtk_Print_Context_Gint_Void
:= Draw_Page'Access;


and the Draw_Page procedure

Code:
procedure Draw_Page
(Op : access Gtk_Print_Operation_Record'Class;
Context : not null access Gtk_Print_Context_Record'Class;
Page_Number : Gint) is
Cr : Cairo_Context;
nr : integer;
width : integer;
rb : boolean;
-- re : boolean;
ok : boolean;
str : Unbounded_String;
begin
nr := first_line;
Cr := Get_Cairo_Context (Context);
Set_Source_Rgb (Cr, 0.0, 0.0, 0.0);
Select_font_face(Cr, "Monospace", CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_NORMAL);
Set_Font_Size(Cr, GDouble(9));
if nr = 1 then
pagenr := 1;
else
pagenr := pagenr + 1;
end if;
if pagenr rem 2 = 1 then
width := 70;
else
width := 40;
end if;
if last_page_line > last_line then
last_page_line := last_line;
end if;
ok := false;
while not ok loop
Get_Iter_At_Line(Main_Window.Draw_Buffer, first, Gint(nr));
Get_Iter_At_Line_Offset(Main_Window.Draw_Buffer, endln, Gint(nr),500);
move_to(cr, Gdouble(width), Gdouble((nr - first_line + 1) * 13 + 65));
str := To_Unbounded_String(Get_Text(Main_Window.Draw_Buffer,first,endln));
show_text(cr, To_String(str));
nr := nr + 1;
ok := nr >= last_page_line;
if nr <= last_line then
Forward_Line(first, rb);
end if;
end loop;
first_line := nr - 1;
last_page_line := last_page_line + delta_lines;
end Draw_Page
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan