StdConvs в Delphi


Содержание

Справочник по компонентам Delphi. Часть 2
Страница 54. Компонент TDDECIIentConv

Компонент TDDECIIentConv

Компонент TDDEClientConv осуществляет контакт на клиентской стороне. Именно в нем описаны методы, отвечающие за установление контакта. Имена требуемых сервера DDE и темы содержатся в свойствах:

Сервер и тема устанавливаются при вхождении в контакт. Предусмотрены два режима вхождения в него:

присваивает серверу и теме имена, равные Service и Topic, а если выбран режим контакта ddeAutomatic — то и устанавливает контакт. Будьте внима­тельны при задании параметров метода— здесь учитывается регистр символов. В случае режима ddeManual для установления контакта необходимо вызвать дополнительно метод:

Этот метод сначала закрывает предыдущий контакт, затем он пытается свя­заться с сервером DDEService на тему DDETopic. Если это не удается сразу (например, если требуемый сервер DDE отсутствует), то делается попытка загрузить программу с именем, определенным в свойстве

и установить контакт с ней. Если оно не определено (ServiceApplication = «), то в качестве последней попытки для контакта пробуется имя, представляющее собой конкатенацию имен сервера и темы, разделенных пробелом. В случае неудачи метод OpenLink возвращает False.

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

переключит компонент на новый контакт и вернет значение True. Наконец, метод

инициирует начало обмена данными. Обычно он вызывается в методе OpenLink.

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

Здесь Item — имя элемента данных, Data — передаваемые текстовые данные. Кроме того, некоторые серверы DDE имеют собственные наборы макрокоманд, запрос на выполнение которых можно послать от клиента. К ним относятся многие приложения, в т. ч. СУБД и электронные таблицы, такие, как Paradox и MS Excel; наиболее типичным примером служит Program Manager. Запрос на выполнение макрокоманд посылают методы:

function ExecuteMacroLines(Cmd: TStrings; waitFIg: Boolean): Boolean-function ExecuteMacro(Cmd: PChar; waitFIg: Boolean): Boolean;

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

устанавливается в True. При этом вызовы последних четырех описанных ме­тодов отрабатываться не будут, пока сервер не известит об окончании опе­рации, и WaitStat не примет значение False. Это свойство доступно только по чтению. Клиент может запросить данные от сервера немедленно с помощью метода:

Формат обмена данными можно узнать из свойства:

Перефразируя Генри Форда, скажем, что можно обмениваться данными любого формата, если этот формат — CF_TEXT.

Если возможностей, предоставляемых методами и свойствами класса, недоста­точно, то для вызова процедур библиотеки DDEML программисту доступен дескриптор контакта:

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

установлено в False. В этом случае все символы ASCII с десятичными кодами от 1 до 31 заменяются на пробел (код 32). В случае True преобразования не происходит.

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

по-видимому, зарезервировано ддя дальнейших применений.

Delphi. FireDac. Виды соединений и ConnectionDefinition

ConnectionDefinition

Что такое ConnectionDefinition?

Перед тем как создать соединение в FireDac, необходимо создать так называемое ConnectionDefinition – определение соединения. Это набор параметров – сервер, пользователь, пароль и др. параметры, которые, впоследствии используются для установки соединения.

В FireDac существует как минимум 3 вида ConnectionDefinition. Подробно об этом написано в документации.

Постоянное ConnectionDefinition (Persistent)

Имеет уникальное имя. Настраивается из FDManager и хранится в ini файле. Определяется один раз, далее может использоваться всеми соединениями и приложениями. Файл, в котором хранятся определения, находится по адресу

C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDConnectionDefs.ini

Опасность здесь заключается в том, что данные относительно открыты и могут быть изменены. После обновления ConnectionDefinition через FDExplorer или FDAdministrator необходимо либо реактивировать FDManager либо перезапустить IDE.

Частное ConnectionDefinition (Private)

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

Временное ConnectionDefinition (Temporary)

Не имеет уникального имени. Не хранится во внешнем файле, не управляется через FDManager.

FDConnectionDefs.ini

Если открыть файл

C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDConnectionDefs.ini

то мы увидим примерно следующую картину

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

Как правильно изменить файл FDConnectionDefs.ini ?

Изменить его можно несколькими способами

-Если разобрались с параметрами, то просто вписать или изменить туда свои параметры для своего ConnectionDefinition

-Можно работать через File | DataExplorer | Fire Dac | MySQL Server –> правой кнопкой мыши Add Connection… Как ни странно, это способ прекрасно работает, хоть и не описан в официальной документации

-Можно работать через FDExplorer или FDAdministrator

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

Как помочь найти приложению FDConnectionsDefs.ini?

Очень просто. Нужно добавить в приложение FDManager и прописать в свойстве FDManager.ConnectionDefFileName путь к нашему файлу FDConnectionDefs.ini

Вообще, по этому поводу в документации написана следующая информация

An application can specify a connection definition file name in the FDManager.ConnectionDefFileName property. FireDAC searches for a connection definition file in the following places:

  • If ConnectionDefFileName is specified:
    • search for a file name without a path, then look for it in an application EXE folder.
    • otherwise just use a specified file name.
  • If ConnectionDefFileName is not specified:
    • look for FDConnectionDefs.ini in an application EXE folder.
    • If the file above is not found, look for a file specified in the registry key HKCU\Software\da-soft\FireDAC\ConnectionDefFile. By default it is $(ADHome)\DB\ADConnectionDefs.ini.

Note: At design time, FireDAC ignores the value of the ADManager.ConnectionDefFileName, and looks for a file in a Delphi Bin folder or as specified in the registry. If the file is not found, an exception is raised.

Иными словами, лучший способ – прямо указать приложению где лежит файл через FDManager.ConnectionDefFileName, если этого не сделать, то приложение будет искать данный файл в папке EXE, и после этого будет пытаться искать через реестр

Опять же, нужно в FDManager поставить свойство ADManager.ConnectionDefFileAutoLoad в True, иначе придется явно вызывать метод ADManager.LoadConnectionDefFile до первого использования FDConnection, например до FDConnection:=true;

Практика. Создание ConnectionDefs и FDConnections

Создание Persistent ConnectionDefinition

Создадим VCL проект, на форму добавим одну кнопку и следующие компоненты

StdConvs в Delphi

Школа программирования Delphi

Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.

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

Блог GunSmoker-а

. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.

6 февраля 2013 г.

«Дружественность» в Delphi

Содержание

Инкапсуляция

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

В ООП языках программирования инкапсуляция реализуется через механизмы ограничения доступа к членам класса путём введения ключевых слов типа private или protected . Общая идея состоит в том, что каждый класс выставляет наружу публичный ( public ) интерфейс, который и позволяет управлять объектом. Все открытые методы интерфейса объекта гарантировано переводят объект из одного согласованного и корректного состояния в другое. При этом внутренние «кишки» объекта скрыты от внешнего доступа, так что никакой сторонний код не может перевести объект из согласованного состояния в недопустимое. Однако применение директив вида protected позволяет наследникам класса получать доступ к его внутренним членам.

Необходимость обхода инкапсуляции

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

Например: Здесь TCollection — коллекция, а TCollectionItem — элемент коллекции. Оба класса наследуются от общего предка TPersistent , но не друг от друга. И TCollection и TCollectionItem предоставляют открытый интерфейс для управления: метод добавления ( Add ) и получения информации (свойство Collection ), но не позволяют менять их на произвольные значения стороннему коду (закрытые поля FCollection и FItems ).

Разумеется, при добавлении элемента в коллекцию, необходимо внести элемент в список элементов ( FItems ) и назначить ему владельца ( FCollection ), поэтому этим двум классам необходимо иметь доступ к закрытым элементам друг друга в обход общего механизма разграничения доступа.

Понятие класса, дружественного другому классу

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

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

Поэтому в примере выше TCollection и TCollectionItem являются дружественными, поскольку расположены в одном модуле, так что допускается код типа такого: или такого:

Проблемы дружественности в Delphi

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

Сужение дружественности: strict

Понимая, что не всякий класс в модуле должен быть дружественным к другим классам этого же модуля, разработчики Delphi ввели новое ключевое слово strict , которое в комбинации с private и protected позволяют ограничивать доступ к членам класса для других классов в этом же модуле. Так, к примеру, к элементам класса в strict private не может получить доступа ни один код вне этого же класса, даже если этот код находится в том же модуле. Аналогично, доступ к элементам strict protected будут иметь только наследники этого класса, но не другие классы, даже если они будут находится в том же модуле.

Расширение дружественности: хак

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

Первый путь — самый простой и прямолинейный. Он заключается в использовании хака. Хотя обычно хак — это плохо, но данный конкретный хак безопасен. Заключается он в объявлении пустого класса-наследника в том же модуле, где нужно сделать дружественный класс. Например, пусть у нас есть класс: И в другом модуле есть класс, который должен обращаться к полю FItem : Чтобы разрешить этот конфликт (подразумевая, что мы не можем поместить TSomeClass и TAnotherClass в один модуль), мы можем сделать поле FItem как protected А для TAnotherClass использовать такую конструкцию: Объявляя класс-наследник ( TDummySomeClass ), мы делаем доступными ему все protected члены (и не важно, в каком модуле они расположены). А то, что этот класс-заглушка объявлен именно в модуле второго класса ( TAnotherClass ), сделает эти два класса дружественными, что и даст доступ к закрытому полю FItem . Обратите внимание, что при этом исходный класс ( TSomeClass ) не становится дружественным к TAnotherClass — вот почему нам необходимо выполнять явное преобразование типов.

Илон Маск рекомендует:  Asp семейство application staticobjects

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

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

Расширение дружественности: интерфейсы

Итак, возвращаясь к нашим баранам, вариант второй разрешения конфликта — использование интерфейсов. Интерфейс (в смысле конструкции языка interface ) — это набор методов (читай: действий), которые можно произвести с объектом. Иными словами, это как бы «копия» public секции объекта. Вкусность тут в том, что их может быть много у одного объекта. Любой внешний код может запросить у объекта любой его сервис, если он знает его «имя» (в терминах интерфейсов: имя = GUID).

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

Множественное наследование и интерфейсы

Но здесь, однако, кроется интересное для меня наблюдение. Если вы заметили, то объекты хорошо позволяют «реализовать что-то». У них есть наследование (и интерфейса и реализации), скрытие и дружественность, и т.д. Всё это позволяет легко реализовывать функциональность. Но не всегда это идеально удобно с точки зрения потребления/использования. Здесь уже ограничители (наследование, скрытие, . ) начинают скорее мешаться, чем приносить пользу. В самом деле, если я хочу добавить элемент в коллекцию, зачем мне всенепременно наследовать его от нужного класса? А если мне нужно добавить в коллекцию класс вне её дерева наследования? Ведь, по сути, здесь было бы достаточным, чтобы элемент поддерживал определённую функциональность (читай: «набор методов управления»). Для этого вовсе не обязательно строго наследовать от предопределённого класса, поскольку от элемента требуется лишь удовлетворять набору условий.

Насколько я понимаю, для решения этой проблемы (в том числе) в других языках программирования вводится поддержка множественного наследования: один класс может удовлетворять сразу нескольким функциональностям. К примеру, студент может быть не только человеком, но и рабочим, и музыкантом, и членом семьи (т.е. наследоваться от них в терминах множественного наследования). При этом, если наследуемые классы, в свою очередь, также наследуются друг от друга в различных комбинациях, то могут возникать конфликты (например, если «музыкант» и «член семьи» наследуют «прозвище» от «человек» с замещением реализации, то какую из реализаций должен брать «студент»?). Само собой, языки с поддержкой множественного наследования также содержат механизмы разрешения таких конфликтов. В целом же, множественное наследование часто критикуется. Проблемы, его чрезмерная сложность приводят критиков к выводу, что от него больше вреда, чем пользы. При этом также звучит мнение, что множественное наследование (как расширение «простого» одиночного наследования) — ошибочная концепция, порождённая неверным анализом и проектированием.

В Delphi проблемы множественного наследования решаются интерфейсами. Интерфейс — это полностью абстрактный класс, все методы которого виртуальны и абстрактны. Иными словами, говоря грубо, интерфейс — это запись ( record ) с указателями на функции. Каждый метод интерфейса должен быть реализован в классе. Причём реализацию вы либо пишете сами, либо наследуете, либо делегируете (для случая агрегации). Иными словами, любой интерфейс реализуется классом без конфликтов. Плюс, в каждый момент времени вы работаете с одним конкретным интерфейсом, а не с «объединённым набором интерфейсов», поэтому проблемы выбора нужной реализации тут просто нет — будет использоваться метод используемого интерфейса. Не та реализация? Берём другой (нужный) интерфейс с нужной реализацией.

Также замечу, что в Delphi отсутствует возможность множественного наследования не только классов, но и интерфейсов (множественное наследование интерфейсов существенно проще множественного наследования классов, поскольку интерфейсы не содержат реализации; тем не менее, даже здесь есть одна возможность для конфликтов).

В целом же, я считаю, что использование интерфейсов — это наиболее правильный вариант реализации множественного наследования, поскольку явное указание реализации исключает конфликты. Введение понятия интерфейсов является компромиссом, позволяющим получить преимущества множественного наследования, не реализуя его в полном объёме и, таким образом, не сталкиваясь со специфичными для него сложностями. Именно такой подход принят во многих современных языках — не только в Delphi, но и, к примеру, C# или Java.

Вы всё ещё используете объекты? Тогда мы идём к вам

Я уже кратко выразил основную мысль выше: объекты удобны для реализации функциональности (наследование/полиморфизм), но неудобны для использования. Добавлю только, что, помимо уже упомянутых ограничений, объекты неудобны ручным слежением за временем жизни. Интерфейсы же относятся к типам с автоматическим управлением временем жизни, что существенно упрощает разработку кода. Кроме того, интерфейсы — языко-независимы (т.е. ими можно обмениваться между кодом, написанных на разных языках), в отличие от классов, реализация которых своя в каждом языке программирования.

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

Иными словами, у интерфейсов есть куча плюсов, но есть и некоторые минусы. Во-первых, использование интерфейсов подвержено проблеме циклических ссылок (которую, впрочем можно легко обойти, следуя нескольким простым правилам разработки). Во-вторых, большая часть кода VCL и RTL написана в те времена, когда никакой поддержки интерфейсов в Delphi не было (историческая справка: изначально интерфейсы были введены в Delphi для поддержки технологии COM, но впоследствии их стали использовать более широко). Соответственно, весь этот код написан на объектах. И он наследуется и в современные версии Delphi. Более того, такой подход используют и сторонние библиотеки, руководствуясь «ну раз так поступает сам разработчик среды, то и мы тоже будем так делать». Итого, у вас может быть проблема состыковки кода с ручным и автоматическим управлением временем жизни. К сожалению, обычные интерфейсы в Delphi нельзя сделать «чистыми» (т.е. без обвеса автоматического управления). Вы можете добиться этого обходным путём, но это неудобно без поддержки со стороны языка.

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

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

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

Проблема в том, что унаследовавшись от одного предка, класс уже не может наследоваться от других. Изменение предка становится опасным. Зачастую правильное использование private и protected требует от программиста неслабых телепатических способностей: что может понадобится нашим наследникам, а что нет?

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

Если же вместо объектов вы будете оперировать интерфейсами, то ваш код будет более приближен к реальному миру. У вас может быть «студент», и он не будет наследоваться от «человека», но он будет иметь имя, т.к. студент одновременно является и «человеком». И если кому-то нужен «студент», то ему совершенно не обязательно наследоваться от «человека», «млекопитающего» или ещё более низкого класса, если его всего-лишь интересуют университет, курс и группа «студента». Конечно, вы можете и должны использовать объекты и наследование при реализации интерфейсов: в конце концов, наследование — удобный способ повторного использования кода. Иными словами, суммируя мысль: объекты — язык описания реализации, интерфейсы — язык описания реального мира.

Бонус: секция published

В заключение — несколько слов о секции published . Эта секция введена в Delphi для работы встроенного механизма сериализации (к примеру, именно благодаря ему загружаются формы из ресурсов программы). Помещение свойств, методов и полей в секцию published заставит компилятор генерировать мета-информацию (RTTI) для них, что позволит объекту «узнавать о самом себе» во время выполнения. Именно это (генерация RTTI) — основное назначение секции published . Но кроме этого секция published также имеет ту же область видимости, что и public . К примеру, все компоненты любой формы доступны любому коду, т.к. находятся в секции published , т.е. имеют видимость public . Конечно же, это нарушает инкапсуляцию (концепцию «чёрного ящика»). Любой код может проводить произвольные манипуляции с формой, даже приводя её в недопустимое состояние (к примеру, отключив все кнопки на форме).

Поэтому нужно всегда помнить о назначении секции published (генерировать RTTI) и не пытаться манипулировать компонентами формы в обход её публичного интерфейса. С этой точки зрения дизайн Delphi был бы более удачен, если бы секция published имела бы ту же область видимости, что и protected . В настоящее же время наилучшим вариантом будет вообще скрыть форму за фасадом. Например — интерфейсом. или: Подобный подход не только прост в реализации, но и добавляет в код высокую степень полиморфизма: в любой момент вы можете заменить форму на консольный ввод или ответ от удалённого сервера. Для этого достаточно будет заменить реализацию IInputDialog . Любой иной код, который его использует, совершенно не изменится.

Новые возможности Borland Delphi 7 Studio

Borland Delphi 7 Studio включает новые возможности и улучшения в следующих областях:

IDE
Web технологии
COM технологии
Database технологии
Библиотека компонент
Runtime библиотека
Компилятор
Поддержка Rave Reports
Поддержка ModelMaker
Документация
Переход к новой версии и вопросы совместимости

IDE новые свойства в следующих областях:

1.1. сообщения компилятора
Новый пункт меню View Additional Message открывает окно Message Hints, из которого можно загрузить и посмотреть информацию о сообщения компилятора на вебсайте Borland.
Новый пункт меню Project|Options|Compiler Messages дает больший контроль над предупреждениями компилятора.

1.2. Палитра компонент
Когда вы открываете приложение Borland CLX (Component Library for Cross-platform) в Delphi, то показывается новая закладка System только для CLX версии. Она включает некоторые каталоги и файловые компоненты. В предыдущей версии, закладка System показывалась только для VCL приложений и включала компоненты для системного уровня доступа.
Новые закладки Indy Intercepts и Indy I/O Handlers дают доступ до open source Internet protocol компонент (Professional и Enterprise).
Новые закладки IW Standard, IW Data, IW Client Side, и IW Control дают доступ до AtoZed Software IntraWeb компонент разработки Web приложений.
Новая закладка Rave доступ до компонент генерации отчетов в ваших приложениях.
Все закладки могут прокручиваться по горизонтали для отображения дополнительных икон, также есть выпадающее меню для списка дополнительных икон.

1.3. CodeInsight
Завершение кода (Code completion) теперь работает быстрее и позволяет вам просматривать их объявление с помощью Ctrl+click на любом идентификаторе в списке.
Завершение кода для HTML автоматически показывает допустимые HTML элементы и атрибуты в редакторе кода (Professional и Enterprise).
Вы можете создать собственные версии менеджеров для завершения кода с помощью OpenTools API. Дополнительную информацию можно посмотреть в справочной системе, по теме «Extending the IDE».
Пункт меню Tools|Editor Options|Code Insight позволяет вам настроить цветовую подсветку для символов CodeInsight.

