Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Цитата:
    Access violation at address 034673E4 in module 'bbc5_reports.dll'. Read of address 00000378  

    а не подскажешь что находится в 'bbc5_reports.dll' по смещению  0х034673E4 ?
    у нас телепатов нету

    Код:
    procedure DisplaySampleReport(AppHandle:THandle);  
    begin  
      Application.Handle:=AppHandle;  
      frmReports := frmReports.Create(nil);  
      try  
        try
           frmReports.frxReport1.showreport;  
         except
          on e: Exception do ShowMessage(E.message);
         end;  // try/except
      finally  
        FreeAndNil(frmReports);
        Application.Handle:=0;  
      end;  
    end;  
     
    и как вызываешь dll ?
     
    Добавлено:
    Man_Without_Face лень было писать динамическую загрузку длл а так ..
    Подробнее...

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:41 30-03-2010 | Исправлено: greenpc, 11:42 30-03-2010
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Не тот, не тот вариант не работает у меня (Access violation). Вот полностью весь код: Подробнее...
    CodeGear 2009 + FastReports 4.8
     
    Добавлено:
      frmReports := frmReports.Create(nil); //Вроде сюда ругается, но почему?

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 13:44 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    во-первых несоотвествие параметров !

    Код:
    procedure TfrmMain.cxButton1Click(Sender: TObject);  
    var  
      LibHandle: THandle;  
      fDisplaySampleReport: procedure(appHandle : THandle);  
    ....
       
     if @fDisplaySampleReport <> nil then  
             fDisplaySampleReport(Application.Handle); // Вызов процедуры из Dll  
     


    Код:
    cxButtons, DB, DBTables, uReports;  
     

     
    далее  
    library bbc5_reports;  

    Код:
     
    uses  
      SysUtils, forms, uMain,  
      Classes, dialogs,  
     
    зачем ???? длл - отдельное приложение и "прямой связи" с главным окном нет
    unit uReports;

    Код:
    implementation  
      uses uMain;  
    {$R *.dfm}  
     
    соттвественно.  
    ЗЫ: читаем теорию о dll и ее вызове, а иначе полная каша
     
     
    Добавлено:
    Man_Without_Face

    Код:
    procedure Ttest.SpeedButton1Click(Sender: TObject);
    var
      PlugExec : Procedure (appHandle: Thandle); stdcall; //Объявление функции, которая будет выполнять плугин
      handle   : Thandle;  //Хендл dll
     
    begin          
     if not FileExists('test.dll') then
       MessageDlg('Нет файла test.dll', mtError, [mbOK], 0);
     handle := LoadLibrary('test.dll');  //Загружаем dll
     try
       if handle <>0 then  //Если всё в порядке, то идём дальше
        begin
          //Загружаем функции
         @PlugExec := GetProcAddress(handle,'PluginExec');
         try
           PlugExec(application.handle);
         except
          on e: Exception do
              MessageDlg(PChar(E.Message), mtError, [mbOK],0);
         end;  // try/except
       end;
     finally
       FreeLibrary(handle);    //Уничтожаем dll
     end;  // try/finally
    end;
     
    и ГЛАВНОЕ все ошибки длл должны обрабатываться.

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:59 30-03-2010 | Исправлено: greenpc, 14:21 30-03-2010
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    Может все таки так?

    Цитата:
    frmReports := TfrmReports.Create(nil); //Вроде сюда ругается, но почему?


    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 15:14 30-03-2010
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc Спасибо
    volser В точку, спасибо, все пошло.
    Я же могу через компонент Tdatabase, кот находится на главной форме, конектиться к базе в Dll? Может дописать нужно что нибудь в Uses, потому что так ошибку выдает:
    project bbc5.exe raised exception class EClassNotFount with message 'Class TfrxBDEQuery not found".
     

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 15:49 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Цитата:
    Я же могу через компонент Tdatabase, кот находится на главной форме, конектиться к базе в Dll
    нет.
    в длл можно передать коннект, id и т.д. это будет правильно.
    а если хочется получить Tdatabase и еще из главного приложения то разруливать надо через хэндл - большой гемор. сделать проще -  решение подсказывал AviDen
     через bpl.
    ЗЫ: вопрос. а зачем пихать отчет в отдельный модуль если все денные для этого отчета в главном окне? имело бы смысл это делать если в самой длл читались/создавались данные.

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:02 30-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
     
    Я же могу через компонент Tdatabase, кот находится на главной форме, конектиться к базе в Dll?
     
    Нет, не можете. Если используются просто dll - не bpl! - то НИКАКИМИ из объектов, объявленных и созданных в exe, из dll пользоваться нельзя - и наоборот (не, ну попробовать-то можно - но результат, скорей всего, разочарует). В Вашем случае - нужно два отдельных коннекта к БД, для exe и для dll.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 16:05 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Цитата:
    project bbc5.exe raised exception class EClassNotFount with message 'Class TfrxBDEQuery not found".  

    переводим ошибку: класс TfrxBDEQuery не найден. ищем где описан данный клас.
    unit frxBDEComponents.

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:06 30-03-2010
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc

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

    Это выдумал не я, у старшего программиста есть проект, в кот примерно 50 отчетов, по ему ведомым причинам нужно вынести отчеты в dll или bpl файл. Конект с базой, он сказал лучше сделать через exe, но вроде можно и так. По dll у меня есть хоть какая то информаци (DelphiWorld6), про bpl там ничего нету, в нете тоже ничего не нарыл интересного.
    Odysseos

    Цитата:
    два отдельных коннекта к БД, для exe и для dll.

    Я так понимаю если я на форму в dll вытащу и настрою Tdatabase как в главной форму, то так не получится, нужно как то по другому?
     
     

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 16:20 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    что за база?

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:24 30-03-2010
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Понял конект есть, а вот если на маин положить компонент то запрашивает пароль спасибо.
    Odysseos Наверное выше написанный вопрос снят, спасибо.
    Что бы данные передать для запроса из меин формы я так понимаю можно использовать:  
    procedure SetData(Kind:TDataKind;const Buffer;Size:Integer)).  ?
     
     
     
    Добавлено:
    greenpc sybase 8.0

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 16:27 30-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos

    Цитата:
    Если используются просто dll - не bpl! - то НИКАКИМИ из объектов, объявленных и созданных в exe, из dll пользоваться нельзя - и наоборот (не, ну попробовать-то можно - но результат, скорей всего, разочарует)

    Хм, а я вот задумался - с чего бы это? Вроде никаких принципиальных препятствий для этого не существует, адресное пространство и области видимости различных системных объектов/хендлом и прочего у основного модуля и dll общие. Единственное, что нужно передавать хендл объекта Application, если шарится работа с GUI и пользовать borldmm, если передаются/возвращаются параметры типа строка / variant / interface / dynamic array. Но пробовать - не пробовал, скажу честно ))

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 16:28 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Код:
    var  
      LibHandle: THandle;  
      fDisplaySampleReport: procedure(appHandle : THandle; myconnection :Tdatabase );  

    соотвественно в длл (в форме) создать и/или присвоить этот параметр

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:31 30-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
     
    Хм, а я вот задумался - с чего бы это?
     
    Уж скока раз этот вопрос обсуждали
     
    Если мы будем пользовать BorlndMM.dll (или FastMM - который умеет и без отдельной dll находить свои копии и цепляться к ним) - то тогда передача объектов из exe в dll и обратно работать будет - но только в том случае, если и в dll, и в exe у классов этих объектов "симметричные" VMT (то есть - набор и последовательность методов в VMT у exe.MyClass и у dll.MyClass одинаковы), а так будет только в том случае, если и exe, и dll скомпилированы одной версией компилятора, с одинаковыми настройками, с одинаковыми условными ключами компиляции и с одинаковыми версиями VCL и сторонних библиотек. А это - гадание на кофейной гуще.
     
    Есть более надежный способ - передавать объекты не как объекты, а как интерфейсы (кроме того - так можно передавать их и между Delphi-exe и C++-dll, например).

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 17:53 30-03-2010 | Исправлено: Odysseos, 17:55 30-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый вечер. Есть ли в природе компоненты, которые позволяют работать с оборудованием Cisco (IP) (сеть у нас подключается тут через телефон)?  
    Нужно встроить в свой проект дополнительный функционал - автонабор номера из программы, определение номера звонящего и так далее. Есть в природе программа - WebAgent зовется, там все фичи реализованны,  но за лицензию за каждого пользователя просят слишком много, плюс ко всему глючная по полной.

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 19:15 30-03-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
    Вы забываете про глобальные переменные, которые есть в системных модулях и по идее должны существовать в единственном экземпляре. Плюс в этом случае TButton в exe и dll - разные вещи, и проверка аналогичная Sender is TButton не сработает.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:04 30-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    а что мешает передать форму?

    Код:
    Procedure PluginExec(appHandle : THandle; parForm : TForm); stdcall;
    var
        i : Integer;
        TmpStr : string;
    begin
      Application.Handle := appHandle;
      try
      for i := 0 to parForm.ComponentCount - 1 do begin
        TmpStr := TmpStr+ Format('Name - %s; class - %s', [parForm.Components[i].Name, parForm.Components[i].ClassName])+#13#10;
      end;    // for
    showmessage(TmpStr);
      finally
         Application.Handle := 0;
      end;
    end;    //

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:22 31-03-2010 | Исправлено: greenpc, 09:57 31-03-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Ничего, кроме кучи странных и трудно выловимых глюков, с которыми вы скорее всего столкнетесь, если реальный код будет немного сложнее того, что вы написали. В общем, имхо, если нужно активное взамодействие компонентов в dll и exe, то проще всего будет включить рантайм пакеты.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:03 31-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos, Frodo_Torbins короче, понятно, такой метод годится разве что для энтузиастов и на спор (типа заработает-не заработает). BPL наше всё, как и было сказано изначально ))
     
    greenpc, да ничего не мешает. Но в указанном случае объект класса exe.Forms.TForm будет явно приведен к типу dll.Forms.TForm (не забываем, что и dll, и exe имеют свои экземпляры модуля Forms, да и всех прочих). Если, как сказал Odysseos, оба бинарника скомпилированы из 100% одинаковых исходников и в 100% равных настройках окружения/компиляции и пр. - это будет работать. В противном случае получим массу увлекательных (и трудноуловимых) багов.
     
    Например, вызывая в той же процедуре PluginExec метод parForm.Show мы передаём управление к методу dll.Forms.TForm.Show, но указатель на данные (Self) туда передаётся из exe.Forms.TForm. Если в этих двух структурах данных (exe.Forms.TForm и dll.Forms.TForm) есть хоть малейшие отличия (напр., по-разному выровнены поля в записях) - пиши пропало.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 11:05 31-03-2010
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Знатоки, помогите решить проблему.
    Имеется главная форма и форма ввода кода доступа. Список пользователей хранится в таблице Users база Firebird.
    Как сделать, чтобы при вводе пароля в окне форма ввода кода доступа, проводилась его проверка на корректность в базе данных, и в случае, если пользователь не найден в базе - программа завершается без вывода главной формы без противного мигания.

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 08:27 01-04-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru