Проблема с принтер диалогом

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с принтер диалогом

Сообщение AMD » 22.02.2008 12:18:47

имею такой код

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:='Print on Printer';
  if PD.Execute then
  begin
  Label1.Font:=FontDialog1.Font;
  Printer.Create;
  Printer.BeginDoc;
  Printer.Canvas.Font:=FontDialog1.Font;
  Printer.Canvas.TextOut(50, 200,'Print on Printer');
  Printer.EndDoc;
  Printer.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   FontDialog1.Execute
end;   


На форме две кнопки Button1 и Button2 и Label1
Кнопкой Button2 выбираю шрифт
Кнопкой Button1 вывожу на печать предварительно показав PrintDialog(сдесь PD).
Момент такой если первый раз вывожу на печать все ок
Второй раз нажимаю Button1 вываливается ошибка
вываливается имено на PD.Execute
List index 5117076 out of bonds


Ошибка выскакивает стабильно во второй раз
пробовал все три диалога
PrinterSetupDialog
PrinterDialog
PageSetupDialog
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Re: Проблема с принтер диалогом

Сообщение AMD » 22.02.2008 12:27:46

Вроде нашел проблему но очень странно получается

надо убрать Printer.Free; или Printer.Destroy;

и тогда ошибка пропадает

Но кто лучше разбирается может мне обьяснить

По идее обьект мне не нужен я освобождаю память а потом когда нужен создаю заново Printer.Create
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Attid » 22.02.2008 13:03:38

имхо
Printer.Create

должно ошибку давать, и то что т там нарисовал работает только благодаря багу компиляторы.
Printer это обьект а не клас.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Brainenjii » 22.02.2008 13:10:08

Не по теме, но у меня
Код: Выделить всё
  If PrintDialog1.Execute Then
    If FontDialog1.Execute Then
      Begin
        Printer.BeginDoc;
        Printer.Canvas.Font:=FontDialog1.Font;
        Printer.Canvas.TextOut(40,40,'helloworld');
        Printer.EndDoc;
      End;

Приводит к ошибке в списке заданий принтера...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение AMD » 22.02.2008 13:57:41

Brainenjii писал(а):Не по теме, но у меня
Код: Выделить всё
  If PrintDialog1.Execute Then
    If FontDialog1.Execute Then
      Begin
        Printer.BeginDoc;
        Printer.Canvas.Font:=FontDialog1.Font;
        Printer.Canvas.TextOut(40,40,'helloworld');
        Printer.EndDoc;
      End;

Приводит к ошибке в списке заданий принтера...


Как раз по теме
без Printer.Create не работает
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Brainenjii » 22.02.2008 14:12:49

C Printer.Create тоже ^_^ Хотя изменилось - начал ругаться на неподходящий принтер... Кто-нибудь, скиньте рабочий helloworld с печатью...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Padre_Mortius » 22.02.2008 14:42:19

у меня работает вот такой вариант

Код: Выделить всё
var
  Printer: TPrintDialog;
begin
  Printer := TPrintDialog.Create(nil);
  if Printer.Execute then
  begin
  end;
  Printer.Free;
end;
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Attid » 22.02.2008 14:48:55

смотрим кто такой принтер (кликаем мышей с контролом)

Код: Выделить всё
var
  Printer : TPrinter;


смотрим чтио там есть в инициализации


Код: Выделить всё
INITIALIZATION
  //TPrinter it's an basic object. If you override this object,
  //you must create an instance.
  Printer:=nil;
 
FINALIZATION
  If Assigned(Printer) then
    Printer.Free;
end.

то есть он не создается, но освобаждаетс если про него забыть.

посмотрим в PrintDialog1 что он нам дает ?

PrintersDlgs - OsPrinters - winprinters.inc
а там -

Код: Выделить всё
initialization
  Printer:=TWinPrinter.Create;


все создано до нас (!)

итого минимальный раб пример
Код: Выделить всё
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    Printer.Canvas.Font.Name:='Times New Roman';
    Printer.Canvas.TextOut(20,20,'Hello');
    Printer.EndDoc;
  end;


у меня все работает.
Brainenjii попробуй дебугер отключить.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Attid » 22.02.2008 14:51:18

Padre_Mortius
а у тебя по идеи должен ругнутся что Printer уже обьявлен , лучше использовать другое название, мало ли что в будущем закрутят гайки =) да и возможности ошибится меньше будет.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Brainenjii » 22.02.2008 15:02:13

Не получается... Задание в очереди появляется, но со статусом "Ошибка"...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение AMD » 22.02.2008 23:27:20

Padre_Mortius писал(а):у меня работает вот такой вариант

Код: Выделить всё
var
  Printer: TPrintDialog;
begin
  Printer := TPrintDialog.Create(nil);
  if Printer.Execute then
  begin
  end;
  Printer.Free;
end;


У меня такой не работает
если я декларирую переменую

Printer: Tprinter;

То программа подвисает а потом выдает ошибку
коментирую // Printer: Tprinter;
все ок

Кстати
Printer.Create
не нужен
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Padre_Mortius » 23.02.2008 18:04:52

ни каких траблов не наблюдаю. все компилится и работает. на svn версии от 11/02/2008

2 AMD
Внимательно читаем исходник и ищем ошибку в своем примере.
у меня использовался компонент TPrintDialog. компонент Tprinter не тестил, но вообще-то он должен ругаться на такое обращение к нему
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение AMD » 23.02.2008 19:58:03

Padre_Mortius писал(а):ни каких траблов не наблюдаю. все компилится и работает. на svn версии от 11/02/2008

2 AMD
Внимательно читаем исходник и ищем ошибку в своем примере.
у меня использовался компонент TPrintDialog. компонент Tprinter не тестил, но вообще-то он должен ругаться на такое обращение к нему


Вообщето да ошибся вместо TPrintDialog - TPrint
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Re: Проблема с принтер диалогом

Сообщение VirtUX » 05.01.2009 21:16:04

Код: Выделить всё
PDLG := TPrintDialog.Create(nil);
  if PDLG.Execute then
    begin
      X := 10;
      Y := 10;
      Printer.BeginDoc;
      Printer.Canvas.Font := TabS.Parent.Font;
      for iFor := 0 to pred(LBText.Count) do
        begin
          Printer.Canvas.TextOut(X, Y, LBText.Items.Strings[iFor]);
          Y := Y + Printer.Canvas.GetTextHeight(LBText.Items.Strings[iFor]);
          if Y >= Printer.PageHeight then
            begin
              Y := 0;
              Printer.NewPage;
            end;
        end;
      Printer.EndDoc;
      PDLG.Free;
    end
  else
    case Printer.PrinterState of
      psNoDefine: ShowMessage('Not');
      psReady   : ShowMessage('Ready');
      psPrinting: ShowMessage('Printing');
      psStopped : ShowMessage('Stopped');
    end;   

Первый раз печатает отлично, но все последующие попытки вывести на печать содежимое ListBox приводят к полному молчанию: ни ошибок, ни каких сообщений - глухо, до перезапуска программы.
Lazarus 0.9.27 SVN: 18124
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Проблема с принтер диалогом

Сообщение Attid » 06.01.2009 00:48:08

на других виджетах пробывал ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

Рейтинг@Mail.ru