1.4. Отладчик
Окно Watch List теперь имеет:
Множественные позиции табуляции, разрешая вам организовать просмотр в должном виде, для более удобной отладки. Для того, что бы добавить группу просмотра, сделайте щелчок правой кнопкой мышки и выберите Add Group.
Колонка Watch Name и колонка Value. Для показа или скрытия заголовков колонок сделайте щелчок правой кнопкой мышки в Watch List и выберите Show Column Headers.
Checkbox разрешает разрешать или запрещать отдельные просмотры.
Пункт меню Tools|Debugger Options|Event Log имеет следующие новые параметры:
Use Event Log Colors разрешает вам показывать различные типы сообщений в цвете для разных типов сообщений в логе (event log).
Module messages записывает сообщение в лог каждый раз, когда модуль (exe, dll, ocx, и т.д.) загружается или выгружается процессом, который вы отлаживаете. Ранее, параметр Process messages только контролировал, какие сообщения требовалось регистрировать.
Диалог Run Parameters имеет новый параметр, Working Directory, который позволяет указать имя рабочего каталога для отлаживаемого процесса.

1.5. Различные улучшения IDE
Из Project Manager, вы можете частично компилировать проекты внутри группы, путем выбора пункта, с помощью правой кнопки мышки, Make All from Here или Build All from Here.
Окно Message view имеет множественные позиции табуляции для различных типов сообщений (Build, Search, и т.п.).
Команда View|Component List позволяет вам делать множественный выбор компонент, при нажатой клавише Ctrl.
Новый пункт меню Tools|Editor Options|Source Options позволяет вам:
Установить различные параметры для различных типов исходных файлов, таких как Pascal, C++, C#, HTML, и XML.
Показывать символы табуляции и пробелов в редакторе кода.
Шаблоны кода Edit.
Некоторые из параметров ранее были на страницах General, Display и CodeInsight диалога Editor Properties.
Пункт меню Tools|Editor Options|Color имеет два новых параметра, Foreground Color и Background Color, вместо сетки цветов, для выбора и установки цветов в редакторе кода.
С помощью Alt+Page Down и Alt+Page Up можно циклически переключаться между закладками, такими как Code Editor, Watch Window и Message view. Эти клавиатурные ускорители включены в Default, IDE Classic и BRIEF назначения клавиш.
Delphi теперь имеет двух тоновое главное меню.

Илон Маск рекомендует:  Что такое код yaz_error

2. Web технологии

В Delphi 7 Studio редакции Enterprise и Professional:

Delphi теперь включает IntraWeb от AToZed Software. Вы можете использовать IntraWeb для разработки Web серверных приложений, используя стандартный редактор форм. Вы можете также использовать IntraWeb для разработки страниц, для Borland WebBroker и WebSnap приложений. Для дополнительной информации смотрите «Creating Web server applications using IntraWeb» в Developer’s Guide или в справочной системе. Delphi 7 Studio Enterprise полный набор IntraWeb. Delphi 7 Studio Professional включает только ограниченный набор IntraWeb.
Delphi теперь поддерживает Apache 2 как платформу для WebBroker, WebSnap и SOAP.
Borland отказался от использования Win-CGI, как платформы для разработки Web серверных приложений и Web сервисов. Borland рекомендует вместо этого использовать обычные CGI, ISAPI/NSAPI или Apache типы. Существующие Win-CGI проекты пока можно изменять и компилировать в IDE, тем не менее, Borland не гарантирует Win-CGI совместимость в неопределенном будущем.

2.1. Web сервисы
Web сервисы включают следующие изменения:

Новый UDDI браузер
Мастер импорта WSDL именно новый Universal Description, Discovery и Integration (UDDI) браузер, что разрешает вам искать в UDDI реестре для Web Service и импортировать адрес в WSDL документ.
Заголовки SOAP
Новые классы и интерфейсы разрешают вам читать или вставлять заголовки в SOAP конверты (envelopes), что бы передавать сообщения между клиентами и серверами. Более подробно смотрите «Defining and using SOAP headers» и «Processing headers in client applications» в Developer’s Guide или в справочной системе.
Вложения (Attachments)
Web Services приложения (оба и клиент и сервер) могут теперь включать вложения. Вложения (наследники TSOAPAttachment) посылаются с помощью кодированных сообщений (SOAP-encoded messages) как часть много форматной формы. Когда приложение получает вложение, то оно сохраняется во временном файле, который затем становится доступным для вашего приложения.
Поддержка типов

Вы можете управлять преобразованием между удаленными классами и их SOAP представлением, переписав два виртуальных метода, которые были добавлены к TRemotable: ObjectToSOAP и SOAPToObject.
Объекты исключения для исключений, которые происходят при ответе на запрос Web сервиса (экземпляры ERemotableException) теперь содержат больше информации из пакета ошибки SOAP (SOAP fault packet).
Определения типов автоматически регистрируются в удаленном реестре типов при регистрации запрашиваемого интерфейса.
TXSDecimal имеет новое свойство AsBcd для более простого преобразования между XML и подлинными (native) типами. Подобно, TXSHexBinary имеет новое AsByteArray свойство. Удаленные классы представления времени теперь имеют дробную часть секунды вместо представления в виде миллисекунд.
Прочие улучшения

Новые события в THTTPReqResp позволяют отделить HTTP сообщения до их и индикации прогресса при передаче или приеме длинных сообщений.
THTTPSoapPascalInvoker теперь имеет опубликованные события, которые позволяют вам писать код до или после выполнения инвокер (invoker) выполнит запрошенный метод вызова.
Теперь вы имеете большее управление над связыванием с извлекаемыми интерфейсами и WSDL документами. TWSDLHTMLPublish теперь публикует некоторые события, позволяя вам управлять генерацией WSDL. Вы можете также идентифицировать мапирование между возвращаемыми функцией значениями и именами параметров, с помощью пространства имен и действиями по умолчанию SOAP. На клиентской стороне, литеральное кодирование теперь поддержано, также как RPC кодирование.
Новый интерфейс IRIOAccess позволяет вам иметь доступ до удаленного интерфейсного объекта, который реализует вызываемый интерфейс.
Интерфейс IOPConvert имеет новое свойство: Encoding. Оно позволяет указать вам набор символов для передачи кодированных сообщений, передаваемых между клиентом и провайдером Web сервиса.
Есть также изменения в Web сервисах, которые затрагивают Borland DataSnap приложения. Для более подробной информации смотрите главу «Database технологии».
TLinkedRIO конструктор теперь автоматически генерирует отдельные имена файлов для каждого метода, который вы вызываете, делая отладку более простой.
TOPToSoapDomConvert теперь имеет два новых события, которые позволяют вам при отладке десериализацию SOAP пакетов.
Теперь вы можете использовать перегруженные методы на вызываемых интерфейсах, которые вы определили.

3. COM технологии

Delphi 7 Studio Enterprise и Professional редакции:
Теперь вы можете использовать диалог Import Type Library (Project|Import Type Library) для создания обертки (wrapper) для Microsoft® .NET assemblies. Вы можете использовать обертку как для обычного COM сервера, используя interoperability свойство .NET.

4. Database технологии
Delphi 7 Studio Enterprise и Professional редакции:

Драйвера dbExpress были обновлены для IBM DB2 7.2 and Informix SE, Oracle9i, Borland InterBase 6.5, и MySQL 3.23.49. Для Microsoft SQL 2000 новый драйвер.
Несколько новых и ряд обновленных компонент. Подробности в главе «Библиотека компонент «.
Borland отказался от использования SQL Links; в дальнейшем никаких улучшений для SQL Links не будет делаться и также SQL Links не будут включаться в состав Delphi после 2002. Borland рекомендует использовать dbExpress для доступа SQL серверам баз данных.

4.1. DataSnap
Delphi 7 Studio только в Enterprise редакции:

В DataSnap приложениях, использование IAppServer было изменено на IAppServerSOAP, который обходит некоторые проблемы в IAppServer интерфейсе. Свойство UseSOAPAdapter TSoapConnection можно использовать для написания клиентов для серверов написанных на старых версиях Delphi. TSoapConnection также публикует несколько новых событий для управления вашими клиентскими приложениями в разных точках выполнения процесса запроса Web сервиса.
Теперь вы можете указывать конкретный SOAP модуль данных в сервере приложений, который имеет несколько модулей данных. Используйте свойство SOAPServerIID или добавьте интерфейс модуля в конце URL.
Теперь вы можете использовать компонент SOAP connection для вызова расширения интерфейса сервера приложений. Используйте свойство SOAPServerIID и метод GetSOAPServer.
DataSnap более не поддерживает CORBA соединения.

5. Библиотека компонент

5.1. Поддержка тем Windows XP
В Delphi Studio 7 Enterprise и Professional, приложения Borland VCL теперь включают компоненты, которые разрешают поддержку Windows® общих органов версии 6. Ваше приложение автоматически использует новые органы Windows на системе Windows XP, если найдет подходящий манифест файл. Более подробно об этом в руководстве Developer’s Guide тема «Common controls and XP themes» или в справочной системе.

5.2. Новый модуль

Новый модуль DBClientActns содержит три новых компоненты для работы с клиентскими наборами данных: TClientDataSetApply, TclientDataSetUndo и TClientDataSetRevert.

5.3. Новые компоненты

Закладка dbExpress на палитре компонент включает TSimpleDataSet для использования с простыми, двух уровневыми приложениями баз данных (TSimpleDataSet заменяет TSQLClientDataSet).
Закладка Dialogs на палитре компонент включает TPageSetupDialog для доступа к стандартному диалогу Windows page setup.
Закладка Additional на палитре компонент включает TXPColorMap, TstandardColorMap и TTwilightColorMap для управления цветом меню и тулбаров.
Новая CLX версия закладки System на палитре компонент включает новые компоненты для работы с файлами и папками.
Новые закладки Indy Intercepts и Indy I/O Handlers на палитре компонент включают доступ до Internet протоколов, только в Professional и Enterprise.

5.4. Измененные компоненты
CLX версия TOpenDialog и TSaveDialog была расширена для поддержки дополнительных свойств, таких как препросмотр файла.
VCL версия TCustomForm имеет два новых свойства, ScreenSnap и SnapBuffer, которые управляют поведением формы при перемещении и достижению края экрана.
TCustomComboBoxEx имеет новое свойство AutoCompleteOptions, которое разрешает комбо боксу реагировать на ввод символов пользователем.
CLX диалоги, которые исходят от TOpenDialog и TqtDialog, могут теперь использовать общие диалоги Windows вместо Qt диалогов. Данное поведение управляется свойством UseNativeDialog, по умолчанию установлено в true.

5.5. Брошенные компоненты
Информацию об устаревших, заброшенных компонентах можно найти в readme.txt файле из папки Delphi 7 Studio.

6. Runtime библиотека

6.1. Модуль Classes
Добавлен новый класс исключения EFileStreamError. EFileStreamError и EFOpenError порождаются от этого класса. Этот новый класс может иметь параметр FileName. В результате, текст сообщения исключения теперь содержит имя файла, в котором произошла ошибка.
Класс TStrings имеет два новых свойство, ValueFromIndex и NameValueSeparator.
Методы TThread.CheckThreadError были перемещены из private части в protected.

В модуле Math появился новый параметр, по умолчанию, RaisePending, в процедуре ClearExceptions.

6.3. Модуль StdConvs
Модуль StdConvs теперь включает Стоун в поддержанных мерах веса.

6.4. Модуль StrUtils

Для поддержки multibyte character set (MBCS) в модуль StrUtils внесены следующие изменения:

Ранее, функции LeftStr, RightStr и MidStr каждая имели тип параметра AnsiString и тип возврата и не поддерживали MBCS строки. Каждая из этих функций теперь заменена парой перегруженных функций, одна возвращает AnsiString, а другая принимает и возвращает WideString. Новые функции корректно обрабатывают MBCS строки. Эти изменения делает непригодным код, использовавший эти функции для записи и извлечения байтовых значений в AnsiStrings. Такой код должен быть пересмотрен для использования с помощью новых байт ориентированных функций, описанных ниже.
Новые функции LeftBStr, RightBStr и MidBStr предоставляют доступ для манипуляций на байтовом уровне, ранее предоставляемый функциями LeftStr, RightStr и MidStr.
Новые функции AnsiLeftStr, AnsiRightStr и AnsiMidStr аналогичны новым AnsiStr LeftStr, RightStr и MidStr функциям, за исключением, что они не перегружены эквивалентными WideString функциями. Модуль StrUtils имеет новую функцию для поиска, название PosEx.

6.5. Модуль SysUtils

Модуль SysUtils теперь включает thread-safe перегруженные процедуры для форматирования и разбора (парсинга) чисел, дат и денежных форматов. Новые процедуры thread-safe, поскольку они получают информацию о локализации не их глобальных переменных, а из структуры TFormatSettings. Данная структура данных должна быть заполнена перед использованием; новая функция GetLocaleFormatSettings, должна использоваться для заполнения структуры из конкретной локали.

6.6. Модуль VarCmplx

Модуль VarCmplx имеет новые функции: VarComplexLog2, VarComplexLog10, VarComplexLogN, VarComplexTimesImaginary и VarComplexTimesReal.

6.7. Модуль Variants
Добавлены новые функции VarIsError и VarAsError.
Исключение EVariantError теперь стало базовым классом для порождения классов исключений, из кода работы с вариантами.
Добавлено несколько глобальных управляющих переменных: NullEqualityRule, NullMagnitudeRule, NullStrictConvert, NullAsStringValue и PackVarCreation.

Компилятор Delphi теперь поддерживает три новых предупреждения: Unsafe_Type, Unsafe_Code и Unsafe_Cast. Данные предупреждения запрещены по умолчанию, но могут быть разрешены с помощью следующих директив <$WARN UNSAFE_CODE ON>, с помощью ключей командной строки компилятора dcc32 -W+UNSAFE_CODE и в среде, Project|Options|Compiler Messages. Данное свойство предназначено для помощи в переносе вашего кода на платформу .NET. В обслуживаемой среде выполнения, «unsafe» означает, что операция не может быть проверена во время статического анализа, выполняемого компилятором Just In Time (JIT). Такой код может серьезным риском в безопасности, поскольку здесь недостаточно информации для компилятора JIT для проверки его runtime поведения. Примером опасного кода, являются операции с указателями и перезапись памяти.

8. Поддержка Rave Reports

Delphi 7 Studio Enterprise и Professional редакции:
Среда Delphi теперь включает Rave Reports от Nevrona. Добавив Rave Reports компоненты в ваше приложение, вы позволяете вашим пользователям делать отчеты в вашем приложении. Для более подробной информации смотрите главу «Creating reports with Rave Reports» в Developer’s Guide или справочной системе.

9. Поддержка ModelMaker
Delphi 7 Studio Enterprise и Professional редакции:
Инструмент ModelMaker позволяет упростить разработку, конструкцию и обслуживание классов и интерфейсов. ModelMaker также включает инструмент для создания UML диаграмм, которые могут использоваться для создания и модификации исходного кода ваших проектов. Для более подробной информации смотрите главу «Designing classes and components with ModelMaker» в Developer’s Guide или справочной системе. Delphi 7 Studio Enterprise включает ModelMaker от ModelMaker software. Delphi 7 Studio Professional включает 30-дневную триал версию Model Maker. Функциональность ModelMaker идентична в обеих редакциях Delphi.

Все файлы документации (PDF, HTML, and INT) теперь размещены в папке Online+PDF Docs на диске Delphi Companion Tools CD вместо инсталляционного CD. Вы можете иметь доступ или напрямую с CD или скопировать в любую папку по вашему выбору.
В связи с ограничения для печатной версии Developer’s Guide, Глава 5 «Creating custom components,» была изъята из книги для создания нового руководства «Component Writer’s Guide». Новая книга доступна в online Help и как PDF файл на Delphi Companion Tools CD.
Язык Object Pascal теперь называется Delphi language. Online Help и документация были изменены одновременно.
Книга Object Pascal Language Guide теперь называется Delphi Language Guide.
Для обеспечения точности Delphi руководств, они были изъяты из Quick Start и Developer’s Guide. Руководства доступны, как PDF файлы на Delphi Companion Tools CD.
Некоторые из тем в Delphi online help включают C++ синтаксис и примеры для Borland Kylix и C++Builder пользователей. Для Delphi разработки, пожалуйста, игнорируйте эти примеры.

11. Переход к новой версии и вопросы совместимости

Для вопросов перехода к новой версии и вопросов совместимости, смотрите readme.txt файл в папке с инсталляцией Delphi 7.
Для перехода к новой версии Delphi (ранее Object Pascal) языка возьмите проекты из предыдущей версии Delphi и откройте их в новой версии. Проект автоматически преобразуется в новую версию.
Подробности в Fault сообщениях теперь добавлены в узел вместо записей узла. Это сделано в соответствии со спецификацией SOAP faults, но принесет некоторые проблемы с обратной совместимостью со старым кодом.
Изменения в модуле StrUtils функций LeftStr, RightStr и MidStr могут потребовать переработать старый код, который использовал эти функции. Смотрите «Runtime библиотека» для подробностей.
Для Apache 2, переменная «ContentType» была сменена на «handler» в модуле ApacheApp.
DataSnap больше не поддерживает CORBA соединения.

Copyright© 2002 Borland Software Corporation, перевод Анатолия Подгорецкого

StdConvs в Delphi

Процесс очень хорошо прибивает такая функция

200?’200px’:»+(this.scrollHeight+5)+’px’);»> uses TlHelp32;

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE= $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result:= 0;
FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:= Sizeof(FProcessEntry32);
ContinueLoop:= Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
Result:= Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop:= Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

PEGAS42rus Дата: Среда, 02.01.2013, 12:10 | Сообщение # 5

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

Добавлено (02.01.2013, 12:10)
———————————————
однако на строку KillTask(‘notepad.exe’); ругается

Neo Дата: Среда, 02.01.2013, 15:39 | Сообщение # 6

Ты процедуру,которая в сплойлере у Don_Diego то переписал?Она должна быть описана выше,чем строчка
KillTask(‘notepad.exe’)
PEGAS42rus Дата: Среда, 02.01.2013, 16:00 | Сообщение # 7
чувак я написал всё но у меня ошибка всегда где-то выскакивает в общем сейчас скину код и вы сможете потыкать пальцем в мои ошибки и показать свои мега знания

200?’200px’:»+(this.scrollHeight+5)+’px’);»> unit Unit1;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellAPI,TlHelp32;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
function KillTask(ExeFileName: string): integer;

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute (Form1.Handle, nil, PChar (ExtractFilePath(Application.ExeName)+’Project3.exe’), nil, nil, SW_RESTORE);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DeleteFile( ExtractFilePath(Application.ExeName)+’1.txt’)
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
KillTask(‘notepad.exe’);
end;

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE= $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result:= 0;
FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:= Sizeof(FProcessEntry32);
ContinueLoop:= Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
Result:= Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop:= Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

Delphi 2005

Для профессионалов


Автор: Кэнту М.
Издательство: Питер, 2006
912 страниц


Материал предоставил: Издательство »Питер»

Аннотация

Последний релиз Borland Delphi подвергся значительным изменениям и вобрал в себя множество новых возможностей. Delphi 2005 позволяет создавать как традиционные Win32-приложения, так и программы для платформы .NET. Эта книга поможет вам идти в ногу со временем, независимо от уровня владения программной средой. Автор книги, признанный во всем мире экперт по Delphi, рассказывает о том, как наилучшим образом использовать преимущества новой программной среды: ее простой язык, быстрые методы разработки, переносимость кода и дополнительный инструментарий, созданный сторонними фирмами. Книга будет одинаково полезна как начинающим программистам, впервые сталкивающимся с Delphi, так и профессионалам, в совершенстве владеющим предыдущими версиями борландовского продукта.

Содержание


Введение

Год 2005 ознаменовался выходом новой версии Delphi и десятилетним юбилеем этого продукта. Официальный дебют Delphi состоялся 14 февраля 1995 года, как указано на моей личной странице юбилея Delphi (www.marcocantu.com/delphibirth).

Примерно за год до того Зак Арлокер (Zack Urlocker) впервые показал мне еще не вышедший продукт с условным названием Delphi, и я немедленно осознал, что он изменит мою работу, а также работу множества других программистов. В те времена я боролся с библиотеками C++ для Windows, и среда Delphi была и до сих пор остается наилучшим сочетанием объектно-ориентированного и визуального программирования не только для платформах Win16 и Win32, но и в операционной системе Linux и на платформе Microsoft .NET Framework.

Среда Delphi 2005 построена на этих традициях и прочном фундаменте VCL, но в ней также произошел целый ряд революционных изменений, включая спроектированную заново интегрированную среду разработки (IDE), существенно расширенный язык объектно-ориентированного программирования и включение множества средств разработчика Borland для всего жизненного цикла разработки программного продукта. Еще более важная и неповторимая особенность заключается в том, что Delphi теперь не только позволяет разрабатывать версии программ для Win32 и .NET в одной среде, но и строить программы для обеих платформ с использованием единого исходного кода.

Разработка Delphi затрагивает практически все области: простые автономные программы, обработку графики, разработку баз данных, клиент-серверные и многозвенные бизнес-приложения, интрасетевое и интернет-программирование, XML и веб-службы. Независимо от того, чего вы ищете — богатства возможностей, высокой производительности или просто удобства — среда Delphi предоставит вам все желаемое.

Девять версий

Среди исходных особенностей Delphi особенно привлекательными мне показались: общий подход, основанный на применении форм и объектно-ориентированных методов, чрезвычайно быстрый компилятор, превосходная поддержка баз данных, интеграция с Windows-программированием и компонентная технология. Но самым важным элементом был язык Object Pascal (теперь называемый языком Delphi), который заложил основу для всего остального.

Среда Delphi 2 стала еще лучше! Среди важнейших нововведений можно выделить появление объекта Multi-Record и улучшенной сетки для работы с базами данных, поддержки OLE Automation и универсального типа данных, полную поддержку и интеграцию с Windows 95, длинный строковый тип данных и визуальное наследование форм. В Delphi 3 к этому добавились технология Code Insight, поддержка отладки DLL, шаблоны компонентов, технологии TeeChart, WebgBroker, пакеты компонентов, ActiveForms и великолепная интеграция с COM благодаря применению интерфейсов.

Версия Delphi 4 дала нам редактор AppBrowser, новые возможности Windows 98, улучшенную поддержку OLE и COM, расширенные компоненты баз данных и много дополнений в основные классы VCL, включая поддержку пристыковки (docking), ограничений и привязки элементов. Delphi 5 добавила к общей картине множество улучшений IDE, расширила поддержку баз данных (наборами данных ADO и InterBase), улучшенную версию MIDAS (теперь DataSnap) с поддержкой Интернета, средства локализации, концепцию фреймов и новые компоненты.

В Delphi 6 ко всем существующим возможностям добавилась поддержка кросс-платформенной разработки с использованием Component Library for Cross-Platform (CLX, сейчас не поддерживается), расширенная библиотека времени выполнения, механизм работы с базами данных dbExpress, мощная технология WebSnap, дальнейшие улучшения IDE и ряд новых компонентов и классов.

Среда Delphi 7 повысила надежность некоторых архитектур за счет улучшения и исправления (например, SOAP и DataSnap), а также обеспечила поддержку ряда новых технологий (таких, как темы Windows XP и UDDI). Одним из важнейших новшеств стало появление интересного инструментария сторонних производителей: процессора отчетов RAVE, технологии программирования веб-приложений IntraWeb и среды конструирования ModelMaker.

Delphi 8 для Microsoft .NET Framework открыла совершенно новый мир, предоставив первый компилятор Borland для языка Pascal/Delphi, ориентированный не на процессор компании Intel, а на платформу .NET CIL. Компилятор поддерживал все основные возможности .NET Framework, включая ADO.NET, WinForms и особенно ADO.NET. В Delphi 8 также появились некоторые технологии управления жизненным циклом приложения, приобретенные компанией Borland (такие, как StarTeam и Caliber).

Теперь Delphi 2005 объединяет все перечисленные возможности, предоставляя одну версию IDE для разработок Win32 и .NET, а также обеспечивая поддержку нескольких языков программирования, включая Delphi и C#. Delphi все еще остается одним из основных конкурентов в области ускоренной разработки (RAD), но теперь среда также вошла в мир MDA (Model Driven Architecture) со своей технологией ECO. Как я уже упоминал, Delphi 2005 содержит заново спроектированную версию IDE с бесчисленными новыми возможностями и функциями, упрощающими программирование, а также расширенным языком программирования для Win32 и .NET.

Структура книги

В главе 1 представлены новые возможности интегрированной среды разработки (IDE), в главе 2 рассматриваются две целевые платформы (Win32 и .NET), после чего следует описание языка Delphi (главы 3 и 4), библиотеки времени выполнения (глава 5) и VCL (главы 6-8). Первая часть завершается обзором .NET Framework Class Library (глава 9).

Следующие главы охватывают переработку кода, модульное тестирование, архитектуру динамических Delphi-приложений, COM и взаимодействие .NET с COM и Win32.

Затем углубленно рассматриваются элементы, ориентированные на работу с данными, клиент-серверное программирование, dbExpress, InterBase, ADO, ADO.NET и многозвенные архитектуры с использованием технологий DataSnap и ADO.NET. В последней главе третьей части читатель познакомится с архитектурой ECO (Enterprise Core Objects).

В последних двух главах рассматривается XML и разработка веб-служб.

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

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

Бесплатный исходный код в Сети

Основное внимание в книге уделяется практическим примерам. После представления каждой концепции приводится работоспособный пример программы (иногда не один), демонстрирующий ее использование. В книге представлено свыше 300 примеров, большая часть из которых существует в версиях для Win32 и .NET. Программы можно загрузить в одном zip-файле объемом более 3 Мбайт на сайте Sybex (www.sybex.com) и на моем сайте (www.marcocantu.com). Как правило, примеры очень просты и посвящены одному конкретному аспекту Delphi. Более сложные примеры строятся поэтапно, при этом промежуточные этапы содержат частичные решения и обеспечивают постепенное наращивание возможностей.

ПРИМЕЧАНИЕ

Некоторые приложения баз данных требуют установки файлов-примеров баз данных Delphi; эти файлы входят в комплект стандартной установки Delphi. Для других примеров необходима база данных EMPLOYEE, относящаяся к InterBase (и сам сервер InterBase, конечно). Для некоторых примеров веб-программирования потребуется установленный веб-сервер.

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

Структура каталогов примеров очень простра. Каждая глава книги представлена отдельной папкой, в которой находятся вложенные папки для каждого примера (например, 05\FilesList). В тексте ссылки на примеры осуществляются просто по имени (например, FilesList).

ПРИМЕЧАНИЕ

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

Справочник по компонентам Delphi. Часть 2
Страница 54. Компонент TDDECIIentConv

Компонент TDDECIIentConv

Компонент TDDEClientConv осуществляет контакт на клиентской стороне. Именно в нем описаны методы, отвечающие за установление контакта. Имена требуемых сервера DDE и темы содержатся в свойствах:

Сервер и тема устанавливаются при вхождении в контакт. Предусмотрены два режима вхождения в него:

присваивает серверу и теме имена, равные Service и Topic, а если выбран режим контакта ddeAutomatic — то и устанавливает контакт. Будьте внима­тельны при задании параметров метода— здесь учитывается регистр символов. В случае режима ddeManual для установления контакта необходимо вызвать дополнительно метод:

Этот метод сначала закрывает предыдущий контакт, затем он пытается свя­заться с сервером DDEService на тему DDETopic. Если это не удается сразу (например, если требуемый сервер DDE отсутствует), то делается попытка загрузить программу с именем, определенным в свойстве

и установить контакт с ней. Если оно не определено (ServiceApplication = «), то в качестве последней попытки для контакта пробуется имя, представляющее собой конкатенацию имен сервера и темы, разделенных пробелом. В случае неудачи метод OpenLink возвращает False.

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

переключит компонент на новый контакт и вернет значение True. Наконец, метод

инициирует начало обмена данными. Обычно он вызывается в методе OpenLink.

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

Здесь Item — имя элемента данных, Data — передаваемые текстовые данные. Кроме того, некоторые серверы DDE имеют собственные наборы макрокоманд, запрос на выполнение которых можно послать от клиента. К ним относятся многие приложения, в т. ч. СУБД и электронные таблицы, такие, как Paradox и MS Excel; наиболее типичным примером служит Program Manager. Запрос на выполнение макрокоманд посылают методы:

function ExecuteMacroLines(Cmd: TStrings; waitFIg: Boolean): Boolean-function ExecuteMacro(Cmd: PChar; waitFIg: Boolean): Boolean;

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

устанавливается в True. При этом вызовы последних четырех описанных ме­тодов отрабатываться не будут, пока сервер не известит об окончании опе­рации, и WaitStat не примет значение False. Это свойство доступно только по чтению. Клиент может запросить данные от сервера немедленно с помощью метода:

Формат обмена данными можно узнать из свойства:

Перефразируя Генри Форда, скажем, что можно обмениваться данными любого формата, если этот формат — CF_TEXT.

Если возможностей, предоставляемых методами и свойствами класса, недоста­точно, то для вызова процедур библиотеки DDEML программисту доступен дескриптор контакта:

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

установлено в False. В этом случае все символы ASCII с десятичными кодами от 1 до 31 заменяются на пробел (код 32). В случае True преобразования не происходит.

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

по-видимому, зарезервировано ддя дальнейших применений.

Delphi Convert возвращает недопустимые типы

Я пытаюсь выполнить самую простую из Conversions в delphi, используя встроенную функцию Convert.

Просто конвертировать галлоны в литры.

Однако delphi возвращает недопустимый тип в единицах преобразования.

Галлоны и литры имеют форму TConvTypes

Однако, когда я пытаюсь выполнить код, Delphi возвращает следующее.

Это должна быть самая простая операция после прочтения документации Embarcadero, которая должна работать. На данный момент я не могу понять, что происходит.

Может кто-нибудь указать мне в правильном направлении?

Я редактировал сообщение, чтобы включить полный код устройства

Ваша программа должна изменять значения vuUKGallons и vuLiters или использовать разные. Эта программа:

Но эта программа:

Как и эта программа:

Вы должны использовать переменные vuXXX определенные в модуле System.StdConvs .

Обновить

Увидев ваш полный код, теперь ясно, что произошло.

Что такое указатель на фаил в делфи, как его получить и с чем его готовить

Мне препод заставил переделать чтоб в процедуру передавалось не имя файла а указатель, а я ваще не е*у чё это такое, может ктонить поможет?)

Добавлено через 5 часов 45 минут
Мне завтра лабу сдать уже нада, откликнитесь ктонить)

09.05.2011, 20:32

Что такое Delphi, и с чем его едят??
Всем привет, А какие бывают проекты в Delphi??

Что такое указатель и с чем его есть
Я уже не знаю что делать, но в книжке очень непонятно написано про указатели. Не могли бы вы.

DrawingVisual, что это такое и с чем его едят, или как перерисовать
Суть: есть Canvas (с координатами x) на котором рисуются DrawingVisual’ы, далее делается замена.

Что такое This и с чем его едят
Доброго дня/ночи Вот пытаюсь выкурить мануалы по теме «this». Прочитал надцать листов литературы.

что такое Qt, и с чем его едят?
Здравствуйте, я бы хотел узнать что такое Qt, и как на нем программировать, я слышал что это.

Илон Маск рекомендует:  Создание vxd на visual c без ассемблерных модулей
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL