рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Implementation

Implementation - раздел Религия, Хранения формы в динамических библиотеках Обрати Внимание, Что Первое Описание Процедуры Я Написал Не В Разделе ...

Обрати внимание, что первое описание процедуры я написал не в разделе type, а до него:

procedure ShowAbout(Handle: THandle)stdcall;

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

procedure TForm1.Button1Click(Sender: TObject); begin ShowAbout(Handle); end;

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

На компакт диске, в директорииПримерыГлава 18Formты можешь увидеть пример этой программы.

 

18.5. Немодальные окна в динамических библиотеках.

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

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

Давай откроем предыдущий пример и подкорректируем его. Для начала нужно добавить одну экспортную процедуру FreeAbout с индексом 11. Теперь у нас будет экспортироваться две процедуры:

exports ShowAbout index 10; exports FreeAbout index 11;

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

Ещё нужно добавить процедуру FreeAbout с одним параметром типа LongInt.

function ShowAbout(Handle: THandle):LongInt;export;stdcall; procedure FreeAbout(FormRef: LongInt);export;stdcall;

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

Теперь посмотрим на реализацию функции ShowAbout:

function ShowAbout(Handle: THandle):LongInt;

begin Application.Handle := Handle; Form1:= TForm1.Create(Application); Form1.Show; Result:=LongInt(Form1);

end;

Здесь всё осталось также, за исключением последней строчки. Если раньше мы освобождали память, то сейчас возвращаем окно Form1 приведённую к типу Integer. Если бы мы тут вызвали метод Free, то окно сразу же после появления закрылось бы.

Теперь посмотрим на процедуру FreeAbout:

procedure FreeAbout(FormRef: LongInt); begin if FormRef>0 then TForm1(FormRef).Free; end;

В этой процедуре мы сначала проверяем, если переменная FormRef (идентификатор окна) больше нуля, то окно можно уничтожать, иначе оно могло быть уже уничтожено. Во второй строке я вызываю метод Free нашего окна. Так как переменная FormRef – это числовая переменная и у неё нет методов, то мы должны перевести её обратно к объекту -TForm1(FormRef).

Теперь подкорректируем проект, который использует DLL файл. Для начала подправь объявления процедур библиотеки. Перед разделом typeнапиши следующее:

– Конец работы –

Эта тема принадлежит разделу:

Хранения формы в динамических библиотеках

Глава Динамически компонуемые библиотеки...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Implementation

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Решение №1.
Самым первым решением этой проблемы стал модульное программирование. Ты пишешь какой-то кусок кода, оформляешь его в виде модуля, а потом просто используешь его в своих программах. Все прекрасно и

Проблема №1.
Давай представим ситуацию, когда один добрый человек написал прекрасный модуль размером в 1 мегабайт. Другой добрый человек решил воспользоваться его возможностями и подключил к своей программе. Мо

Проблема №2.
Пока существовали только однозадачные операционные системы, проблема с излишней растратой дискового пространства была единственной. Но как только задумались о многозадачности и в мыслях Билла Гейтс

Решение №2.
И вот тут было найдено вполне солидное решение: не стыковать модули с основной программой, а сохранять их в отдельный файл и пусть любая программа загружает его по мере надобности. Сказали, сделали

Из чего же сделан Windows?
Все наверно помнят такую песенку: "Из чего же, из чего же, из чего же, сделаны эти мальчишки?". Глупейшая песня, и я со слезами на глазах вспоминаю, как я в лагере (я имею ввиду пионерски

Графические движки.
Любой игрок обязан знать про существование OpenGL. Что это такое? Какой-то пакет программ? Какой-то SDK для создания графики? Ничего подобного, это всего лишь две динамические библиотеки opengl.dll

Begin end.
Если открыть менеджер проектов (Меню View->Project Manager), то в окне вообще не будет видно ни одного модуля. Это потому что код, который мы видели выше относиться к самой библиотеки. Вы

Begin end.
Обрати внимание, что функция у нас объявлена не так как всегда. В конце строки объявления, после типа возвращаемого значения стоит ключевое слово StdCall. Оно говорит о том, что дл

R:Integer; begin
r:=Summ(10,34); Application.MessageBox(PChar(IntToStr(r)), 'Результат функции Summ'); end; В первой строчке я вызываю функцию Summ с двумя

SysUtils, Classes; {$R *.RES} exports ShowAbout index 10; begin end.
Я добавил только одну строку exports ShowAbout index 10;. У нас будет только одна процедура ShowAbout с индексом 10. Эта процедура будет показывать окно «О программе».

Function ShowAbout(Handle: THandle):LongInt;stdcall; procedure FreeAbout(FormRef: LongInt);export;stdcall
В разделе varпишем следующее: function ShowAbout;external 'ProjectDLL.dll' index 10; procedure FreeAbout;external 'ProjectDLL.dll' index 11; Всё

If f>0 then
FreeAbout(f); f:=ShowAbout(Handle); end; Здесь идёт проверка, если f больше нуля, то надо освободить память от старого окна, а потом пытат

If @sa=nil then exit;//Функция не найдена
f:=sa(Handle); FreeLibrary(dllHandle); end; Здесь у меня объявлено две локальные переменные: dllHandle – здесь будет храниться указатель на загруженную библиот

DLLEntryPoint(DLL_PROCESS_ATTACH); end.
В разделе usesпоявилось объявление двух новых модулей windows и dialogs, без них наш код не скомпилируется. Чуть дальше появилась процедура DLLEntryPoint с одн

Begin end.
Первое, что здесь бросается в глаза – объявление в разделе typeнового типа – TCompProc. Новый тип объявлен как процедура с одним параметром в виде переменной типа PChar

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги