Faq включение и выключение устройств вводавывода из программы на delphi


Содержание

Ввод-вывод данных в delphi

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

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

Переменная := InputBox (заголовок, подсказка, значение);

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

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

S := InputBox(‘Фунты-килограммы’, ‘Введите вес в фунтах’, ‘’);

Выполняется эта инструкция следующим образом. На экран выводится окно ввода (рис. 10).

Рис. 10. Пример окна ввода

После того как в поле ввода будет введено число и выполнен щелчок по кнопке OK, переменная S получит значение. Значение функции InputBox строкового типа. Если программе надо получить значение числового типа, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования.

Функции преобразования типов наиболее часто используются в инструкциях, обеспечивающих ввод и вывод информации. Они отличаются от функций преобразования стандартного Паскаля. В табл. 1 приведены наиболее часто встречающиеся функции преобразования.

В Delphi имеются компоненты, обладающие фокусом ввода, например компонент Edit и компонент Memo. Компоненты, обладающие фокусом ввода, имеют специальное поле для ввода данных. Ввод данных из поля ввода компонента Edit (рис. 11) осуществляется обращением к свойству Text (текст) этого компонента. В этом случае ввод данных из этого компонента может быть такой:

К содержимому компонента TMemo обращаются посредством свойств этого компонента Text и Lines (строки). Компонент TMemo представляет собой многострочный редактор. Текстовая информация в многострочных редакторах располагается в нескольких строках. К строке текста обращаются, используя свойство Lines. Свойство Text содержит весь текст целиком.

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

Вывод в окно сообщения может быть выполнен вызовом процедуры ShowMessage или функции MessageDlg.

Процедура ShowMessage позволяет вывести на экран простое диалоговое окно с текстом и одной командной кнопкой. В общем виде инструкция вызова процедуры ShowMessage выглядит так:

где сообщение – выражение строкового типа.

Функция MessageDlg позволяет снабдить сообщение одним из стандартных значков Windows, например значком “Внимание”, задать количество и тип командных кнопок. На рис. 12 приведен пример окна сообщения, полученного в результате выполнения инструкции

r := MessageDlg(“Дискриминант равен нулю’ + #13

+ ‘Уравнение не имеет действительных корней.’, mtInformation, [mbOK], 0);

Рис. 12. Пример окна сообщения

Функция MessageDlg возвращает результат – число, проверив значение которого можно определить, выбором какой командной кнопки был завершен диалог. В общем виде обращение к функции MessageDlg выглядит так:

Выбор := MessageDlg (сообщение, тип, кнопки, контекстсправки);

Сообщение – это текст выводимого сообщения. Тип – это тип, вид сообщения. Сообщение может быть информационным, предупреждающим или сообщением об ошибке. Текст сообщения задается именованной константой. Именованные константы, определяющие тип сообщения, приводятся в таблице 2.

Именованные константы функции MessageDlg

Число и вид кнопок задается списком “кнопки”, который может состоять из нескольких разделенных запятыми именованных констант, записанных в квадратных скобках. Параметр “контекстсправки” определяет номер экрана справочной системы, который появится при нажатии на клавишув тот момент, когда окно сообщения находится на экране. Если использование справочной системы не предусмотрено, то при вызове функции MessageDlg в качестве параметра должен быть указан ноль.

Информацию можно вывести непосредственно на форму, в компонент Label, диалоговые окна других компонентов. Для вывода информации используются соответствующие свойства компонентов. Как было показано ранее (п 2.1), для вывода информации с помощью метки используется свойство Caption. В компоненте Edit для вывода информации используется свойство Text, в компоненте Memo – свойства Text и Lines.

Создадим приложение для перевода значений температуры из градусов Цельсия в градусы Фаренгейта.

Построение интерфейсной части начнем с изменения свойства Caption новой формы. Затем поместим компонент ТPanel на форму. Компонент TРanel представляет собой контейнер общего назначения. Контейнером называется компонент, предназначенный для размещения на нем других компонентов. Контейнеры предназначены для равномерного размещения компонентов в окне при изменении размеров окна. В инспекторе объектов на странице Properties свойству Align (выравнивание) зададим значение alBottom, а строку свойства Caption очистим. Свойство Align указывает способ выравнивания размещаемого компонента относительно того контейнера, в котором он размещается. Пустая форма представляет собой контейнер. Значение свойства alBottom означает, что панель прижимается к нижней границе формы и растягивается по всей ее длине. Высоту панели изменим таким образом, чтобы на ней поместились три компонента: метка ТLabel, однострочный редактор ТEdit, кнопка ТButton.

Компонент TLabel предназначен для вывода всевозможных сообщений. Свойству Caption придадим значение, комментирующее действия пользователя. Для компонента TButton этому свойству зададим значение “Ok”. В редакторе TEdit очистим свойство Text и изменим ширину этого компонента по своему усмотрению.

На форму поместим многострочный редактор – компонент TМemo. Его свойству Align зададим значение alClient, которое означает, что компонент заполняет всю свободную область контейнера (в данном случае всю свободную область формы). В многострочном редакторе TМemo имеется информация, состоящая из одного слова Memo1. Можно очистить окно редактора, если вызвать диалоговое окно изменения свойства, дважды щелкнув мышью в строке Lines инспектора объектов. Обратившись к свойству Font этого компонента, изменим размер и цвет шрифта текста.

На этом этап конструирования формы заканчивается. Для того чтобы придать форме функциональность, необходимо написать обработчик события. При нажатии на клавишу “Ok”, число из окна однострочного редактора TEdit должно быть пересчитано по формуле

а результат пересчета отражен в TМemo. Обработчик события OnClick (нажатие левой клавиши мыши) может иметь следующий вид:

procedure TForm1.Button1Click(Sender: TObject);

Memo1.Lines.Add(Edit1.Text + ‘ C = ‘ + FormatFloat(‘#####.##’,y) + ‘ F’);

В первом операторе присваивания содержимое окна редактора преобразуется в вещественное число. Второй оператор присваивания – формула пересчета. Для отражения результата расчета в окне TМemo используется метод Add этого компонента. Метод Add класса TStringList добавляет новую строку к имеющемуся в Lines набору строк. Добавленная строка отображается на экране. Параметром метода является строковая переменная. Строковая переменная складывается из содержимого окна редактора Еdit1, строкового представления вещественной переменной y и констант ‘ C=’ и ‘ F’. Функция FormatFloat форматирует значение у с помощью описанного формата (см. приложение 1 файла материалов). Методы Clear и SetFocus позволяют очистить содержимое окна редактора Еdit1 и установить маркер в окно редактора.

Окно приложения для перевода значений температуры представлено на рис. 13.

Рис. 13. Окно приложения для перевода значений температуры

Статьи к прочтению:

Видео урок №1. Ввод и вывод информации в Delphi 7

Похожие статьи:

Для организации диалога пользователя с программой в системе MATLAB имеются специальные команды. В частности, простейший способ ввода числовой и…

Тема 3 Структура VB-программ, классы и процедуры СТРУКТУРА ДОКУМЕНТА 4.3.1. Структура простейших VB-программ 4.3.2. Создание и использование процедур…

Faq включение и выключение устройств ввода/вывода из программы на delphi

windows, messages, Utility;

Ох, чуть не забыл: Если, Вы используете SysUtils в вашем проекте (StrToInt определен там) Вы получаете большой EXE чем обещанный 20k. Если Вы хотите все же иметь20k, Вы не можете использовать SysUtils так, или Вам нужно написать вашу собственную StrToInt программу.

перевод: Владимиров А.М.

От переводчика. Если все же очень трудно обойтись без использования Delphi-форм, то можно поступить как в случае с вводом пароля: форму изменения параметров хранителя сохранить в виде DLL и динамически ее загружать при необходимости. Т.о. будет маленький и шустрый файл самого хранителя экрана и довеска DLL для конфигурирования и прочего (там объем и скорость уже не критичны).

Включение и выключение устройств ввода/вывода из программы на Delphi

Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования… Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:

Enable — требуемое состояние устройств ввода (True — включены, false — выключены). Если ввод заблокирован, то его можно разблокировать вручную — нажать Ctrl+Alt+Del, при появлении меню «Завершение работы программы» ввод разблокируется.

А вот еще интересный прикол.

Включение/выключение монитора программным способом.

Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже не включите (хотя это может быть зависит от монитора, я, во всяком случае, не смог). Только после перезагрузки компьютера.

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

Переключение языка из программы

Для переключения языка применяется вызов LoadKeyboardLayout:

var russian, latin: HKL;

Как отловить нажатия клавиш для всех процессов в системе?

Как приостановить программу в ожидании ввода от пользователя?

Пишу парсер яндекса. Есть момент с каптчей. Ловлю его, отображаю страницу с каптчей в WebBrowser1 .

Как мне заставить программу подождать, пока я введу каптчу, нажму кнопку «каптчу ввел» и тогда она будет продолжать парсить дальше?

  • ShowWessage останавливает, но не форма становится неактивной;
  • Timer — не могу настроить почему-то;
  • Sleep — вешает программу и все-равно не ввести в форму.

2 ответа 2

Можно вывести модальное окно, в котором капчу вбивать, по кнопке ok капчу подставлять в webbrowser, в соответствующий input.

И если идти дальше, то в эту же форму выводить закэшированную картинку капчи, так работает usdownloader (про webbrowser не уверен, но картинку берут и показывают отдельно, это точно), например, если капча не парсится автоматом.

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

Почему? Потому что большинство уведомлений (типа OnClick ) приходят из цикла обработки сообщений. В большинстве случаев, такой цикл в программе один. Это основная «артерия» программы, и если ее надолго перекрыть, то весь GUI данной программы просто встанет (перестанет реагировать на действия пользователя).

Как же в таком случае решать сложные алгоритмы (многоходовки)? Выделить из кода программы по крайней мере один рабочий поток ( TThread ), который будет решать основную задачу. Этот поток может спокойно заснуть, когда надо ( Sleep ), не влияя на работу GUI , подождать наступления какого-нибудь события, открытия семафора, освобождения мьютекса ( WaitForSingleObject/WaitForMultiplyObjects ) и может вывести в GUI необходимую информацию (см. метод Synchronize ) для оповещения пользователя.

В самом GUI лучше обходиться сигнальными инструментами (без ожидания), типа SetEvent , ReleaseSemaphore и т.п. По хорошему, GUI должен только известить рабочий поток о наступлении какого-либо события, например: «пользователь сделал выбор. «, «пользователь изменил параметр. «, «пользователь что-то сделал!», но не решать проблемы/задачи, связанные с этим действием, пусть их решает рабочий поток!

Обучающий курс. 13. Ввод и вывод в Delphi

Знаний, полученных в предыдущих уроках, достаточно, чтобы приступить к изучению механизмов ввода и вывода данных. Общая схема работы программы примерно такова: пользователь вводит данные, программа их считывает, производит с ними какие-то операции и выдаёт результат. Упрощённо: ввод, обработка, вывод. Что мы уже умеем? Для ввода данных нам понадобятся такие элементы как текстовое поле ввода (TEdit) или многострочное поле — TMemo, CheckBox или RadioButton для выбора параметров и др. Для вывода можно использовать текстовую метку (TLabel). Теперь разберём программную часть. Мы уже умеем описывать переменные, знаем, что такое тип данных и какие бывают типы (числа, строки и т.п.) Осталось лишь выяснить как связать визуальные элементы с программным кодом. В примерах, рассмотренных в предыдущих уроках, мы задавали значения переменным вручную (в коде), но это конечно же неприемлемо ни для одной программы. Программа должна быть универсальной и обрабатывать те данные, которые передал пользователь. Для ввода и вывода будут использоваться некоторые функции в Delphi . Что такое функции, зачем они нужны, и как с ними работать, мы рассмотрели на прошлом уроке. Ну что, ближе к делу?

Ввод на примере TEdit

Текстовое поле ввода (TEdit) — простой и в то же время удобный элемент для ввода данных. В поле мы можем ввести и число и текст — никаких ограничений нет. Итак, наша первая задача — узнать, что введено в поле. Для этого мы должны обратиться к свойствам этого объекта. За текст, находящийся в поле, отвечает свойство Text . Именно им мы и воспользуемся. Попробуем считать число, которое будет введено. Расположим на форме само поле (TEdit) и кнопку (TButton). Создадим обработчик нажатия кнопки и сделаем следующее: объявим переменную целочисленного типа, а затем попробуем поместить в неё значение, которое введено в поле.

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := Edit1.Text;
end ;


Казалоось бы, всё верно — переменную мы объявили, и просто хотим узнать, что введено в поле. Попробуем запустить ( F9 ) — всё не так просто! Компилятор сообщает об ошибке:

[Error] Unit1.pas: Incompatible types: ‘Integer’ and ‘TCaption’

Здесь сказано, что типы данных Integer и TCaption не соответствуют друг другу. TCaption — это тип данных свойства Text у TEdit. Этот тип «обозначает» текстовую строку, т.е. любые символы. Становится понятнее? В поле ввода мы можем ввести не только цифры, но и буквы и даже любые знаки, какие есть на клавиатуре (а на самом деле — вообще любые символы из кодовой таблицы). Однако наша переменная — число! Получается, что мы хотим в качестве числа записать символы. Непорядок! Да, вы скажете: но мы ведь будем вводить в поле цифры, а не буквы. Верно, но знает ли об этом компилятор? Конечно нет. А уговорить его не удастся :-)

Несоответствие типов данных — частая ошибка. Преобразовывать одни типы данных в другие требуется очень часто. Наш пример — яркое тому подтверждение. Чтобы работать с числом, мы должны введённый текст (именно текст) преобразовать в число.

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

Для преобразования текста (строки) в целое число служит функция StrToInt() . Название абсолютно точно отражает назначение функции. У функции единственный параметр — строка, а на выходе получается число. Поэтому, чтобы наш пример работал, мы должны написать так:

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
end ;

Теперь программа запустится. Попробуем ввести число и нажать кнопку — никакой ответной реакции не наблюдается. Это верно, ведь мы кроме считывания введённого числа ничего не запрограммировали. А теперь попробуем ввести посторонние символы (т.е. не цифры) — программа «вылетит» с сообщением об ошибке:

В сообщении указана и причина возникновения ошибки: » ‘abc’ — неверное целое число «. Как избегать подобных сообщений, а вместо этого выполнять свои действия, мы разберёмся позже.

Вывод данных на примере TLabel

Прежде чем делать вывод, давайте произведём с введённым числом какие-нибудь операции. К примеру, давайте возведём число в квадрат. Как это делается, вы уже знаете. Вывод осуществим в текстовую метку (TLabel). За текст метки отвечает свойство Caption . В данном случае наши действия должны быть обратными: при вводе мы заносили в переменную введённое в поле значение, а при выводе мы должны значение из переменной перенести в элемент. Caption у TLabel описывается тоже типом данных TCaption , т.е. это текст. А значит мы должны сделать обратное преобразование, т.е. преобразовать число в текстовую строку. Как называется функция для такого перевода, легко догадаться — IntToStr() . Финальный вариант обработчика кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
A := Sqr(A);
Label1.Caption := IntToStr(A)
end ;

Запускаем программу и пробуем:

Простейшая программа ввода-вывода готова.

Где узнать о типах данных свойств?

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

Обратите внимание, что редактор автоматически отслеживает, какие команды содержатся в коде и в этом списке всегда находятся только те пункты, которые применимы в данной ситуации. Так, если написать » A:=Edit1. «, то в списке будет отсутствовать свойство Text , ведь тип переменной A и тип этого свойства не совпадают:

При написании функции StrToInt() строка свойства Text конечно же появится.

Обобщение сказанного

Мы рассмотрели механизм ввода-вывода на примере обработки числа. Если обработке подлежит текст, то преобразовывать типы данных не придётся. Подобным образом осуществляется ввод и вывод практически любых данных, главное — выполнять преобразование одних типов в другие.

Для ввода целых чисел также есть удобный элемент — TSpinEdit . Расположен он на вкладке Samples . По внешнему виду похож на TEdit, только в поле ещё находятся две кнопки со стрелками — для изменения значения. Допустимые границы числа задаются свойствами MinValue и MaxValue , а само значение хранится в свойстве Value .

Илон Маск рекомендует:  Событие onchange в HTML

Работа с вещественными числами

Следует упомянуть и о дробных числах, ведь иногда без них не обойтись. В целом, их ввод и вывод практически такой же, как и целых чисел, только используются функции StrToFloat() и FloatToStr() . Всё просто. Однако с вещественными числами есть одна проблема — разделитель целой и дробной части. Дело в том, что нет определённости, какой символ считать разделителем — точку или запятую. Какой символ выбирается — зависит от настроек операционной системы (в Windows этот знак определяется в Панели управления в разделе Язык и региональные стандарты ). Таким образом, если заточить программу под запятую, то на системах, где установлена точка, работать ничего не будет и будут возникать ошибки во время работы. В то же время, под точку тоже нельзя затачивать программу, ведь может стоять и запятая. К счастью, решение есть. Есть переменная, которую нигде не нужно объявлять, но значение которой можно менять — это переменная DecimalSeparator . Она объявлена в модуле SysUtils и хранит тот символ, который будет считаться разделителем. Установить нужное значение достаточно один раз — например при запуске программы. Вот так можно установить разделителем точку:

procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator := ‘.’ ;
end ;

Другие способы вывода

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

1. Простое окно с сообщением — ShowMessage()

Самое примитивное окно содержит указанный текст и кнопку OK для закрытия окна. Вызвать такое окно можно процедурой ShowMessage() , параметром которой является текст — он и будет отображён в окне. Модифицируем нашу мини-программу, убрав TLabel и заменив строку вывода:

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
A := Sqr(A);
ShowMessage(IntToStr(A));
end ;

В этом случае мы увидим следующее:

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

2. Диалоговое окно — MessageDlg()

Диалоговые окна — более сложный тип окон. Диалоговые окна часто используются для «общения» с пользователем. Однажды такое окно нами уже использовалось — при закрытии окна программы мы спрашивали у пользователя, действительно ли окно нужно закрыть. Теперь разберём работу с такими окнами подробно.

Создаются диалоговые окна функцией MessageDlg() . Это именно функция, а не процедура. Возвращаемым значением является кнопка, которую нажал пользователь. У функции 4 входных параметра:

  • Текст сообщения (тип данных — String );
  • Тип диалогового окна (специальный тип данных — TMsgDlgType ) — указывает на значок, расположенный в окне и на заголовок окна. Этот параметр задаётся одной из следующих констант:
    • mtInformation — информационное окно (значок в окне — буква «i»);
    • mtConfirmation — окно с вопросом (значок — воспросительный знак);
    • mtWarning — предупреждающее окно (значок — восклицательный знак);
    • mtError — окно с сообщением об ошибке (значок — крест на красном фоне);
    • mtCustom — окно без значка, а в заголовке — название исполняемого файла программы (все остальные типы в заголовок помещают соответствующее типу диалога название — Information , Warning и т.д.)
  • Кнопки , которые будут показаны в окне. Каждой кнопке также соответствует определённая константа. Кнопки перечисляются через запятую, а весь этот «комплект» обрамляется квадратными скобками (что означают квадратные скобки — узнаем позже). Вот константы всех доступных кнопок: mbYes , mbNo , mbOK , mbCancel , mbAbort , mbRetry , mbIgnore , mbAll , mbNoToAll , mbYesToAll , mbHelp . Название константы говорит о названии самой кнопки.
  • Четвёртый параметр указывает на индекс раздела в справочной системе , соответствующий данному диалогу. Как правило, не используется и задаётся просто 0 .

В качестве возвращаемых функцией значений служат все те же константы кнопок, только с тем отличием, что вместо » mb » они начинаются на » mr » (сокращения от » modal button » и » modal result » соответственно).

Изменим нашу программу — пусть результат выдаётся в информационном окошке. Обратите внимание, насколько красивее выглядит такое окно:

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
MessageDlg( ‘Квадрат числа ‘ +IntToStr(A)+ ‘ равен ‘ +IntToStr(Sqr(A)),mtInformation,[mbOK],0);
end ;

Примечание: Текстовые строки можно объединять, просто складывая их — знак «+» (см. фрагмент кода выше). Сами строки записываются в одиночных кавычках.

Ну и напоследок попробуем использовать диалог для уточнения у пользователя дополнительной информации. К примеру, если введено отрицательное число, будем спрашивать, нужно ли его возвести в квадрат. Код получится приблизительно таким:

procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
if A then
if MessageDlg( ‘Число отрицательное. Возвести его в квадрат?’ ,mtConfirmation,[mbYes,mbNo],0) = mrYes then
MessageDlg( ‘Квадрат числа ‘ +IntToStr(A)+ ‘ равен ‘ +IntToStr(Sqr(A)),mtInformation,[mbOK],0);
end ;

А результат будем таким:

Внешний вид окон всех типов:

3. Диалоговые окна MessageBox()

C помощью фунции MessageBox() можно также выводить диалоговые окна. По внешнему виду они практически ничем не отличаются от окон MessageDlg() , однако есть возможность указать и заголовок окна. Для формирования строки кода с использованием MessageBox() есть программа Master MessageBox . C помощью неё можно быстро создать нужное диалоговое окно. Проблема MessageBox() в том, что тип диалога и кнопки задаются немного необычным образом.

Ввод с помощью диалогового окна

Специальные окошки существуют не только для вывода на экран, но и для ввода. Примером такого окна является InputBox() . Функции передаётся 3 параметра: текст заголовка окна, текст пояснения и значение, находящееся в поле при показе окна на экран. Введённую в поле строку функция возвращает как значение-результат. Пример:

procedure TForm1.Button2Click(Sender: TObject);
begin
if InputBox( ‘Загадка’ , ‘Сидит дед, в сто шуб одет. Кто его раздевает — тот слёзы проливает. Кто это?’ , » ) = ‘лук’ then
MessageDlg( ‘Правильно!’ ,mtInformation,[mbOk],0)
else
MessageDlg( ‘Вы не угадали.’ ,mtWarning,[mbOk],0)
end ;

Заключение

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

Домашнее задание

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

Faq включение и выключение устройств ввода/вывода из программы на delphi

Решение самой простой задачи на компьютере не обходится без операций ввода-вывода информации. Ввод данных — это передача данных от внешнего устройства в оперативную память для обработки. Вывод — обратный процесс, когда данные передаются после обработки из оперативной памяти на внешнее устройство. Внешним устройством может служить консоль ввода-вывода (клавиатура и монитор), принтер, гибкий или жесткий диск и другие устройства.

Сейчас мы рассмотрим лишь средства консольного ввод-вывода данных. Консоль — это клавиатура плюс монитор. С клавиатуры данные вводятся в программу, а на монитор выводятся результаты ее работы. Консольная модель ввода-вывода, при которой данные представляются потоком символов, не позволяет использовать графических средств. Однако она очень подходит для изучения языка Delphi, так как не загромождает примеры программ излишней информацией о среде и библиотеках программирования.

Итак, давайте последовательно создадим консольное приложение:

  1. Запустите среду Delphi, выберите в главном меню команду File | Close All, а затем — команду File | New.
  2. Выберите «Console Application» и нажмите «OK» (рисунок 2.1)

Теперь, когда есть основа для проверки изучаемого материала, рассмотрим операторы консольного ввода-вывода. К ним относятся Write, Writeln, Read, Readln.

Консольный вывод

Инструкции Write и Writeln служат для вывода чисел, символов, строк и булевских значений на экран. Они имеют следующий формат:

где Y1, Y2. Yn — константы, переменные и результаты выражений. Инструкция Writeln аналогична Write, но после своего выполнения переводит курсор в начало следующей строки.

Если инструкции Write и Writeln записаны без параметров:

то это вызывает пропуск на экране соответственно одной позиции и одной строки.

Консольный ввод

Инструкции ввода обеспечивают ввод числовых данных, символов, строк для последующей обработки в программе. Формат их прост:

где X1, X2, . Xn — переменные, для которых осуществляется ввод значений. Пример:

Если одна инструкция вводит несколько значений:

то все эти значения надо набрать на клавиатуре, отделяя одно значение от другого пробелом, и нажать клавишу Enter.

Если вводится одно значение:

то его следует набрать и нажать клавишу Enter. С этого момента программа может обрабатывать введенное значение в соответствии с алгоритмом решаемой задачи.

Инструкция Readln отличается от Read только одним свойством: каждое выполнение инструкции Readln переводит курсор в начало новой строки, а после выполнения Read курсор остается в той же строке, где и был (потренеруйтесь — и вы быстро поймете разницу).


В простейшем случае в инструкциях Read и Readln параметры можно вообще не указывать:

Оба этих оператора останавливают выполнение программы до нажатия клавиши Enter.

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Базовый файловый ввод-вывод в Delphi

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

Для получения доступа к текстовым файлам служат переменные типа Text:

Прежде чем можно будет приступить к работе с файлом, с помощью процедуры AssignFile его нужно присвоить переменной типа Text. Эта процедура принима­ет два параметра: переменную файла и имя файла.

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

Чтобы подготовить файл к записи, необходимо использовать процедуру Rewrite, которая всегда создаст новый пустой файл. Если файл с таким же именем файла уже существует, процедура Rewrite вначале удаляет существующий файл, а затем заме­няет его новым пустым файлом. Затем процедура открывает файл и устанавливает указатель позиции на начало файла.

При работе с текстовыми файлами процедуре Rewrite необходимо передавать только переменную типа Text:

Когда файл открыт и готов к записи, для записи текста в текстовый файл можно использовать стандартную процедуру WriteLn. При выполнении записи в тексто­вый файл первым параметром, переданным процедуре WriteLn, должна быть пе­ременная файла:

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

Пример программы записи строки текста в текстовый файл приведен в листинге 8.1.

Листинг 8.1. Запись текста в текстовый файл

Для подготовки файла к чтению используется процедура Reset. Эта процедура, подобно процедуре Rewrite, принимает только параметр типа файла. Ее можно считать безопасной в том смысле, что она успешно работает, если дисковод и/или каталог, указанный в имени файла, существует. В отличие от Rewrite, выполне­ние процедуры Reset будет невозможным, если файл, присвоенный переменной файла, не существует.

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

Следующий пример демонстрирует считывание значений из текстового файла и их отображение на экране.

Листинг 8.2. Считывание текста из текстового файла

Этот код будет успешно работать до тех пор, пока существует файл data. txt. Если этот файл не существует, программа даст сбой. Во избежание остановки при­ложения при отсутствии файла необходимо выполнять проверку успешности от­крытия файла с помощью процедуры Reset.

Для выяснения наличия ошибок ввода-вывода необходимо непосредственно после вызова процедуры ввода-вывода, такой как Rewrite или Reset, вызвать функцию IOResult. Функция IOResult возвращает результат последней выпол­ненной операции ввода-вывода. Если IOResult возвращает 0, это означает, что операция была выполнена успешно.

Для выполнения проверки ввода-вывода с помощью функции IOResult необхо­димо вначале отключить автоматическую проверку ввода-вывода. Для включения и отключения проверки ошибок ввода-вывода служит директива компилятора SI. Обычно автоматическую проверку ввода-вывода отключают перед вызовом проце­дуры ввода-вывода и снова включают сразу после выполнения этого вызова:

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

Листинг 8.3. Проверка ошибок ввода-вывода

Помните, что после обращения к процедуре ввода-вывода функцию IOResult можно вызывать только один раз. Это обусловлено тем, что она сбрасывает ре­зультат выполнения последней операции ввода-вывода в 0. Поэтому, если вызвать функцию IOResult дважды подряд, первое обращение к ней правильно сообщит об ошибке, но второе обращение сообщит (ошибочно), что операция была выпол­нена успешно.

Когда нужно выполнить считывание всего текстового файла, его необходимо счи­тывать последовательно до достижения конца файла. Для определения конца файла служит функция Eof. Эта функция принимает единственный параметр файла и воз­вращает булевское значение, указывающее, был ли достигнут конец файла:

Как правило, наиболее рациональный способ считывания текстового файла предусматривает использование цикла while, продолжающего итерации вплоть до достижения конца файла. Следующий пример иллюстрирует копирование со­держимого одного текстового файла в другой с использованиемцикла while not Eof (результаты можно видеть на рис. 8.1).

Листинг 8.4. Копирование текстового файла

Рис. 8.1. Копирование текстового файла

В следующем примере цикл while not Eof в функции GetLineCount исполь­зуется для получения количества строк текстового файла. Полученный результат затем используется в вызове функции SetLength для изменения размера динами­ческого массива.

Листинг 8.5. Загрузка текстового файла в динамический массив

Как только приложение загрузило весь текстовый файл в динамический мас­сив, файл можно закрыть и продолжить работу со строками в памяти. Конечно, со строками в массиве можно выполнять любые действия, но этот код всего лишь с помощью функции Uppercase преобразует (временно) символы строк в прописные и отображает их на экране.

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

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

Обратите внимание, что строковые поля в объявлении записи имеют явно оп­ределенную длину. Длина строки должна быть определена явно, поскольку размер всей записи должен оставаться постоянным. Если требуется сохранить запись в файле на диске, обычные строки использовать нельзя, поскольку их длина может изменяться в любое время и компилятор не может определить их длину во время компиляции.

Существует несколько различий между текстовыми и типизированными фай­лами:

  • При сбросе типизированного файла в нем можно выполнять считывание и запись (при сбросе текстового файла в нем можно выполнять только считы­вание).
  • При выполнении считывания или записи из типизированного файла необ­ходимо использовать процедуры Read и Write, а не ReadLn и WriteLn.

В листинге 8.6 демонстрируется работу с типизированными файлами.

Листинг 8.6. Работа с типизированными файлами

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

Для определения количества записей в файле можно использовать функцию FileSize. Для перехода к определенной записи в файле можно использовать про­цедуру Seek. Эта процедура принимает два параметра: переменную файла и цело­численное значение, указывающее номер записи (начиная с О), к которой необхо­димо выполнить переход.

Нетипизированные файлы — это файлы без определенной структуры. В общем случае, нетипизированные файлы — это типизированные файлы, в которых вме­сто записей используются байты. Объявление переменной нетипизированного файла выглядит следующим образом:

При работе с нетипизированными файлами обращения к процедурам Reset и Rewrite выглядят несколько иначе. Обычно обе эти процедуры в качестве задан­ного по умолчанию размера записи используют 128 байт. При работе с нетипизи­рованными файлами этот размер должен быть установлен равным 1 байту. Это можно выполнить, передавая 1 в качестве второго параметра в обоих вызовах:

Для считывания и записи данных в нетипизированные файлы применяются процедуры BlockRead и BlockWrite. Объявления этих процедур показаны ниже:

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

Обычно этот буфер представляет собой статический массив байтов, но он мо­жет быть также и записью. Третий параметр указывает количество передаваемых байтов. Обычно это число равно размеру массива, который легко определить с по­мощью функции SizeOf. Необязательный параметр-переменная AmtTransferred можно использовать для отслеживания точного числа байтов, переданных в файл и из него.

Приложение, код которого представлен в листинге 8.7, использует процедуры BlockRead и BlockWrite для предоставления пользователю возможности копиро­вания файлов. Приложение также дает пользователю возможность указывать имена исходного и целевого файлов в командной строке, как показано на рис. 8.2.

Рис. 8 .2. Передача параметров приложению

Листинг 8.7. Копирование файлов с помощью процедур BlockRead и BlockWrite

Для выяснения количества параметров, которые пользователь передал прило­жению, применяется функция ParamCount. Эта функция не принимает никаких параметров и возвращает значение 0. если пользователь вызвал приложение без дополнительных параметров.

Для считывания параметров, переданных приложению, служит функция ParamStr, которая принимает единственный параметр типа Integer — индекс параметра. Если передать этой функции значение О, она возвратит путь и имя файла приложения. Индексы пользовательских параметров, если они переданы, начинаются с 1.

Вначале приложение проверяет, передал ли пользователь два параметра в ко­мандной строке. Если да, то ParamStr (1) содержит путь к исходному файлу, а ParamStr (2) — путь к файлу назначения.

Копирование выполняется в процедуре BlockCopyFile.

Ее первая строка:

использует функцию LowerCase для временного преобразования имен обоих фай­лов в строчные буквы и проверяет, указывают ли оба имени файлов на один и тот же файл. Если файл назначения и файл-источник совпадают, никакое копирова­ние не требуется и оператор if-then вызывает процедуру Exit для выхода из про­цедуры.

Основная часть процедуры BlockCopyFile — цикл while, который вызывает процедуры BlockRead и BlockWrite:

Процедура BlockRead считывает из файла 1 Кбайт данных, записывает эти данные в массив Buffer и обновляет переменную BytesRead, которая всегда со­держит точное количество переданных байтов. Выполнение цикла будет повто­ряться до тех пор, пока процедура BlockRead продолжает считывать данные из файла. Когда эта процедура достигнет конца файла, значение переменной BytesRead будет сброшено в 0, условие цикла while станет ложным и копирова­ние файла завершится.

Ввод-вывод данных в delphi

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

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

Переменная := InputBox (заголовок, подсказка, значение);

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

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

S := InputBox(‘Фунты-килограммы’, ‘Введите вес в фунтах’, ‘’);

Выполняется эта инструкция следующим образом. На экран выводится окно ввода (рис. 10).

Рис. 10. Пример окна ввода

После того как в поле ввода будет введено число и выполнен щелчок по кнопке OK, переменная S получит значение. Значение функции InputBox строкового типа. Если программе надо получить значение числового типа, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования.

Функции преобразования типов наиболее часто используются в инструкциях, обеспечивающих ввод и вывод информации. Они отличаются от функций преобразования стандартного Паскаля. В табл. 1 приведены наиболее часто встречающиеся функции преобразования.

В Delphi имеются компоненты, обладающие фокусом ввода, например компонент Edit и компонент Memo. Компоненты, обладающие фокусом ввода, имеют специальное поле для ввода данных. Ввод данных из поля ввода компонента Edit (рис. 11) осуществляется обращением к свойству Text (текст) этого компонента. В этом случае ввод данных из этого компонента может быть такой:

К содержимому компонента TMemo обращаются посредством свойств этого компонента Text и Lines (строки). Компонент TMemo представляет собой многострочный редактор. Текстовая информация в многострочных редакторах располагается в нескольких строках. К строке текста обращаются, используя свойство Lines. Свойство Text содержит весь текст целиком.

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

Вывод в окно сообщения может быть выполнен вызовом процедуры ShowMessage или функции MessageDlg.

Процедура ShowMessage позволяет вывести на экран простое диалоговое окно с текстом и одной командной кнопкой. В общем виде инструкция вызова процедуры ShowMessage выглядит так:

где сообщение – выражение строкового типа.

Функция MessageDlg позволяет снабдить сообщение одним из стандартных значков Windows, например значком “Внимание”, задать количество и тип командных кнопок. На рис. 12 приведен пример окна сообщения, полученного в результате выполнения инструкции

r := MessageDlg(“Дискриминант равен нулю’ + #13

+ ‘Уравнение не имеет действительных корней.’, mtInformation, [mbOK], 0);


Рис. 12. Пример окна сообщения

Функция MessageDlg возвращает результат – число, проверив значение которого можно определить, выбором какой командной кнопки был завершен диалог. В общем виде обращение к функции MessageDlg выглядит так:

Выбор := MessageDlg (сообщение, тип, кнопки, контекстсправки);

Сообщение – это текст выводимого сообщения. Тип – это тип, вид сообщения. Сообщение может быть информационным, предупреждающим или сообщением об ошибке. Текст сообщения задается именованной константой. Именованные константы, определяющие тип сообщения, приводятся в таблице 2.

Именованные константы функции MessageDlg

Число и вид кнопок задается списком “кнопки”, который может состоять из нескольких разделенных запятыми именованных констант, записанных в квадратных скобках. Параметр “контекстсправки” определяет номер экрана справочной системы, который появится при нажатии на клавишув тот момент, когда окно сообщения находится на экране. Если использование справочной системы не предусмотрено, то при вызове функции MessageDlg в качестве параметра должен быть указан ноль.

Информацию можно вывести непосредственно на форму, в компонент Label, диалоговые окна других компонентов. Для вывода информации используются соответствующие свойства компонентов. Как было показано ранее (п 2.1), для вывода информации с помощью метки используется свойство Caption. В компоненте Edit для вывода информации используется свойство Text, в компоненте Memo – свойства Text и Lines.

Создадим приложение для перевода значений температуры из градусов Цельсия в градусы Фаренгейта.

Построение интерфейсной части начнем с изменения свойства Caption новой формы. Затем поместим компонент ТPanel на форму. Компонент TРanel представляет собой контейнер общего назначения. Контейнером называется компонент, предназначенный для размещения на нем других компонентов. Контейнеры предназначены для равномерного размещения компонентов в окне при изменении размеров окна. В инспекторе объектов на странице Properties свойству Align (выравнивание) зададим значение alBottom, а строку свойства Caption очистим. Свойство Align указывает способ выравнивания размещаемого компонента относительно того контейнера, в котором он размещается. Пустая форма представляет собой контейнер. Значение свойства alBottom означает, что панель прижимается к нижней границе формы и растягивается по всей ее длине. Высоту панели изменим таким образом, чтобы на ней поместились три компонента: метка ТLabel, однострочный редактор ТEdit, кнопка ТButton.

Компонент TLabel предназначен для вывода всевозможных сообщений. Свойству Caption придадим значение, комментирующее действия пользователя. Для компонента TButton этому свойству зададим значение “Ok”. В редакторе TEdit очистим свойство Text и изменим ширину этого компонента по своему усмотрению.

На форму поместим многострочный редактор – компонент TМemo. Его свойству Align зададим значение alClient, которое означает, что компонент заполняет всю свободную область контейнера (в данном случае всю свободную область формы). В многострочном редакторе TМemo имеется информация, состоящая из одного слова Memo1. Можно очистить окно редактора, если вызвать диалоговое окно изменения свойства, дважды щелкнув мышью в строке Lines инспектора объектов. Обратившись к свойству Font этого компонента, изменим размер и цвет шрифта текста.

На этом этап конструирования формы заканчивается. Для того чтобы придать форме функциональность, необходимо написать обработчик события. При нажатии на клавишу “Ok”, число из окна однострочного редактора TEdit должно быть пересчитано по формуле

а результат пересчета отражен в TМemo. Обработчик события OnClick (нажатие левой клавиши мыши) может иметь следующий вид:

procedure TForm1.Button1Click(Sender: TObject);

Memo1.Lines.Add(Edit1.Text + ‘ C = ‘ + FormatFloat(‘#####.##’,y) + ‘ F’);

В первом операторе присваивания содержимое окна редактора преобразуется в вещественное число. Второй оператор присваивания – формула пересчета. Для отражения результата расчета в окне TМemo используется метод Add этого компонента. Метод Add класса TStringList добавляет новую строку к имеющемуся в Lines набору строк. Добавленная строка отображается на экране. Параметром метода является строковая переменная. Строковая переменная складывается из содержимого окна редактора Еdit1, строкового представления вещественной переменной y и констант ‘ C=’ и ‘ F’. Функция FormatFloat форматирует значение у с помощью описанного формата (см. приложение 1 файла материалов). Методы Clear и SetFocus позволяют очистить содержимое окна редактора Еdit1 и установить маркер в окно редактора.

Окно приложения для перевода значений температуры представлено на рис. 13.

Рис. 13. Окно приложения для перевода значений температуры

Статьи к прочтению:

Видео урок №1. Ввод и вывод информации в Delphi 7

Похожие статьи:

Для организации диалога пользователя с программой в системе MATLAB имеются специальные команды. В частности, простейший способ ввода числовой и…

Тема 3 Структура VB-программ, классы и процедуры СТРУКТУРА ДОКУМЕНТА 4.3.1. Структура простейших VB-программ 4.3.2. Создание и использование процедур…

Виртуальная библиотека Delphi

Название Виртуальная библиотека Delphi
страница 1/20
Дата конвертации 18.05.2013
Размер 0.51 Mb.
Тип Тексты

Скачано с сайта http://libes.ru
Виртуальная библиотека Delphi

Статьи

Советы по Delphi

Советы по работе с системой

Советы для написания программ-инсталляторов
Регистрация программ в меню «Пуск» Windows 95
Подобная проблема возникает при создании инсталляторов и деинсталляторов. Наиболее простой и гибкий путь — использование DDE. При этом посылаются запросы к PROGMAN. Для этого необходимо поместить на форму компонент для посылки DDE запросов — объект типа TDdeClientConv. Для определенности назовем его DDEClient. Затем добавим метод для запросов к PROGMAN:
При вызове ProgmanCommand возвращает true, если посылка макроса была успешна. Система команд (основных) приведена ниже:
Создать группу с именем «Имя группы», причем в нем могут быть пробелы и знаки препинания. Путь к GRP файлу можно не указывать, тогда он создастся в каталоге Windows.
Удалить группу с именем «Имя группы»
Показать группу в окне, причем состояние — число, определяющее параметры окна:
1 — нормальное состояние + активация
2 — миним.+ активация

3 — макс. + активация

4 — нормальное состояние

Добавить раздел к активной группе. В командной строке, имени размера и путях допустимы пробелы, Xpos и Ypos — координаты иконки в окне, лучше их не задавать, тогда PROGMAN использует значения по умолчанию для свободного места. HotKey — виртуальный код горячей клавиши. Mimimize — тип запуска, 0 — в обычном окне, <>0 — в минимизированном.
Удалить раздел с указанным именем в активной группе
Пример использования:

где path — строка типа String, содержащая полный путь к каталогу (‘C:\Catalog\’);
Как программно создать ярлык?

Затенить кнопку «Закрыть» в заголовке формы
Следующий текст убирает команду «закрыть» из системного меню и одновременно делает серой кнопку «закрыть» в заголовке формы:
Копирование файлов

Копирование методом TurboPascal
Копирование методом потока

Копирование методом LZExpand

Копирование методами Windows

Как скопировать все файлы вместе с подкаталогами
Удаление каталога со всем содержимым
Определение системной информации
Часто при создании систем привязки программ к компьютеру или окон типа System Info или About Box необходимо определить данные о пользователе и о системе. Это можно сделать следующим образом (из примеров по Delphi — программа COA):
Как проинсталлировать свои шрифты?
Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:
Убрать его по окончании работы:
При этом не надо никаких перезагрузок и прочего, после добавления фонт сразу можно использовать. my_font_PathName : string ( не string[nn] для D2+) — содержит полный путь с именем и расширением необходимого фонта. После удаления фонта форточки о нем забывают. Если его не удалить, он (кажется) так и останется проинсталенным, во всяком случае, я это не проверял.
Вставить какую-нибудь программу внутрь EXE файла
1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:
2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES-файл.
3. Далее в тексте нашей программы:
Как написать маленький инсталлятор?
Мне понравился следующий вариант: главное приложение само выполняет функции инсталлятора. Первоначально файл называется Setup.exe. При запуске под этим именем приложение устанавливает себя, после установки программа переименовывает себя и перестает быть инсталлятором.
Пример:

Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается!
С помощью Image Editor из комплекта Delphi3 создаю ресурс содержащий иконки и добавляю его в свой проект. Как известно, одна иконка в ресурсе может иметь два вида 32×32 и 16×16, которые отображаются соответственно при выборе крупных и мелких значков. Я создаю оба изображения, но после компиляции отображается только 16×16 (при крупных значках оно растягивается). Как мне сделать так, чтобы отображались обе иконки?
1. Такая штука работает только под Win 95-98, а в NT вторая икона не учитывается
2. Для редактирования подобных иконок лучше использовать либо Borlad Resourse Workshop или Visual C++ (для иконок годится но для всего остального, извините!)
Работа с принтером.

Delphi имеет стандартный объект для доступа к принтеру — TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет «глюк» — не работают функции Draw и StrethDraw. Но эта проблема поправима — можно использовать функции API. Далее приведены основные поля и методы объекта Printers:
PROPERTY

Aborted:boolean — Показывает, что процесс печати прерван
Canvas:Tcanvas — Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст… Тут есть несколько особенностей, они описаны после описания объекта.
Fonts:Tstrings — Возвращает список шрифтов, поддерживаемых принтером
Handle:HDS — Получить Handle на принтер для использования функций API (см. Далее)
Orientation:TprinterOrientation — Ориентация листа при печати : (poPortrait, poLandscape)
PageHeight:integer — Высота листа в пикселах
PageNumber:integer — Номер страницы, увеличивается на 1 при каждом NewPage
PageWidth:integer — Ширина листа в пикселах
PrinterIndex:integer — Номер используемого принтера по списку доступных принтеров Printers
Printers:Tstrings — Список доступных принтеров
Printing:boolean — Флаг, показывающий, что сейчас идет процесс печати
Title:string — Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
METODS

AssignPrn(f:TextFile) — Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
Abort — Сбросить печать

BeginDoc — Начать печать

NewPage — Начать новую страницу
EndDoc — Завершить печать.

Пример :

Особенности работы с TPrinter

1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и, главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты «поедут».
3. У TPrinter информация о принтере, по видимому, определяются один раз — в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.
Определение параметров принтера через API
Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter — Printer.Handle. Далее вызывается функция API (unit WinProcs) : GetDevice(Handle:HDC; Index:integer):integer;
Index – код параметра, который необходимо вернуть. Для Index существует ряд констант:
DriverVersion — вернуть версию драйвера
Texnology — Технология вывода, их много, основные
dt_Plotter — плоттер

dt_RasPrinter — растровый принтер
dt_Display — дисплей

HorzSize — Горизонтальный размер листа (в мм)
VertSize — Вертикальный размер листа (в мм)
HorzRes — Горизонтальный размер листа (в пикселах)
VertRes — Вертикальный размер листа (в пикселах)
LogPixelX — Разрешение по оси Х в dpi (пиксел /дюйм)
LogPixelY — Разрешение по оси Y в dpi (пиксел /дюйм)
Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все.
Параметры, возвращаемые по LogPixelX и LogPixelY очень важны — они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера. Пример таких функций:
———————————
Данную методику можно с успехом применять для печати картинок — зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) — микроскопической.
Система

Хранитель экрана

1. В файл проекта (*.DPR) добавить строку <$D SCRNSAVE >после строки подключения модулей (Uses. ).
2. У окна формы убрать системное меню, кнопки и придать свойству WindowState значение wsMaximize.
3. Предусмотреть выход из хранителя при нажатии на клавиши клавиатуры, мыши и при перемещении курсора мыши.
4. Проверить параметры с которым был вызван хранитель и если это /c — показать окно настройки хранителя, а иначе (можно проверять на /s, а можно и не проверять) сам хранитель. /p — для отображения в окне установок хранителя экрана.
5. Скомпилировать хранитель экрана.
6. Переименовать *.EXE файл в файл *.SCR и скопировать его в каталог WINDOWS\SYSTEM\.
7. Установить новый хранитель в настройках системы!
Название хранителя может состоять из нескольких слов с пробелами, на любом языке.
При работе хранителя необходимо прятать курсор мыши, только не забывайте восстанавливать его после выхода.
Все параметры и настройки храните в файле .INI, так как хранитель и окно настройки не связаны друг с другом напрямую.
Старайтесь сделать свой хранитель как можно меньше и быстрее. Иначе ваши долго работающие (в фоновом режиме) приложения будут работать еше дольше!
Более подробно о создании хранителя экрана «по всем правилам»
Screen Saver in Win95

Главное о чем стоит упомянуть это, что ваш хранитель экрана будет работать в фоновом режиме и он не должен мешать работе других запущенных программ. Поэтому сам хранитель должен быть как можно меньшего объема. Для уменьшения объема файла в описанной ниже программе не используется визуальные компоненты Delphi, включение хотя бы одного из них приведет к увеличению размера файла свыше 200кб, а так, описанная ниже программа, имеет размер всего 20кб.
Технически, хранитель экрана является нормальным EXE файлом (с расширением .SCR), который управляется через командные параметры строки. Например, если пользователь хочет изменить параметры вашего хранителя, Windows выполняет его с параметром «-c» в командной строке. Поэтому начать создание вашего хранителя экрана следует с создания примерно следующей функции:
Поскольку нам нужно создавать небольшое окно предварительного просмотра и полноэкранное окно, их лучше объединить используя единственный класс окна. Следуя правилам хорошего тона, нам также нужно использовать многочисленные нити. Дело в том, что, во-первых, хранитель не должен переставать работать даже если что-то «тяжелое» случилось, и во-вторых, нам не нужно использовать таймер.
Процедура для запуска хранителя на полном экране — приблизительно такова:
Во-первых, мы проинициализировали некоторые глобальные переменные (описанные далее), затем прячем курсор мыши и создаем окно хранителя экрана. Имейте в виду, что важно уведомлять Windows, что это — хранителя экрана через SystemParametersInfo (это выводит из строя Ctrl-Alt-Del чтобы нельзя было вернуться в Windows не введя пароль). Создание окна хранителя:
Теперь окна созданы используя вызовы API. Я удалил проверку ошибки, но обычно все проходит хорошо, особенно в этом типе приложения.
Теперь Вы можете погадать, как мы получим handle родительского окна предварительного просмотра ? В действительности, это совсем просто: Windows просто передает handle в командной строке, когда это нужно. Таким образом:
Как Вы видите, window handle является вторым параметром (после «-p»).
Чтобы «выполнять» хранителя экрана — нам нужна нить. Это создается с вышеуказанным CreateThread. Процедура нити выглядит примерно так:
Нить просто заставляет обновляться изображения в нашем окне, спит на некоторое время, и обновляет изображения снова. А Windows будет посылать сообщение WM_PAINT на наше окно (не в нить !). Для того, чтобы оперировать этим сообщением, нам нужна процедура:
Если мышь перемещается, кнопка нажала, мы спрашиваем у пользователя пароль:
Это также демонстрирует использование registry на уровне API. Также имейте в виду как мы динамически загружаем функции пароля, используюя LoadLibrary. Запомните тип функции?
TVSSFunc ОПРЕДЕЛЕН как:

Теперь почти все готово, кроме диалога конфигурации. Это запросто:
Трудная часть — это создать диалоговый сценарий (запомните: мы не используем здесь Delphi формы!). Я сделал это, используя 16-битовую Resource Workshop (остался еще от Turbo Pascal для Windows). Я сохранил файл как сценарий (текст), и скомпилированный это с BRCC32:
Почти также легко сделать диалоговое меню:
После того, как пользователь выбрал некоторые установочные параметры, нам нужно сохранить их.
Загружаем параметры так:

Легко? Нам также нужно позволить пользователю установить пароль. Я честно не знаю почему это оставлено разработчику приложений? Тем не менее:
Мы динамически загружаем (недокументированную) библиотеку MPR.DLL, которая имеет функцию, чтобы установить пароль хранителя экрана, так что нам не нужно беспокоиться об этом.
TPCPAFund ОПРЕДЕЛЕН как:

(Не спрашивайте меня что за параметры B и C) Теперь единственная вещь, которую нам нужно рассмотреть, — самая странная часть: создание графики. Я не великий ГУРУ графики, так что Вы не увидите затеняющие многоугольники, вращающиеся в реальном времени. Я только сделал некоторые ящики.
Чтобы закончить создание хранителя, я даю Вам некоторые детали. Первые, глобальные переменные:
Затем исходная программа проекта (.dpr). Красива, а!?
Ох, чуть не забыл: Если, Вы используете SysUtils в вашем проекте (StrToInt определен там) Вы получаете большой EXE чем обещанный 20k. Если Вы хотите все же иметь20k, Вы не можете использовать SysUtils так, или Вам нужно написать вашу собственную StrToInt программу.
Конец.

перевод: Владимиров А.М.

От переводчика. Если все же очень трудно обойтись без использования Delphi-форм, то можно поступить как в случае с вводом пароля: форму изменения параметров хранителя сохранить в виде DLL и динамически ее загружать при необходимости. Т.о. будет маленький и шустрый файл самого хранителя экрана и довеска DLL для конфигурирования и прочего (там объем и скорость уже не критичны).
Включение и выключение устройств ввода/вывода из программы на Delphi
Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования… Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:
Enable — требуемое состояние устройств ввода (True — включены, false — выключены). Если ввод заблокирован, то его можно разблокировать вручную — нажать Ctrl+Alt+Del, при появлении меню «Завершение работы программы» ввод разблокируется.
А вот еще интересный прикол.

Включение/выключение монитора программным способом.
Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже не включите (хотя это может быть зависит от монитора, я, во всяком случае, не смог). Только после перезагрузки компьютера.
Отключить :

Переключение языка из программы
Для переключения языка применяется вызов LoadKeyboardLayout:

— — — — — где то в программе — — —
Как отловить нажатия клавиш для всех процессов в системе?
Вот, может поможет:

Советы по Delphi.

Система

Советы для написания программ-инсталляторов

Регистрация программ в меню «Пуск» Windows 95

Как программно создать ярлык?

Затенить кнопку закрыть в заголовке формы

Копирование файлов

Как скопировать все файлы вместе с подкаталогами

Удаление каталога со всем содержимым

Определение системной информации

Как проинсталлировать свои шрифты?

Вставить какую-нибудь программу внутрь EXE файла

Хочется создать ну очень маленький инсталлятор

Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается!

Работа с принтером

Система

Хранитель экрана

Включение/выключение клавиатуры, мыши и монитора!

Переключение языка из программы на Delphi

Как отловить нажатия клавиш для всех процессов в системе?

Информация о состоянии клавиатуры

Управление питанием ЭВМ из Delphi

Пример получения списка запущенных приложений.

Как отключить показ кнопки программы в TaskBar и по Alt-Tab и в Ctrl-Alt-Del

Добавление программы в автозапуск

Удалить файл в корзину? Запросто!

Добавить ссылку на мой файл в меню Пуск|Документы

Устанавливаем свой WallPaper для Windows

Как запретить кнопку Close [x] в заголовке окна.


Каким образом можно изменить системное меню формы?

Запуск внешней программы и ожидание ее завершения

Как узнать местоположение специальных папок у Windows?

Как воспроизвести wav-файл из ресурса (в EXE) ?

Как скрыть таскбар?

События нажатия на системные кнопки формы (минимизация, закрытие. )

Сети. Как подключить и отключить сетевой дисковод из своей программы?

Внешние модули (DLL), нити

Надо подключить DLL и использовать некоторые ее функции.

Как передать при создании нити (Tthread) ей некоторое значение?

CGI-програма должна выдавать в браузер Gif изображение.

Подобная проблема возникает при создании инсталляторов и деинсталляторов. Наиболее простой и гибкий путь — использование DDE. При этом посылаются запросы к PROGMAN. Для этого необходимо поместить на форму компонент для посылки DDE запросов — объект типа TDdeClientConv. Для определенности назовем его DDEClient. Затем добавим метод для запросов к PROGMAN:

При вызове ProgmanCommand возвращает true, если посылка макроса была успешна. Система команд (основных) приведена ниже:
Create(Имя группы, путь к GRP файлу)
Создать группу с именем «Имя группы», причем в нем могут быть пробелы и знаки препинания. Путь к GRP файлу можно не указывать, тогда он создастся в каталоге Windows.
Delete(Имя группы)
Удалить группу с именем «Имя группы»
ShowGroup(Имя группы, состояние)
Показать группу в окне, причем состояние — число, определяющее параметры окна:
1-нормальное состояние + активация
2-миним.+ активация
3-макс. + активация
4-нормальное состояние
5-Активация
AddItem(командная строка, имя раздела, путь к иконке, индекс иконки (с 0), Xpos,Ypos, рабочий каталог, HotKey, Mimimize)
Добавить раздел к активной группе. В командной строке, имени размера и путях допустимы пробелы, Xpos и Ypos — координаты иконки в окне, лучше их не задавать, тогда PROGMAN использует значения по умолчанию для свободного места. HotKey — виртуальный код горячей клавиши. Mimimize — тип запуска, 0-в обычном окне, <>0 — в минимизированном.
DeleteItem(имя раздела)
Удалить раздел с указанным именем в активной группе
Пример использования:
ProgmanCommand(‘CreateGroup(Комплекс программ для каталогизации литературы,)’);
ProgmanCommand(‘AddItem(‘+path+’vbase.hlp,Справка по VBase,’+ path +’ vbase.hlp, 0, , , ‘+ path + ‘,,)’);
где path — строка типа String, содержащая полный путь к каталогу (‘C:\Catalog\’);

Копирование методом TurboPascal

Как скопировать все файлы вместе с подкаталогами

Определение системной информации.

Часто при создании систем привязки программ к компьютеру или окон типа System Info или About Box необходимо определить данные о пользователе и о системе. Это можно сделать следующим образом (из примеров по Delphi — программа COA):

Как проинсталлировать свои шрифты?

Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:

При этом не надо никаких перезагрузок и прочего, после добавления фонт сразу можно использовать. my_font_PathName : string ( не string[nn] для D2+) — содержит полный путь с именем и расширением необходимого фонта. После удаления фонта форточки о нем забывают. Если его не удалить, он (кажется) так и останется проинсталенным, во всяком случае, я это не проверял.

Вставить какую-нибудь программу внутрь EXE файла

1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:
ARJ EXEFILE C:\UTIL\ARJ.EXE
2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES-файл.
3. Далее в тексте нашей программы:

Как написать маленький инсталлятор ?

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

Работа с принтером.

Delphi имеет стандартный объект для доступа к принтеру — TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет «глюк» — не работают функции Draw и StrethDraw. Но эта проблема поправима — можно использовать функции API. Далее приведены основные поля и методы объекта Printers :
PROPERTY
Aborted:boolean — Показывает, что процесс печати прерван
Canvas:Tcanvas — Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст . . Тут есть несколько особенностей, они описаны после описания объекта.
Fonts:Tstrings — Возвращает список шрифтов, поддерживаемых принтером
Handle:HDS — Получить Handle на принтер для использования функций API (см. Далее)
Orientation:TprinterOrientation — Ориентация листа при печати : (poPortrait, poLandscape)
PageHeight:integer — Высота листа в пикселах
PageNumber:integer — Номер страницы, увеличивается на 1 при каждом NewPage
PageWidth:integer — Ширина листа в пикселах
PrinterIndex:integer — Номер используемого принтера по списку доступных принтеров Printers
Printers:Tstrings — Список доступных принтеров
Printing:boolean — Флаг, показывающий, что сейчас идет процесс печати
Title:string — Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати

METODS
AssignPrn(f:TextFile) — Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
Abort — Сбросить печать
BeginDoc — Начать печать
NewPage — Начать новую страницу
EndDoc — Завершить печать.

Особенности работы с TPrinter

1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты «поедут».
3. У TPrinter информация о принтере, по видимому, определяются один раз — в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.
Определение параметров принтера через API
Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter — Printer.Handle. Далее вызывается функция API (unit WinProcs) : GetDevice(Handle:HDC; Index:integer):integer;
Index — код параметра, который необходимо вернуть. Для Index существует ряд констант :
DriverVersion — вернуть версию драйвера
Texnology — Технология вывода, их много, основные
dt_Plotter — плоттер
dt_RasPrinter — растровый принтер
dt_Display — дисплей
HorzSize — Горизонтальный размер листа (в мм)
VertSize — Вертикальный размер листа (в мм)
HorzRes — Горизонтальный размер листа (в пикселах)
VertRes — Вертикальный размер листа (в пикселах)
LogPixelX — Разрешение по оси Х в dpi (пиксел /дюйм)
LogPixelY — Разрешение по оси Y в dpi (пиксел /дюйм)
Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все.
Параметры, возвращаемые по LogPixelX и LogPixelY очень важны — они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера. Пример таких функций:

Данную методику можно с успехом применять для печати картинок — зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) — микроскопической.

Хранитель экрана

1.В файл проекта (*.DPR) добавить строку <$D SCRNSAVE >после строки подключения модулей (Uses. ).
2.У окна формы убрать системное меню, кнопки и придать свойству WindowState значение wsMaximize.
3.Предусмотреть выход из хранителя при нажатии на клавиши клавиатуры, мыши и при перемещении курсора мыши.
4.Проверить параметры с которым был вызван хранитель и если это /c — показать окно настройки хранителя, а иначе (можно проверять на /s, а можно и не проверять) сам хранитель. /p — для отображения в окне установок хранителя экрана.
5.Скомпилировать хранитель экрана.
6.Переименовать *.EXE файл в файл *.SCR и скопировать его в каталог WINDOWS\SYSTEM\.
7.Установить новый хранитель в настройках системы!

Название хранителя может состоять из нескольких слов с пробелами, на любом языке.
При работе хранителя необходимо прятать курсор мыши, только не забывайте восстанавливать его после выхода.
Все параметры и настройки храните в файле .INI, так как хранитель и окно настройки не связаны друг с другом напрямую.
Старайтесь сделать свой хранитель как можно меньше и быстрее. Иначе ваши долго работающие (в фоновом режиме) приложения будут работать еше дольше!

Более подробно о создании хранителя экрана «по всем правилам»
Screen Saver in Win95

Главное о чем стоит упомянуть это, что ваш хранитель экрана будет работать в фоновом режиме и он не должен мешать работе других запущенных программ. Поэтому сам хранитель должен быть как можно меньшего объема. Для уменьшения объема файла в описанной ниже программе не используется визуальные компоненты Delphi, включение хотя бы одного из них приведет к увеличению размера файла свыше 200кб, а так, описанная ниже программа, имеет размер всего 20кб.
Технически, хранитель экрана является нормальным EXE файлом (с расширением .SCR), который управляется через командные параметры строки. Например, если пользователь хочет изменить параметры вашего хранителя, Windows выполняет его с параметром «-c» в командной строке. Поэтому начать создание вашего хранителя экрана следует с создания примерно следующей функции:

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

Во-первых, мы проинициализировали некоторые глобальные переменные (описанные далее), затем прячем курсор мыши и создаем окно хранителя экрана. Имейте в виду, что важно уведомлять Windows, что это — хранителя экрана через SystemParametersInfo (это выводит из строя Ctrl-Alt-Del чтобы нельзя было вернуться в Windows не введя пароль). Создание окна хранителя:

Теперь окна созданы используя вызовы API. Я удалил проверку ошибки, но обычно все проходит хорошо, особенно в этом типе приложения.
Теперь Вы можете погадать, как мы получим handle родительского окна предварительного просмотра ? В действительности, это совсем просто: Windows просто передает handle в командной строке, когда это нужно. Таким образом:

Как Вы видите, window handle является вторым параметром (после «-p»).
Чтобы «выполнять» хранителя экрана — нам нужна нить. Это создается с вышеуказанным CreateThread. Процедура нити выглядит примерно так:

Нить просто заставляет обновляться изображения в нашем окне, спит на некоторое время, и обновляет изображения снова. А Windows будет посылать сообщение WM_PAINT на наше окно (не в нить !). Для того, чтобы оперировать этим сообщением, нам нужна процедура:

Если мышь перемещается, кнопка нажала, мы спрашиваем у пользователя пароль:

Это также демонстрирует использование registry на уровне API. Также имейте в виду как мы динамически загружаем функции пароля, используюя LoadLibrary. Запомните тип функции?
TVSSFunc ОПРЕДЕЛЕН как:

Type
TVSSPFunc = Function(Parent : hWnd) : Bool; StdCall;

Теперь почти все готово, кроме диалога конфигурации. Это запросто:

Трудная часть -это создать диалоговый сценарий (запомните: мы не используем здесь Delphi формы!). Я сделал это, используя 16-битовую Resource Workshop (остался еще от Turbo Pascal для Windows). Я сохранил файл как сценарий (текст), и скомпилированный это с BRCC32:

Почти также легко сделать диалоговое меню:

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

Загружаем параметры так:

Легко? Нам также нужно позволить пользователю, установить пароль. Я честно не знаю почему это оставлено разработчику приложений ? Тем не менее:

Мы динамически загружаем (недокументированную) библиотеку MPR.DLL, которая имеет функцию, чтобы установить пароль хранителя экрана, так что нам не нужно беспокоиться об этом.
TPCPAFund ОПРЕДЕЛЕН как:

Type
TPCPAFunc = Function(A : PChar; Parent : hWnd; B,C : Integer) : Integer; StdCall;

(Не спрашивайте меня что за параметры B и C) Теперь единственная вещь, которую нам нужно рассмотреть, — самая странная часть: создание графики. Я не великий ГУРУ графики, так что Вы не увидите затеняющие многоугольники, вращающиеся в реальном времени. Я только сделал некоторые ящики.

Чтобы закончить создание хранителя, я даю Вам некоторые детали. Первые, глобальные переменные:

Затем исходная программа проекта (.dpr). Красива, а!?

Ох, чуть не забыл: Если, Вы используете SysUtils в вашем проекте (StrToInt определен там) Вы получаете большой EXE чем обещанный 20k. Если Вы хотите все же иметь20k, Вы не можете использовать SysUtils так, или Вам нужно написать вашу собственную StrToInt программу.
Конец.

Use Val. ;-)
перевод: Владимиров А.М.
От переводчика. Если все же очень трудно обойтись без использования Delphi-форм, то можно поступить как в случае с вводом пароля: форму изменения параметров хранителя сохранить в виде DLL и динамически ее загружать при необходимости. Т.о. будет маленький и шустрый файл самого хранителя экрана и довеска DLL для конфигурирования и прочего (там объем и скорость уже не критичны).

Включение и выключение устройств ввода/вывода из программы на Delphi

Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования . . Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:
EnableHadwareInput(Enable:boolean): boolean;
Enable — требуемое состояние устройств ввода (True — включены, false — выключены). Если ввод заблокирован, то его можно разблокировать вручную — нажать Ctrl + Alt + Del, при появлении меню «Завершение работы программы» ввод разблокируется.

А вот еще интересный прикол.
Включение/выключение монитора программным способом.

Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже не включите (хотя это может быть зависит от монитора, я, во всяком случае, не смог). Только после перезагрузки компьютера.

Отключить :
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

Включить :
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

Переключение языка из программы

Для переключения языка применяется вызов LoadKeyboardLayout:

Информация о состоянии клавиатуры

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

О состоянии клавиатуры дают информацию следующие функции:
GetKeyState, GetAsyncKeyState, GetKeyboardState.
Чтобы упростить себе жизнь и не возиться с этими функциями снова и снова я написал маленькие функции:

Управление питанием из программы на Delphi

При написании разнообразны программ типа заставок, менеджеров управления компьютером . возникает необходимость переводить компьютер в режим «спячки». Для включения этого режима в Windows 95 (и только в ней !!) предусмотрена команда API:
SetSystemPowerState(Suspended, Mode: Boolean):boolean;
Suspended должно быть TRUE для ухода в спячку.
Mode — режим входа в спячку. Если TRUE, то всем программам и драйверам посылается Message PBT_APMSUSPEND, по которому они должны немедленно прекратить работу. Если FALSE, то посылается Message PBT_APMQUERYSUSPEND запроса на спячку, и драйвера в ответ могут дать отказ на включение режима спячки.
Возврат функции SetSystemPowerState: TRUE — режим включен.

Как отключить показ кнопки программы в TaskBar и по Alt-Tab и в Ctrl-Alt-Del

Внеся изменения (выделенные цветом) в свой проект вы получите приложение, которое не видно в TaskBar и на него нельзя переключиться по Alt-Tab

Если включить синий коментарий, то получите очень интересное приложение. Оно не видно в TaskBar и на него нельзя переключиться по Alt-Tab, но когда приложение минимизируется оно остается на рабочем столе в виде свернутого заголовка (прямо как в старом добром Windows 3.11)

Только сpазу пpедупpеждаю пpо гpабли, на котоpые я наступал:
Будь готов к тому, что если пpи попытке закpытия пpиложения в OnCloseQuery или OnClose выводится вопpос о подтвеpждении, то могут быть пpоблемы с автоматическим завеpшением пpогpаммы пpи shutdown — под Win95 пpосто зависает, под WinNT не завеpшается. Очевидно, что сообщение выводится, но его не видно (пpичем SW_RESTORE не сpабатывает). Решение — ловить WM_QueryEndSession и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

А вот как отрубить показ файла в Ctrl-Alt-Del

Примечание. Этот пример удобно использовать при написании деинсталляторов — добавить однократный вызов деинсталлятора и запросить от пользователя перезагрузку. Этот прием позволит безболезненно удалять DLL и им подобные файлы, которые обычном способом удалить невозможно (они загружены в силу того, что использовались деинсталлируемой программой или работают в момент деинсталляции).

Выключение компьютера при помощи Delphi

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

Для этого создадим новый проект. Проект будет очень простым: форма и две кнопки. Одна кнопка чтобы выключить компьютер, вторая для того чтобы отменить начатое отключение. На рисунке ниже представлен внешний вид предполагаемой формы:

Чтобы выключить компьютер нужно выполнить следующую команду:

Далее представлен листинг программы. Тут все предельно просто. На что стоит обратить внимание:

1. Подключен модуль ShellAPI.

2. Команда shutdown вызывается с параметрами (Все возможные параметры можно посмотреть под кодом программы).

Параметры функции shutdown.

В нашем примере функции передаются параметры » — s -t 00″. Параметр «-s» обозначает, что мы хотим выключить компьютере. Параметр «-t 00» — что мы хотим это сделать немедленно.

Разберем все возможные параметры.

shutdown [-l] [-s] [-r| [-a] [-f] [-m [\\имя_компьютера]] [-t xx] [-c «сообщение»]

  • Функция с параметром [-l] осуществит выход из текущего пользователя системы
  • [-s] Означает, что мы хотим выключить компьютер
  • [-r| Перезагрузка компьютера
  • [-f] Закрыть все запущенные приложения
  • [-m [\\имя_компьютера]] — Выключить компьютер из сети
  • [-t xx] отложить выключение на XX секунд
  • [-c «сообщение»] вывести текст сообщения
Илон Маск рекомендует:  Логические операции
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL