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

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

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

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

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

Сообщение AMD »

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

Код: Выделить всё

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 21:25:25
Откуда: Кишинев

Сообщение AMD »

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

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

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

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

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

Сообщение Attid »

имхо
Printer.Create

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

Сообщение 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;

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

Сообщение AMD »

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 не работает
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

C Printer.Create тоже ^_^ Хотя изменилось - начал ругаться на неподходящий принтер... Кто-нибудь, скиньте рабочий helloworld с печатью...
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

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

Код: Выделить всё

var
  Printer: TPrintDialog;
begin
  Printer := TPrintDialog.Create(nil);
  if Printer.Execute then
  begin
  end;
  Printer.Free;
end;
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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

Код: Выделить всё

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
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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

Сообщение Brainenjii »

Не получается... Задание в очереди появляется, но со статусом "Ошибка"...
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

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
не нужен
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

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

2 AMD
Внимательно читаем исходник и ищем ошибку в своем примере.
у меня использовался компонент TPrintDialog. компонент Tprinter не тестил, но вообще-то он должен ругаться на такое обращение к нему
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

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

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


Вообщето да ошибся вместо TPrintDialog - TPrint
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Код: Выделить всё

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
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

на других виджетах пробывал ?
Ответить