AssignPrn — Процедура Delphi


Содержание

Обработка файлов в среде Delphi

Лабораторная работа

На тему: «Обработка файлов в среде Delphi»

Задание 1: Создайте приложение, которое создает текстовый файл text1.txt и записывает в него текст, введенный пользователем в окно Edit, после чего закрывает файл.

Создайте форму и задайте для ее свойства Caption значение «Создание файла и вывод в него текста». Разместите на форме компоненты Edit1, Labbel1, Button1, как показано на рис. 6.1. Задайте значения для свойства Label1. Caption – «Введите текст», Button1. Caption – «Сохранить». Выровняйте компоненты и зафиксируйте их положение на форме.

Сохраните файлы модуля под именем main и проекта под именем TextEditFile в папке Обработка текстовых файлов.

Рис. 6.1 Пример формы проекта

Создайте процедуру обработки события кнопки «Сохранить», введите в окне Редактора кода следующий текст:

procedure TForm1. Button1Click (Sender: TObject);

Writeln (f, Edit1. Text);

Запустите приложение и введите в окно Edit следующее предложение – «Мой первый пример текста». Щелкните мышкой на кнопке «Сохранить» и закройте окно приложения.

Откройте окно Проводника Windows папку Обработка текстовых файлов, в которой сохранены файлы проекта. В списке файлов этой папки находится вновь созданный файл text1.txt. Дважды щелкните левой кнопкой мыши на имени файла text1.txt. Убедитесь, что это – тот самый текст, который введен в окне приложения. Откроется окно редактора Блокнот с этим файлом. Закройте окно редактора Блокнот и Проводник.

Задание 2: Создайте приложение, открывающее текстовый файл для чтения и считывающие из него текст в окно Memo. Перед открытием файла следует проверить его наличие, в случае его отсутствия должно выводиться соответствующее сообщение.

Создайте новое приложение (проект). Создайте форму «Чтение текста из файла в окно». На форме разместите компоненты Memo1, Label1, Button1, как показано на рис. 6.2. Задайте значения свойств Label1. Caption – «Текст из файла», Button1. Caption – «Прочитать текст из файла».

Для удаления текста Memo1 из компонента выберите в окне Инспектора объектов объект Memo1, затем на странице Свойства выберите свойсво Lines и в поле со значением Strings произведите двойной щелчок. После этого в окне StringListEditor удалите текст и щелкните мышью на кнопке ОК.

Для обеспечения возможности просмотра в окне Memo1 длинных текстов с использованием вертикальной полосы прокрутки в окне Инспектора объектов выберите свойство ScrollBars значение ssVertical. Выровняйте компоненты и зафиксируйте их положение на форме.

Рис. 6.2 Пример формы приложения

Создайте процедуру обработки события кнопки «Прочитать текст из файла», отредактируйте текст процедуры следующим образом:

procedure TForm1. Button1Click (Sender: TObject);

Работа метода Assign

Delphi , Компоненты и Классы , Процедуры и функции

В общем случае, утверждение «Destination := Source» не идентично утверждению «Destination.Assign(Source)».

Утверждение «Destination := Source» принуждает Destination ссылаться на тот же объект, что и Source, а «Destination.Assign(Source)» копирует содержание объектных ссылок Source в объектные ссылки Destination.

Если Destination является свойством некоторого объекта (тем не менее, и свойство не является ссылкой на другой объект, как, например, свойство формы ActiveControl, или свойство DataSource элементов управления для работы с базами данных), тогда утверждение «Destination := Source» идентично утверждению «Destination.Assign(Source)». Это объясняет, почему LB.Items := MemStr работает, когда MemStr := LB.Items нет.

Статья Работа метода Assign раздела Компоненты и Классы Процедуры и функции может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

assign a procedure in a form to a notify event in delphi

I am trying to assign a procedure defined in the form to the event OnStateChange of the datasource like this:

Initially when I tried doing the above I got the error! Incompatible types: ‘TNotifyEvent’ and ‘procedure, untyped pointer or untyped parameter’

I’m new to delphi and I’m currently learning. I might have not understood what exactly is supposed to be done. It would be really helpful if someone can help me on this problem.

2 Answers 2

Assigning the Method datasourceOnStateChange to the Event of DataModule1.DataSource1.OnStateChange will work:

which could be written as

if you do not need stateChange for other purposes.

is a direct call of the method with DataModule1.AdsTable1 as Sender, not the method it self.

An event is simply a property whose type is a method.

You are trying to assign this event property. But instead of simply assigning the event handler to the property, you are calling the event handler. This code here contains the critical error:

This is a call of the event handler which you simply do not want to make. The component whose property refers to the event handler is the object that calls it.

I can guess how you made this mistake. When you started typing the name of the function, the IDE offered to auto-complete it for you. You accepted this help, but then the IDE dumbly assumed that you wanted to call the function and supplied parentheses for a function call. But you did not want to call the function, you wanted to take a reference to it. This is one of the more frustrating aspects of the IDE.

Полезные процедуры и функции для Делфи

Кто просматривает этот контент: «Тема» (Всего пользователей: 0; Гостей: 1)

X-Shar

Часто бывает когда пишешь чего-либо и не важно на каком языке, бывают уже готовые решения многих задач, что-бы не тратить время на их решения, ну либо просто не изобретать велосипед, существует подборка готовых функций, достаточно просто скопировать их в свою программу и потом вызывать их где нужно !

Существуют даже готовые модули и dll, но здесь предлагаю выкладывать процедуры решающие простые задачи !

Вот к примеру для написания криптора, нужны как минимум вот такие функции, которые решают следующие задачи:

1) Процедура считывает наш файл, получает строку данных из файла в формате String:

delphi — Что такое точная подпись System.Assign (для использования в процедурных выражениях)?

К сожалению, точная подпись Assign недоступна в источнике RTL, и мои попытки угадать, например:

не дал никаких положительных результатов, и компилятор отказывается рассматривать это выражение констатации как процедурное и жалуется на правую стоимость ( E2029 ( expected but ; found) ).

Итак, какой тип я должен использовать для соответствия Delphi RTL?

    4 3
  • 14 май 2020 2020-05-14 13:03:44
  • OnTheFly

3 ответа

Если открыть файл System.pas и прочитать его, то в XE2 у вас есть такие внутренние процедуры:

И я не думаю, что у вас есть глобальная стабильная процедура без подчеркивания в именах — перечисленные являются внутренними компонентами компилятора Delphi, такими как невидимые процедуры, которые скрытно вызываются при объявлении переменной строки или dynarray.

Как и многие процедуры, такие как _Write0LString которые реализуют обычные вызовы WriteLn.

Таким образом, вам нужно будет создать функцию-оболочку, которая вызовет AssignFile и вместо этого AssignFile ссылку на вашу оболочку в вашу переменную;

Однако вы не поместили тег в свою версию Delphi, и разные версии могут иметь разные объявления для встроенных. Поэтому изучите источники своего конкретного Delphi.

Кроме того, зачем вам это нужно? Я помню, что я сделал такую вещь в TurboPascal 5.5 чтобы создать файл на основе строк — make WriteLn действует как C sprintf . Но зачем вам это нужно в современной Delphi, когда вы можете использовать TStream ?

  • 14 май 2020 2020-05-14 13:03:45
  • Arioch The

System.Assign — это внутренняя функция. Официальная документация на него полностью безнадежна. В нем говорится:

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

Не важно. Поскольку он является внутренним, вы не можете назначить его указателю на функцию. Решение состоит в том, чтобы обернуть его собственной функцией.

Затем вы можете назначить эту функцию переменной или константе процедурного типа.

Другой вариант Assign принимает третий параметр, который указывает кодовую страницу, переданную как Word . Вы можете вызвать эту функцию только в том случае, если первым аргументом Assign является TextFile .

Илон Маск рекомендует:  Как запретить браузеру выделять текст

Итак, внутренности — это действительно закон для себя.

Обратите внимание, что в документации указано, что Assign больше не используется. Вместо этого вы должны использовать AssignFile . Документация не лучше вас!

  • 14 май 2020 2020-05-14 13:03:45
  • David Heffernan

Assign — это языковой остаток Delphi, который отслеживает свое происхождение в оригинальном синтаксисе Turbo Pascal. Задолго до перегрузки функций был добавлен синтаксис языка, задолго до того, как был зафиксирован текстовый файл RTL и внутренние структуры данных типа «файл типа», был Assign .

Assign — достаточно простая процедура для использования, но когда вы смотрите на то, что она должна делать, вы увидите, что ее практически невозможно реализовать без какой-либо магии компилятора. File of TFoo создает тип файла, который отличается и несовместим с File of Integer . И все же, оба могут быть переданы в качестве первого параметра Assign .

Сегодня вы, вероятно, могли бы реализовать Assign используя параметр generic type для параметра файла. Общий тип будет соответствовать типу переданной переменной. Это классно и все, но нам нужен способ связать типизированную переменную файла с именем файла строки за 25 лет до того, как дженерики были добавлены в микс.

Assign — это встроенная функция компилятора. Это означает, что он живет за пределами синтаксического пространства Delphi/Pascal. Assign — это, по сути, процедура, соответствующая типу, которая не может быть представлена на строго типизированном языке Delphi/Pascal (без современных и сложных языковых расширений, таких как общие типы). Он не является безличным и не динамически набирается, потому что фактический тип параметра полностью определяется во время компиляции.

Вы не можете взять адрес функции Assign . Даже если бы вы могли, потому что это аморфно, вы не сможете определить тип процедуры, который точно отражает все возможные возможные сигнатуры вызова.

Магические функции компилятора существуют вне языка, чтобы заботиться о задачах, которые не могли быть легко представлены в синтаксисе, доступном в то время. Assign — один из примеров. Writeln () — это другое.

Delphi: заметки программиста. Часть 2

примеры к данной статье скачать

Печать в Delphi

Объект Printer автоматически создается в случае, если в программе указана ссылка на модуль Printers. Этот объект предоставляет программисту все необходимое для того, чтобы научить приложение выводить данные на один из подключенных к компьютеру принтеров.

Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство Canvas объекта Printer, содержащее набор чертежных инструментов, и методы, свойственные классу TCanvas. Размер листа бумаги в пикселах определяют свойства Height и Width, а набор принтерных шрифтов – свойство Fonts.

Печать текста

Существует множество способов печати текста на принтере. Прежде всего следует назвать глобальную процедуру AssignPrn (она определена в модуле Printers), позволяющую использовать принтер как текстовый файл и печатать текстовые строки с помощью процедуры WriteLn. В листинге 1 (PrintText.dpr) приведен полный текст модуля, на форме которого расположены многострочный текстовый редактор Memo1 и четыре кнопки: для выбора текстового файла и ввода его содержимого в редактор, для выбора нужного шрифта отображения/печати документа, для инициации процесса печати и для завершения работы программы.

Листинг 1

Описанный способ печати — самый примитивный: с его помощью невозможно вывести линии, разделяющие колонки или строки, трудно форматировать текст, вставлять заголовки, номера страниц и т.д.

Значительно более гибкие средства обеспечивает свойство Printer.Canvas. Покажем, как с его помощью можно напечатать текст, содержащийся в редакторе Memo1 (PrintText.dpr, листинг 2):

Листинг 2

Как можно увидеть, прямое обращение к чертежным инструментам свойства Canvas требует от программиста значительно больших усилий, но зато предоставляет ему полный контроль над печатным изображением.

Во многих случаях для печати документа и внесения в него элементарных средств форматирования (печать общего заголовка, заголовка на каждой странице, номеров страниц и т.п.) проще использовать специальные компоненты, расположенные на странице QReport палитры компонентов Delphi. Эти компоненты разработаны для создания отчетов по базам данных, но могут с успехом использоваться и для печати обычных документов (PrintText.dpr).

Наконец, очень хороших результатов можно достичь, используя специализированные средства просмотра/печати документов, как, например, текстовый процессор MS Word.

Печать изображений

Печать изображений может показаться очень сложным делом, однако свойство Printer.Canvas содержит метод:

который легко справляется с этой задачей. При обращении к нему в качестве первого параметра указывается прямоугольная область, отводимая на поверхности листа для распечатки изображения, а в качестве второго — объект класса TGraphic, в котором хранится изображение, например:

Отображение файла в память

Для работы с файлом динамической подкачки страниц виртуальной памяти в Windows 32 используется механизм отображения файлов в адресное пространство приложения. Соответствующие функции API доступны любому приложению и могут применяться к любому файлу (кстати, таким способом загружаются в адресное пространство процесса исполняемые файлы и DLL). В результате отображения приложение может работать с файловыми данными как с размещенными в динамической памяти. В большинстве случаев такая возможность не только повышает скорость работы с данными, но и предоставляет программисту уникальные средства обработки сразу всех записей файла. Например, он может с помощью единственного оператора проверить, входит ли заданный образец поиска в какую-либо строку текстового файла.

Отображение файла осуществляется в три приема. Вначале файл создается обращением к функции:

или открывается с помощью:

В обеих функциях FileName — имя файла, возможно, с маршрутом доступа. Параметр Mode определяет режим доступа к файлу и может принимать одно из следующих значений: fmOpenRead — только чтение; fmOpenWrite — только запись; fmOpenReadWrite — чтение и запись. С помощью операции or эти константы можно комбинировать с одной из следующих нескольких функций, регулирующих совместный доступ к файлу: fmShareExclusive — совместный доступ запрещен; fmShareDenyWrite — другим приложениям запрещается запись; fmShareDenyRead — другим приложениям запрещается чтение; fmSchareDenyNone — совместный доступ неограничен. Обе функции возвращают дескриптор созданного (открытого) файла или 0, если операция оказалась неудачной.

На втором этапе создается объект отображения в память. Для этого используется функция:

Здесь hFile — дескриптор файла; lpFileMappingAttributes — указатель на структуру, в которой определяется, может ли создаваемый объект порождать дочерние объекты (обычно не может — NIL); flProtect — определяет тип защиты, применяемый к окну отображения файла (см. об этом ниже); dwMaximumSizeHigh, dwMaximumSizeLow — соответственно старшие и младшие 32 разряда числа, содержащего размер файла (если вы будете отображать файлы длиной до 4 Гбайт, поместите в dwMaximumSizeHigh 0, если в dwMaximumSizeLow — длину файла; а если оба параметра равны 0, то размер окна отображения равен размеру файла); lpName — имя объекта отображения или NIL.

Параметр flProtect задает тип защиты, применяемый к окну просмотра файла, и может иметь одно из следующих значений: PAGE_READONLY — файл можно только читать (файл должен быть создан или открыт в режиме fmOpenRead); PAGE_READWRITE — файл можно читать и записывать в него новые данные (файл открывается в режиме fmOpenReadWrite); PAGE_WRITECOPY — файл открыт для записи и чтения, однако обновленные данные сохраняются в отдельной защищенной области памяти (отображенные файлы могут разделяться приложениями, в этом режиме каждое приложение сохраняет изменения в отдельной области памяти или участке файла подкачки); файл открывается в режиме fmOpenReadWrite или fmOpenWrite; (этот тип защиты нельзя использовать в Windows 95/98). С помощью операции or к параметру flProtect можно присоединить такие атрибуты: SEC_COMMIT — выделяет для отображения физическую память или участок файла подкачки; SEC_IMAGE — информация об атрибутах отображения берется из образа файла; SEC_NOCASHE — отображаемые данные не кэшируются и записываются непосредственно на диск; SEC_RESERVE — резервируются страницы раздела без выделения физической памяти.

Функция возвращает дескриптор объекта отображения или 0, если обращение было неудачным.

Наконец, на третьем этапе создается окно просмотра, то есть собственно отображение данных в адресное пространство программы.

function MapViewOfFile(hFileMappingObject: THandle;dwDesiresAccess: DWord; dwFileOffsetHigh, dwFileIffsetLow, dwNumberOfBytesToMap: DWord): Pointer;

Здесь hFileMappingObject — дескриптор объекта отображения; dwDesiresAccess — определяет способ доступа к данным и может иметь одно из следующих значений: FILE_MAP_WRITE — разрешает чтение и запись (при этом в функции CreateFileMapping должен использоваться атрибут PAGE_READWRITE); FILE_MAP_READ — разрешает только чтение (в функции CreateFileMapping должен использоваться атрибут PAGE_READONLY или PAGE_READWRITE); FILE_MAP_ALL_ACCESS — то же, что и FILE_MAP_WRITE; FILE_MAP_COPY — данные доступны для записи и чтения, однако обновленные данные сохраняются в отдельной защищенной области памяти (в функции CreateFileMapping должен использоваться атрибут PAGE_WRITECOPY); dwFileOffsetHigh, dwFileIffsetLow — определяют соответственно старшие и младшие разряды смещения от начала файла, начиная с которого осуществляется отображение; dwNumberOfBytesToMap — определяет длину окна отображения (0 — длина равна длине файла). Функция возвращает указатель на первый байт отображенных данных или NIL, если обращение к функции оказалось безуспешным.

После использования отображенных данных ресурсы окна отображения нужно освободить функцией:

единственный параметр обращения к которой должен содержать адрес первого отображенного байта, то есть адрес, возвращаемый функцией MapViewOfFile. Закрытие объекта отображения и самого файла осуществляется обращением к функции:

В листинге 3 приводится текст модуля (File­­InMemory.dpr), который создает окно.

Листинг 3

Проект создает дисковый файл, состоящий из 100 тыс. случайных вещественных чисел (можно выбрать другую длину файла, если изменить значение редактора Длина массива). Файл с именем test.dat создается путем отображения файла в память (кнопка Память) и традиционным способом (кнопка Файл). В обоих случаях показывается время счета. Чем больше частота процессора и объем свободной оперативной памяти, тем больше будет разница во времени (листинг 3).

Илон Маск рекомендует:  Псевдокласс out-of-range в CSS

О таймере

Компонент Timer (таймер) служит для отсчета интервалов реального времени. Его свойство Interval определяет интервал временив миллисекундах , который должен пройти от включения таймера до наступления события OnTimer. Таймер включается при установке значения True в его свойство Enabled. Единожды включенный таймер все время будет возбуждать события OnTimer до тех пор, пока его свойство Enabled не примет значения False.

Следует учесть, что в силу специфики реализации стандартного аппаратного таймера IBM-совместимого компьютера минимальный реально достижимый интервал отсчета времени не может быть меньше 55 мс (этот интервал называется тиком), более того, любой интервал времени, отсчитываемый с помощью таймера, всегда кратен 55 мс. Чтобы убедиться в этом, проведите эксперимент, в котором подсчитывается среднее время между двумя срабатываниями таймера (Timer.dpr):

  1. Начните новый проект с пустой формой и положите на нее компонент TTimer.
  2. Установите в свойство Enabled таймера значение False.
  3. Напишите такой модуль главной формы (листинг 4):

Листинг 4

Необходимость нескольких (MaxCount) срабатываний для точного усреднения результата связана с тем, что системные часы обновляются каждые 55 мс. После запуска программы и ввода 1 как требуемого периода срабатывания в редакторе mmOutput вы увидите строку

Задано 1 ms. Получено 55 ms.

в которой указывается, какое реальное время разделяет два соседних события OnTimer. Если вы установите период таймера в диапазоне от 56 до 110 мс, в строке будет указано 110 ms и т.д. (в силу дискретности обновления системных часов результаты могут несколько отличаться в ту или иную сторону).

