Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> взаимодействие приложения и формы в dll 
:(
    Опции темы
Teleport
Дата 7.12.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



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

У меня в главном приложении - есть DBGrid, в котором отображаются данные из бд baza.mdb. На главной форме есть кнопка Вызов - которая отображает форму из dll.
Также на главной форме есть еще кнопки 2: удалить и  добавить. Они добавляют или удаляют записи в бд.

В форме из dll - есть тоже DBGrid и две кнопки удалить и добавить.
Так вот вопрос: как сделать так чтобы в обоих этих DBGrid одновременно отображалась информация? Т.е. - я открыл форму из dll и удалил в ней запись  - тогда информация также мгновенно должна обновиться в DBGrid на главной форме. И наоборот - я открыл форму в dll и удаляю запись через главную форму - тут же должна обновится информация и в открытой форме dll в DBGrid...

Прикрепляю сделанные проекты.
Mainn.dpr - проект главного приложения
libr.dpr - проект dll
Unit1.pas- модуль формы dll

Примечание: ADOConnection.Caonnected и ADOTale1.Active в проекте в инспекторе объектов поставлены в значение false. Они активизируются при событии form1.Activate.

Это сообщение отредактировал(а) Teleport - 7.12.2008, 17:01

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  dll_parametrs_ADO.rar 27,16 Kb


--------------------
user posted image
user posted image 
PM MAIL   Вверх
THandle
Дата 7.12.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Teleport, ну... возможно глупая затея, но:

Может быть сделать 2 сообщения, одно на удаление записи, а другое на добавление.
И соответственно слать друг дружке такие сообщения и выполнять соответствующие действия?
PM   Вверх
Akella
Дата 7.12.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



В библиотеке тоже создай подключение (ADOConnection и т.д.) и при вызове передавай из вызывающего приложения в библиотеку параметры подключения.

Добавлено через 1 минуту и 54 секунды
Т.е. работай, как будто из двух разных приложений.
PM MAIL   Вверх
Teleport
Дата 7.12.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



THandle - наверное, не глупая затея. Подробней мне нужно объяснить на моем примере?... smile
Akella - в библиотеке все создано! сразу создал. И что только из этого?? обновления-то не происходит одновременно...
Как эти параметры подключения передать?

Это сообщение отредактировал(а) Teleport - 7.12.2008, 17:38


--------------------
user posted image
user posted image 
PM MAIL   Вверх
THandle
Дата 7.12.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Teleport, покажу просто пример. Можно вообще использовать любой тип оповещения в принципе-то.

Пример с сообщениями в аттаче.

Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  Exumpel.rar 443,99 Kb
PM   Вверх
Teleport
Дата 7.12.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



THandle - А вот в этих строках что такое 1001 и 1003?
Код

  WM_EXU_DELETE = WM_USER + 1001;
  WM_EXU_ADD = WM_USER + 1003;




--------------------
user posted image
user posted image 
PM MAIL   Вверх
THandle
Дата 7.12.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Teleport, цифры smile Разве не видно? smile 

Это номера сообщений.

http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx

Цитата

Application-Defined Messages

An application can create messages to be used by its own windows or to communicate with windows in other processes. If an application creates its own messages, the window procedure that receives them must interpret the messages and provide appropriate processing.

Message-identifier values are used as follows:

    * The system reserves message-identifier values in the range 0x0000 through 0x03FF (the value of WM_USER – 1) for system-defined messages. Applications cannot use these values for private messages.
    * Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers for private window classes.
    * If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages.
    * The system returns a message identifier in the range 0xC000 through 0xFFFF when an application calls the RegisterWindowMessage function to register a message. The message identifier returned by this function is guaranteed to be unique throughout the system. Use of this function prevents conflicts that can arise if other applications use the same message identifier for different purposes. 



PM   Вверх
Akella
Дата 7.12.2008, 20:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

Добавлено через 3 минуты и 50 секунд
Цитата(Teleport @  7.12.2008,  17:37 Найти цитируемый пост)
Как эти параметры подключения передать?

Как, как? А как ты что-то передаёшь в dll, так же и строку подключения передай!
PM MAIL   Вверх
Teleport
Дата 7.12.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



тему считаю закрытой


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Akella
Дата 7.12.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Код

procedure TfmMain.LoadPlugins();
Var
  i, iDllHandle:integer;
  PlugExec        : procedure(sender :TObject) of object;
  PlugType        : function : integer;  //Объявление функции, которая будет возвращать тип плугина
  GetConnectInfo  : procedure(fbclient,DB:PChar;db_connected:boolean);
  GetUserData     : procedure(UID:integer;UserName:PChar);
  MenuCaption : function : PChar;
  act: TAction;
  NewItem :TMenuItem;
begin
  iDllHandleAreas  := 0;
  slPlagins        := TStringList.Create;
  slPlaginsHandles := TStringList.Create;
  FindPlugins(IncludeTrailingPathDelimiter(sAppPath)+'Plugins\');
  if slPlagins.Count <= 0 then begin
    FreeAndNil(slPlagins);
    exit;
  end;
  LOG(self.Name+' Загрузка плагинов');
  //если найдены плагины, то пытаемся их загрузить
  for I := 0 to slPlagins.Count - 1 do begin
    //iDllHandleAreas
    iDllHandle := LoadLibrary(PChar(slPlagins[i]));
    slPlaginsHandles.Add(IntToStr(iDllHandle));

    if iDllHandle <> 0 then begin
      @plugExec := GetProcAddress(iDllHandle,'PluginExec');
      @plugType := GetProcAddress(iDllHandle,'PluginType');
      @GetConnectInfo := GetProcAddress(iDllHandle,'GetConnectInfo');
      @GetUserData    := GetProcAddress(iDllHandle,'GetUserData');

      GetUserData(UserData.UserID,PChar(UserData.UserName));
      GetConnectInfo(PChar(DM.fibDB.LibraryName),PChar(DM.fibDB.DBName),DM.fibDB.TestConnected);

      NewItem         := TMenuItem.Create(Self);
      @MenuCaption    := GetProcAddress(iDllHandle,'MenuCaption');
      act             := TAction.Create(am1);
      act.ActionList  := am1;
      act.onExecute   := plugExec;
      act.caption     := MenuCaption;
      if MenuCaption = 'Участки [RA Innovations]' then
        iDllHandleAreas := iDllHandle;

      NewItem.Action  := act;
      mmMainMenu.Items.Items[PlugType].Add(NewItem);
      Log(self.Name+' Плагин успешно загружен: '+MenuCaption);

    end;
  end;//for
end;



Код

library Areas;

uses
  ShareMem,
  SysUtils,
  uAreas in 'uAreas.pas' {fmAreas},
  uAddPhone in 'uAddPhone.pas' {fmAddPhone},
  uCSIDL in '..\..\uCSIDL.pas',
  uPhoto in 'uPhoto.pas' {fmPhoto1},
  uOptionsAreas in 'uOptionsAreas.pas' {fmOptionsAreas};

{$R *.res}

type
  TUSerData = record
    UserName, Password:String;
    UserID:integer;
  end;

type
  TConnectInfo = record
    fbclient,DB  : PChar;
    db_conn : boolean;
  end;

Var
// kvx_handle:integer;
  UserData   : TUserData;
  ConnectInfo : TConnectInfo;


function MenuCaption:Pchar;
begin
  result := 'Участки [RA Innovations]';
end;

function PluginType:integer;
begin //5 - Индекс главного меню
  result := 5;//Участки
end;


procedure PluginExec(Sender:Tobject);
begin
  if Assigned(fmAreas) then FreeAndNil(fmAreas);
  fmAreas := TfmAreas.Create(nil);
  fmAreas.UserData.UserName := UserData.UserName;
  fmAreas.UserData.Password := UserData.Password;
  fmAreas.UserData.UserID   := UserData.UserID;

  with fmAreas do begin
    fibDbAreas.ConnectParams.UserName  := 'SYSDBA';
    fibDbAreas.ConnectParams.Password  := 'masterkey';
    fibDbAreas.LibraryName             := ConnectInfo.fbclient;
    fibDbAreas.DatabaseName            := ConnectInfo.DB;
    fibDbAreas.Connected               := ConnectInfo.db_conn;
  end;
  fmAreas.Show;

end;

procedure GetUserData(UID:integer;UserName:PChar);
begin
  UserData.UserName := UserName;
  UserData.UserID   := UID;
end;


procedure GetConnectInfo(fbclient,DB:PChar; db_connected:boolean);
begin
  ConnectInfo.fbclient := fbclient;
  ConnectInfo.DB       := DB;
  ConnectInfo.db_conn  := db_connected;
end;

procedure ShowEditForm(ID:Integer);
begin
  bDoInsert   := false;
  iEditingID  := ID;
  LoadData(ID);
  fmAreas.Show;

end;


exports
  PluginType, MenuCaption, PluginExec, GetUserData, GetConnectInfo, ShowEditForm;


begin
end.

PM MAIL   Вверх
THandle
Дата 7.12.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Teleport @  7.12.2008,  20:17 Найти цитируемый пост)
тему считаю закрытой 


Проблему то решил? smile

Akella, что это? smile  Я лично сходу не врубился во все это дело? Откуда-то вынутый кусок кода?
PM   Вверх
Akella
Дата 7.12.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



думал, что по названиям догадаетесь. smile 
Код

//Это поиск и загрузка dll`ок
procedure TfmMain.LoadPlugins();
...



Код

это код одного из плагинов
library Areas;
....





Из вызывающего приложения порядок вызова процедур плагина
Код

  @plugExec := GetProcAddress(iDllHandle,'PluginExec');
      @plugType := GetProcAddress(iDllHandle,'PluginType');
      @GetConnectInfo := GetProcAddress(iDllHandle,'GetConnectInfo');
      @GetUserData    := GetProcAddress(iDllHandle,'GetUserData');
      GetUserData(UserData.UserID,PChar(UserData.UserName));
      GetConnectInfo(PChar(DM.fibDB.LibraryName),PChar(DM.fibDB.DBName),DM.fibDB.TestConnected);


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


Создаём новый пункт меню:
Код

      NewItem         := TMenuItem.Create(Self);
      @MenuCaption    := GetProcAddress(iDllHandle,'MenuCaption');
      act             := TAction.Create(am1);
      act.ActionList  := am1;
      act.onExecute   := plugExec;//цепляем процедуру вызова главной формы плагина
      act.caption     := MenuCaption;
      NewItem.Action  := act;


{
куда цеплять, к какому пункту меню указано в самом плагине
function PluginType:integer;
begin //5 - Индекс главного меню
  result := 5;//Меню "Участки" вызывающего приложения
end;

}

      mmMainMenu.Items.Items[PlugType].Add(NewItem);


Это сообщение отредактировал(а) Akella - 7.12.2008, 20:46
PM MAIL   Вверх
Teleport
Дата 7.12.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



THandle - не решил и решу не скоро. smile Буду с нуля в ней разбираться. Пусть через полгода решу - но решу. smile
Akella прав, мне эти примеры ни о чем просто. smile я знаю немного  работу с dll по статьям из delphi world и все. Открыл статьи по процессам и потокам. Пытаюсь работать с сообщениями. 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Akella
Дата 8.12.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Читай, как работать с плагинами. Я по-моему взял из DRKB, точно не помню.
PM MAIL   Вверх
lukas
Дата 10.12.2008, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Могу еще посоветовать экспортировать функции из *.exe , т.е. использовать exe как dll, для того чтобы функции нормально экспортировались из exe, их нужно поместить в *.dpr файл. Ну и вызывать нужные тебе функции в *.exe из dll.

Это сообщение отредактировал(а) lukas - 10.12.2008, 20:41


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.