Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка 216 при закрытии формы после печати


Автор: DmiSbr 27.12.2010, 12:48
Доброго всем дня !
Возникла проблема при печати на принтер в текстовом режиме. Вот код процедуры:
Код
procedure TForm1.Button1Click(Sender: TObject);
var PrinterName, s: string;
  F: TextFile;
  i, aPrinterIndex: Integer;
  aPrinter: TPrinter;
begin
  PrinterName:='Epson';

  try
    aPrinterIndex:=Printer.PrinterIndex;
    aPrinter := TPrinter.Create;
    for i := 0 to Printer.Printers.Count-1 do begin
      if Printer.Printers.Strings[i] = PrinterName then begin
        aPrinter.PrinterIndex := i;
        SetPrinter(aPrinter);

        AssignPrn(F);
        Rewrite(F);

        s:='Hello World';
        WriteLn(F, s);
        CloseFile(F);
      end;
    end;

    aPrinter.PrinterIndex := aPrinterIndex;
    SetPrinter(aPrinter);
    aPrinter.Free;
  except

  end;
end;
Процедура работает нормально. Смысл всех манипуляций в том, что требуется печатать не на текущий принтер (по умолчанию), а на произвольный. Поэтому предварительно, приходится запоминать индекс текущего принтера, выполнять поиск требуемого, а после печати возвращать текущий. Это работает. Но при закрытии формы выскакивает ошибка "Runtime error 216 at .....". Помогите разобраться, что я сделал не верно.
Заранее спасибо.  

Автор: casinosoftguru 27.12.2010, 17:35
закомментил строку aPrinter.Free; и заработало
с ней ошибка та же плюс в режиме отладки invalid pointer operation
скорей всего софт еще что-то делает при выключении с aprinter после того как ты его Free делаешь..

Автор: DmiSbr 28.12.2010, 06:39
2 casinosoftguru

Да, действительно, работает.
Сделал так
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  aPrinter := TPrinter.Create;
end;
из основной процедуры убрал. Так же убрал 
Код
aPrinter.Free;
 Потестю, отпишусь. 

Автор: DmiSbr 15.3.2011, 10:02
Пришлось вернуться к данному вопросу.
Ошибка осталась, только теперь она появляется при выходе из программы. В чем причина понять не могу. Возможно есть варианты решения проблемы.

Автор: superVad 15.3.2011, 10:13
DmiSbr, вот почитай как я боролся с подобной проблемой - http://forum.vingrad.ru/forum/topic-323453.html.

Автор: cat512 15.3.2011, 17:46
1!Объекты, не пользующиеся преимуществами механизмов автоматического управления временем жизни, в делфи так не создают. 
Правильно писать так:
Код

var
  P: TPrinter;
begin
  P := TPrinter.Create;
  try
    //ДЕЛАЕМ ТО ЧТО НУЖНО
  finally
    P.free;
  end;
end;


2! Далее почтейнейший, что вы делаете???
Код

    SetPrinter(aPrinter);
    aPrinter.Free;

Вы устанавливаете вместо Объекта, созданного VCL свой, и тут же ЕГО УНИЧТОЖАЕТЕ!
Вот потому у вас и происходит ошибка!

Добавлено через 1 минуту и 3 секунды
Уберите SetPrinter!

Автор: CodeMonkey 15.3.2011, 17:53
Я мож и ересь скажу, но: а нафига TPrinter создавать? Он же вроде глобально созданный объект.

Автор: cat512 15.3.2011, 18:11
Цитата(CodeMonkey @ 15.3.2011,  17:53)
Я мож и ересь скажу, но: а нафига TPrinter создавать? Он же вроде глобально созданный объект.

Уточню, я не предлагаю создавать TPrinter. Я лишь подкорректировал код ТС. Если ему так хочется, его право. А создавать его действительно не нужно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)