В ряде практически важных областей применения (при разработке игр, в системах реального времени для управления внешними устройствам и т.п.) интервал 55 мс может оказаться слишком велик. Современный ПК имеет мультимедийный таймер, период срабатывания которого может быть от 1 мс и выше, однако этот таймер не имеет компонентного воплощения, поэтому для доступа к нему приходится использовать функции API.


Общая схема его использования такова. Сначала готовится процедура обратного вызова (call back) с заголовком:

Здесь uID — идентификатор события таймера (см. об этом ниже); uMsg — не используется; dwUser — произвольное число, передаваемое процедуре в момент срабатывания таймера; dw1, dw2 — не используются.

Запуск таймера реализуется функцией:

Здесь uDelay — необходимый период срабатывания таймера (в мс); uResolution — разрешение таймера (значение 0 означает, что события срабатывания таймера будут возникать с максимально возможной частотой; в целях снижения нагрузки на систему вы можете увеличить это значение); lpTimeProc — адрес процедуры обратного вызова; dwUser — произвольное число, которое передается процедуре обратного вызова и которым программист может распоряжаться по своему усмотрению; fuEvent — параметр, управляющий периодичностью возникновения события таймера: TIME_ONESHOT (0) — событие возникает только один раз через uDelay миллисекунд; TIME_PERIODIC (1) — события возникают периодически каждые uDelay мс. При успешном обращении функция возвращает идентификатор события таймера и 0, если обращение было ошибочным.

Таймер останавливается, и связанные с ним системные ресурсы освобождаются функцией:

Здесь uID — идентификатор события таймера, полученный с помощью timeSetEvent.

Иллюстрированный самоучитель по Delphi 7 для профессионалов

Класс TPersistent

«Persistent» в переводе с английского означает «устойчивый», «постоянный». Что же такого постоянного в одноименном классе? Ответ таков: виртуальный метод procedure Assign(Source: TPersistent);.

Этот важнейший метод осуществляет копирование содержимого одного объекта (source) в другой (self, т. е. в объект, вызвавший метод Assign). При этом объект-получатель остается самим собой, чего нельзя достигнуть, используя простое присваивание переменных объектного типа:

Ведь в этом случае указатель на одну область адресного пространства, содержащую экземпляр класса (объект), замещается указателем на другую область адресного пространства, содержащую другой объект.

Метод Assign позволяет продублировать объект – присвоить одному объекту значения всех свойств другого. При этом объекты не обязательно должны быть одного и того же класса; более того, они не обязательно должны находиться в отношениях «родитель-потомок». Данный метод тем и хорош, что позволяет полиморфное присвоение. Конструкция:

Позволяет скопировать содержимое картинки Picture в папку обмена Windows (объект clipboard). Какова здесь логика? Известно, что в папку обмена можно поместить растровую картинку, текст, метафайл, мультимедийные данные и т. п. Метод Assign класса TClipboard переписан таким образом, чтобы обеспечить присвоение (т. е. реальное перемещение в папку обмена) всех этих данных.

Для обеспечения взаимодействия потомков класса TPersistent со средой разработки предназначен метод:

Он возвращает имя объекта для передачи его в Инспектор объектов.

Для взаимодействия с потоками при загрузке и сохранении компонентов предназначен следующий метод:

Класс TPersistent никогда не используется напрямую, от него порождаются потомки, которые должны уметь передавать другим объектам значения своих свойств, но не являться при этом компонентами.

Delphi. Различные способы печати из приложений

Итак, начнем рассмотрение этих способов.

Печать с помощью функций файлового ввода/вывода

Здесь мы будем использовать простейшие функции ввода/вывода в файл, только свяжем выходной поток не с файлом, а с принтером. Рассмотрим пример печати текста, содержащегося в компоненте TEdit:

var P:TextFile;
begin
AssignPrn(P);
Rewrite(P);
Writeln(P, Edit1.text);
CloseFile(P);
End;

Здесь мы объявляем переменную P типа TextFile. Процедура AssignPrn является разновидностью процедуры Assign. Она настраивает переменную P на порт принтера и позволяет работать с ним как с файлом. Rewrite открывает порт для работы, а WriteLn — выводит информацию на печать. Важно закрыть порт принтера командой CloseFile.

Этот способ можно использовать для распечатки строк списка или каких-нибудь других данных, по мере их поступления в программу.

Печать текстов в обогащенном формате методом Print

Если Вы пытались попробовать распечатать тексты из Вашего приложения, то , наверно, Вам известно, что компонент TRichEdit имеет метод Print, позволяющий печатать текст, хранящийся в этом компоненте. Этот метод имеет только один параметр — строку, которая при просмотре в Windows очереди печатаемых заданий является именем задания. Приведу пример использования (хотя он очевиден :)

RichEdit1.Print(‘Print of our RichEdit1’);

Следует заметить, что печать воспроизводит все особенности форматирования текста, так же происходит автоматический перенос строк и разбиение текста на страницы. При этом длина строк ни как не связана с размерами компонента RichEdit.

Печать с помощью объекта Printer

В Дельфи имеется класс печатающих объектов TPprinter, который обеспечивает печать текстов, изображений и других объектов, расположенных на его канве (Canvas).

Модуль Дельфи Printers, содержит переменную Printer, которая является объектов типа TPrinter. Поэтому для использования этой переменной в Ваших программах, надо подключить модуль Printers в оператор Uses (к сожалению автоматически этого не делается)

Рассмотрим подробнее некоторые свойства и методы объекта TPrinter:

Свойство, метод Описание
Canvas Канва — место в памяти, в котором формируется страница или документ перед печатью.
TextOut Метод канвы, позволяющий посылать в нее текст
BeginDoc Используется для начала задания печати
EndDoc Используется для завершения задания печати. При этом печать начинается только после вызова этого метода!
PageHeight Возвращает высоту страницы в пикселах
NewPage Принудительно начинает новую страницу
PageNumber Возвращает номер печатаемой страницы

Приведу два примера печати с помощью объекта TPrinter текста и изображения.

Печать текста можно осуществить так:

Printer.BeginDoc;
Printer.Canvas.TextOut(10,10,’Печатаем с помощью объекта Printer’);
Printer.EndDoc;

Если Вы хотите напечатать изображение, находящееся, например, в компоненте Image1, то код может быть таким: Printer.BeginDoc;
with Image1.Picture.Bitmap do Printer.Canvas.CopyRect(Rect(0,0,Height,Width),Canvas,Rect(0,0,Height,Width));
Printer.EndDoc;

Казалось и бы и здесь все просто, но у объекта Printer есть существенный недостаток: он не производит автоматическое разбиение на строки и страницы, поэтому печатать длинные тексты предпочтительнее с помощью компонента RichEdit или Memo.

Печать форм

У форм в Delphi есть метод Print, который печатает всю клиентскую область формы. При этом полоса заголовка и полоса главного меню формы не печатаются.

Свойство PrintScale определяет опции масштабирования изображения формы при печати:

poNone Масштабирование не используется. Размер изображения может изменяться в зависимости от используемого принтера
poPrintToFit Делается попытка напечатать изображение формы того же размера, который виден на экране
poProportional Увеличивает или уменьшает размер изображения, подгоняя его под размер страницы.

На этом мы заканчиваем обзор способов печати данных из Ваших приложений. Надеюсь, что еще одним вопросом у Вас стало меньше :))

Справочник по компонентам Delphi. Часть 3
Страница 17. Печать данных из приложения

Печать данных из приложения

Практически каждое приложение, работающее в Windows, имеет набор воз­можностей, позволяющих печатать те или иные данные. В состав Delphi вклю­чен специальный модуль — PRINTERS, в котором описан класс TPrinter, инкап­сулирующий интерфейс печати Windows.

Свойства и методы этого класса позволяют разработчику реализовать доста­точно широкий набор возможностей для печати из приложения. Экземпляр объекта TPrinter с именем Printer создается автоматически при запуске приложения, если в его состав включен соответствующий модуль.

Обычно перед началом печати какого-либо документа из приложения необ­ходимо проверить и при необходимости переустановить стандартные парамет­ры. Этот процесс может быть как автоматическим (проверка и переопределение по умолчанию из программы), так и интерактивным (при помощи стандартных диалоговых окон PrintDialog и PrintSetupDialog).

Информацию обо всех инсталлированных в системе принтерах содержит список свойства:

(Ro) property Printers: TStrings;

Свойство доступно только при вьшолнении приложения. Информация о том, какой принтер из списка является текущим, содержится в свойстве:

property Printerlndex: Integer;

Оно возвращает порядковый номер принтера в списке. Значение -1 использу­ется для идентификации принтера, установленного по умолчанию.

Метод procedure GetPrinter(ADevice, ADriver, APort: PChar; var ADeviceMode: THandle);

возвращает параметры текущего принтера, используя для его идентификации значение свойства Printerlndex.

Илон Маск рекомендует:  Iis включение и конфигурирование проверки подлинности

Метод procedure SetPrinter(ADevice, ADriver, APort: PChar; ADeviceMode: THandle);

проверяет, инсталлирован ли в системе принтер с заданными параметрами. В случае успеха этот принтер становится текущим, в случае неудачи инсталлируется новый принтер. Использование этих двух методов не рекомен­дуется справочным руководством, так как по мнению разработчиков вполне достаточно свойств Printers и Printerlndex. Авторы также рекомендуют приме­нять эти методы только подготовленньм разработчикам, если им необходимо работать с драйверами принтеров.

Свойство (Ro) property Fonts: TStrings;

содержит список шрифтов, поддерживаемых текущим принтером. Свойство доступно только при вьшолнении приложения.

Расположение листа бумаги определяется свойством:

property Orientation: TPrinterOrientation;

TPrinterOrientation = (poPortrait, poLandscape) ;

Свойство доступно только при выполнении приложения. Высоту и ширину листа бумаги содержат свойства:

(Ro) property PageHeight: Integer; (R^ property PageWidth: Integer; Свойство property Title: string;

содержит текстовую строку, которая используется для идентификации процесса печати (работы) в списке Диспетчера печати Windows.

Дескриптор принтера, с которым связан объект TPrinter, возвращается в свой­стве:

(Ro) property Handle: HDC;

Поверхность печатаемой страницы доступна для вывода графических объектов (например, изображений) через свойство:

(Ro) property Canvas: TCanvas;

При использовании канвы необходимо проверить используемый принтер на предмет поддержки графики. Свойство доступно только при выполнении приложения.

Для управления процессом печати объект содержит набор методов и свойств:

Начинает печать документа.

Завершает печать документа.

(Ro) property Printing: Boolean; procedure Abort;

Определяет состояние процесса. Возвращает True во время печати.

Используется для прерывания печати.

(Ro) property Aborted: Boolean;

Устанавливается в True, если печать прервана.

Отменяет печать текущей страницы и начинает распечатку следующей. При этом значение свойства PageNumber увеличивается на единицу.

(Ro) property PageNumber: Integer;

Содержит номер печатаемой страницы. Обращение к нему имеет смысл только в процессе печати документа.

procedure BeginDoc;
procedure EndDoc;
procedure NewPage;

В модуле PRINTERS описан метод procedure AssignPrn(var F: Text);

который связывает текстовую файловую переменную с текущим принтером, что позволяет направлять на принтер текстовые данные, используя традиционные процедуры Write и Writeln. При печати используется шрифт, определенный в канве объекта TPrinter. Следующий пример распечатывает

содержимое многострочного редактора PrintMemo при нажатии кнопки

printBtn: procedure PrintForm.PrintBtnClick(Sender: TObject); var PrnTxt: System.Text; i: Integer; begin AssignPrn(PrnTxt) ; Rewrite(PrnTxt) ;

for i := 0 to PrintMemo. Lines .Count -1 do Writeln (PrnTxt, PrintMemo.Lines [ i ]);

Для печати графики необходимо передать требуемый графический объект (изображение, график, фигуру) в канву объекта Printer. В следующем примере при нажатии кнопки PrintBfcn печатается изображение из компо­нента Printlmage:

procedure PrintForm.PrintBtnClick(Sender: TObject); begin with Printer do begin BeginDoc; Canvas.Draw(0, 0, Printlmage.Picture.Graphic); EndDoc ; end;

При необходимости пропорции распечатываемого графического объекта можно скорректировать при помощи свойства формы-контейнера PrintScale.

Класс TStrings — операции со строковыми данными в Делфи

Класс TStrings является базовым классом для операций со строковыми данными. Этот класс представляет собой контейнер для строк (коллекцию или массив строк). Для операций со строками класс TStrings предоставляет соответствующие свойства и методы. От класса TStrings происходит большое количество производных классов, например, TStringList, которые могут использоваться для задания различных типов строк.

Визуальные компоненты, способные работать со списком строк, имеют свойства, которые являются массивами строк, содержащихся в этих компонентах. Например, для списков ListBox и DBListBox и для групп зависимых переключателей RadioGroup и DBRadioGroup таким свойством является Items, а для многострочных редакторов Memo и DbMemoLines.

Указанные свойства для визуальных компонентов ListBox и Memo доступны при разработке и при выполнении приложения, а для визуальных компонентов DBListBox и DBMemo, связанных с данными, — только при выполнении приложения.

Особенности класса TStrings

Рассмотрим особенности и использование класса TStrings на примере свойства Items списков. Работа с другими объектами типа TStrings происходит аналогично.

Каждый элемент списка является строкой, к которой можно получить доступ по ее номеру в массиве строк Items. Отсчет элементов списка начинается с нуля. Для обращения к первому элементу нужно указать Items[0], ко второму— Items[1], к третьему — Items[2] и т. д. При операциях с отдельными строками программист должен контролировать номера строк в списке и не допускать обращения к несуществующему элементу. Например, если список содержит три строки, то попытка работы с десятой строкой приведет к исключению.

Свойство Count

Свойство Count типа Integer задает число элементов в списке. Поскольку первый элемент списка имеет нулевой номер, то номер последнего элемента равен Count-1.

Например, присваивание элементам списка ListBox1 новых значений может быть реализовано так:

Методы Add и Insert

Методы Add и Insert служат для добавления/вставки строк в список. Функция Add (const S: string): integer добавляет заданную параметром S строку в конец списка, а в качестве результата возвращает положение нового элемента в списке. Процедура Insert (Index: Integer; const S: String) вставляет строку S в позицию с номером, определяемым параметром index. При этом элементы списка, находившиеся до операции вставки в указанной позиции и ниже, смещаются вниз.

В приводимой далее процедуре к комбинированному списку СomboBox1 добавляется строка Нажата кнопка Button1:

Заполнение списка с помощью методов AddStrings и AddObject

Для заполнения списка можно использовать методы AddStrings и AddObject. Метод AddStrings позволяет при вызове увеличить содержимое списка более чем на один элемент.

Процедура AddStrings (strings: TStrings) добавляет в конец списка группу строк, определяемую параметром Strings. Класс TStrings позволяет хранить строки и ссылки на объектыпроизвольного типа.

Функция AddObject (const S: String; AObject: TObject): Integer добавляет в конец списка строку S и связанную с ней ссылку на объект, указываемую параметром AObject.

Рассмотрим следующий пример заполнения списка:

Здесь список TS заполняется перечнем названий страниц блокнота PageControl1 при создании формы Form1. Вместе с названиями запоминаются ссылки на страницы. Страницы блокнота имеют тип TTabSheet. Знание типа необходимо при последующей работе с задаваемыми посредством ссылок объектами, в частности, для корректного выполнения операции, такой как программное переключение страниц управляющего элемента PageControl1. Вместо переменной TS можно использовать другой список подходящего типа, например, список компонента ListBox, доступный через свойство Items.

В процессе создания приложений иногда необходимо, чтобы один список содержал те же данные, что и другой. Такое согласование списков достаточно просто выполняется с помощью методов AddStrings и Assign. Последний из методов также позволяет при вызове увеличить содержимое списка более чем на один элемент. Проверить, требуется операция согласования списков или нет, можно с помощью метода Equals.

Процедура Assign

Процедура Assign (Source: TPersistent) присваивает один объект другому, при этом объекты должны иметь совместимые типы. В результате выполнения процедуры информация копируется из одного списка в другой с заменой содержимого. Если размеры списков (число элементов) не совпадают, то после замены число элементов заменяемого списка становится равным числу элементов копируемого списка.

Функция Equals

Функция Equals (Strings: TStrings): Boolean используется для определения, содержат ли два списка строк одинаковый текст. Если содержимое списков совпадает, то функция возвращает значение True, в противном случае— значение False. Содержимое списков одинаково, если списки равны по длине и совпадают все их соответствующие элементы.

В приведенном далее примере производится согласование двух списков по содержанию:

В случае, если списки не совпадают, содержимое списка ListBox1 копируется в список ListBox2, в результате чего содержимое списков становится одинаковым.

Удаление элементов списка с помощью методов Delete и Сlear

Для удаления элементов списка используются методы Delete и Сlear. Метод Delete (index: integer) удаляет элемент с номером, заданным параметром index. При попытке удаления несуществующей строки сообщение об ошибке не выдается, но метод Delete не срабатывает.

при нажатии кнопки Button2 из комбинированного списка ComboBox1 удаляется пятая строка.

Метод Сlear очищает список, удаляя все его элементы в следующей процедуре:

при нажатии кнопки btnClearPersonalList очищается список lbPersonal.

Процедура Move

Процедура Move (Curindex, NewIndex: integer) перемещает элемент из позиции с номером CurIndex в новую позицию с номером NewIndex. Если указанный номер выходит за пределы списка, то возникает исключение.

Поиск элементов в списке процедурой IndexOf

Поиск элемента в списке можно выполнить с помощью метода IndexOf. Процедура IndexOf (const S: string): integer определяет, содержится ли строка S в списке. В случае успешного поиска процедура возвращает номер позиции найденной строки в списке; если строковый элемент не найден, то возвращается значение −1.

Работа с текстовыми файлами с помощью методов SaveToFile и LoadFromFile

У класса TStrings есть методы SaveToFile и LoadFromFile, позволяющие непосредственно работать с текстовыми файлами. Эти методы предоставляют возможность сохранения строк списка в текстовом фате на диске и последующего чтения строк из этого файла. Символы файла кодируются в системе ANSI.

Процедура SaveToFile (const FileName: String) сохраняет строковые элементы списка в файле FileName. Если заданный файл отсутствует на диске, то он создается. В последующем сохраненные строки можно извлечь из файла, используя метод LoadFromFile. Например:

Здесь содержимое списка ListBox3 записывается в файл names.txt каталога C:\COMPANY.

Процедура LoadFromFile (const FileName: String) заполняет список содержимым указанного текстового файла, при этом предыдущее содержимое списка стирается. Если заданный файл отсутствует на диске, то возникает исключение.

Пример заполнения списка содержимым файла:

Файл personal.txt содержит фамилии сотрудников организации. При запуске приложения содержимое этого файла загружается в комбинированный список ComboВох2.

При конструировании приложения изменение списка строк выполняется с помощью строкового редактора String List Editor.

Его можно вызвать из окна Инспектора объектов двойным щелчком мыши в области значения свойства типа TStrings (например, в области значения свойства Items списка ListBox).

Строковый редактор позволяет добавлять строки в список, удалять их из списка и изменять содержимое имеющихся строк.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL