Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2022, 13:48   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Отпечатать Memo использовав поля

Как отпечатать из Memo так чтобы принтер использовал поля настроенные в PageSetupDialog ?

Последний раз редактировалось Kronos913; 21.03.2022 в 13:52.
Kronos913 вне форума Ответить с цитированием
Старый 20.04.2022, 16:05   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Есть какой-то ответ?=)
Kronos913 вне форума Ответить с цитированием
Старый 21.04.2022, 07:07   #3
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Как отпечатать из Memo так чтобы принтер использовал поля настроенные в PageSetupDialog ?
Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Есть какой-то ответ?=)
Для этого нужно страдать (ненавижу графику). Приводить миллиметры в пиксели, учитывать разрешение монитора, принтера и тому подобную гадость.

Код:
procedure SetOffsetsAndPrint;
var
  OffsetLeft, OffsetTop: integer;         //отступы в px
  OffsetLeft_mm, OffsetTop_mm: integer;   //отступы в мм
  ResX, ResY: integer;                    //разрешение принтера
begin
   with Printer do
     begin
      //нам нужно знать разрешение принтера по осям
      resX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
      resY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);

      //приводим логические единицы принтера к линейным
      OffsetLeft := Round((resX/25.4) * OffsetLeft_mm);
      OffsetTop  := Round((resY/25.4) * OffsetTop_mm);

      //в печать
      Title:= 'NewPrint';
      BeginDoc;
      Canvas.TextOut(OffsetLeft, OffsetTop, 'ТЕКСТОВАЯ СТРОКА');
      EndDoc;
     end;
end;
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 21.04.2022, 07:16   #4
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

К тому же, это не решает проблему отступа справа, нужно еще пару этажей кода нагородить. Проще использовать RichEdit, там намного проще реализовать печать с нужными параметрами.
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 22.04.2022, 01:57   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Kronos913, печатать с помощью редакторов отчётов (как это делают все нормальные люди) не предлагать?
northener вне форума Ответить с цитированием
Старый 23.04.2022, 15:45   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Kronos913, печатать с помощью редакторов отчётов (как это делают все нормальные люди) не предлагать?
Предлагайте =)
Kronos913 вне форума Ответить с цитированием
Старый 23.04.2022, 15:49   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Я когда-то пробовал через AssignPrn и переменную текстового файла. Но делать имитацию полей через пустые строки и добавлением пробелов перед каждой строкой - кажется довольно кривым методом

И другой вопрос, как в этому методу присоединить выбор принтера?

Через графический метод пытался, но выходит какая-то хрень если печатать несколько строк...
Kronos913 вне форума Ответить с цитированием
Старый 23.04.2022, 16:02   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Я какой-то такой код сделал. Сейчас на тестах сработал ок, а раньше выдавал ерунду какую-то: строки наслаивались одна на другую

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, i: integer;
begin
 If memo1.Lines.Count>0 then begin
  {Чтобы не тратить бумагу и чернила на тесты, делаю печать в файл}
  Printer.PrinterIndex:=2;

  {Основной код}
  Printer.Canvas.Font:=FontDialog1.Font;
  a:=Printer.Canvas.TextHeight('1p')+1;
  b:=Printer.PageWidth div 20;
  c:=Printer.PageHeight div 30;

  Printer.BeginDoc;
  For i:=0 to memo1.Lines.Count-1 do begin
    Printer.Canvas.TextOut(b, c+(i*(a)), memo1.Lines[i]);
  End;
  Printer.EndDoc;
 end;
end;
Kronos913 вне форума Ответить с цитированием
Старый 23.04.2022, 16:51   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Код:
  label1.Caption:=IntToStr(Printer.PageHeight);
  label2.Caption:=IntToStr(Printer.PageWidth);
Выдало 6600 и 5100
Каково происхождение этих чисел?

Они особо не вяжется с 21 х 29 см стандартного А4
Kronos913 вне форума Ответить с цитированием
Старый 23.04.2022, 18:08   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

А как работает PrintDialog ?

Я никакой обработки не сделал из того что было введено в диалоговом окне, при этом сохранились все настройки (выбор принтера, размер страницы)
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание из поля Memo Qwerik Помощь студентам 8 07.11.2012 11:29
Поля MEMO и тэги форматирования Wind-up Bird Microsoft Office Access 10 10.09.2012 12:54
Свойство Lines поля Memo Jaga_89 Общие вопросы Delphi 8 16.02.2012 18:11
Загрузка Memo поля в Hint Gulik БД в Delphi 1 03.07.2011 00:54
Помещать поля таблицы БД в MEMO ulala Помощь студентам 16 24.10.2010 20:38