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
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