Фрейм bp DLL
От: KBH  
Дата: 05.07.03 10:19
Оценка:
Привет, трудоголики.

Засунул я фрейм в DLL.
Подключаю её динамически и кладу фрейм на панель.
Проблема в том, что при обходе элементов табом, элементы фрейма не получают фокуса.
TDBGrid, например, вообще фокуса не имеет и ввести в него что-либо невозможно.
TEdit фокус емеет, но при нажатии Tab, фокус переходит к элементу, который находится вне фрейма.
Re: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.07.03 01:07
Оценка: +1
Здравствуйте, KBH, Вы писали:

KBH>Привет, трудоголики.


KBH>Засунул я фрейм в DLL.

KBH>Подключаю её динамически и кладу фрейм на панель.
KBH>Проблема в том, что при обходе элементов табом, элементы фрейма не получают фокуса.
KBH>TDBGrid, например, вообще фокуса не имеет и ввести в него что-либо невозможно.
KBH>TEdit фокус емеет, но при нажатии Tab, фокус переходит к элементу, который находится вне фрейма.
Может, все-таки поместить его в package, а не в DLL? Это сделает твою жизнь намного приятнее.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Фрейм bp DLL
От: Demiurg  
Дата: 08.07.03 11:11
Оценка:
Здравствуйте, KBH, Вы писали:

KBH>Привет, трудоголики.


KBH>Засунул я фрейм в DLL.

KBH>Подключаю её динамически и кладу фрейм на панель.
KBH>Проблема в том, что при обходе элементов табом, элементы фрейма не получают фокуса.
KBH>TDBGrid, например, вообще фокуса не имеет и ввести в него что-либо невозможно.
KBH>TEdit фокус емеет, но при нажатии Tab, фокус переходит к элементу, который находится вне фрейма.

Во-первых, ты синхронизировал объекты Application EXE и DLL, и, самое главное, вызываешь вовремя Application.Idle в dll? Ведь так в dll не запущен цикл обработки сообщений.
... << RSDN@Home 1.1 beta 1 >>
Re[2]: Фрейм bp DLL
От: KBH  
Дата: 08.07.03 12:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Может, все-таки поместить его в package, а не в DLL? Это сделает твою жизнь намного приятнее.


Справился. Отлично работает в DLL.

А чем пакеты лучше DLL?
Re[3]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.07.03 13:06
Оценка:
Здравствуйте, KBH, Вы писали:

KBH>А чем пакеты лучше DLL?

Тем, что в них гарантируется использование единственной копии кода и глобальных данных. Скажем так, объект Forms.Application в главном приложении и в пакете — один и тот же. А в DLL он будет свой (поскольку в ней своя копия модуля Forms). И еще много всяких вещей. Типпа того, что оператор is не будет работать, если применять его в DLL к объектам, созданным главным приложением, и наоборот. Из-за того, что у них разные копии классов. А в пакете — все в порядке.
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Фрейм bp DLL
От: KBH  
Дата: 08.07.03 13:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

...
Типпа того, что оператор is не будет работать, если применять его в DLL к объектам, созданным главным приложением, и наоборот. Из-за того, что у них разные копии классов. А в пакете — все в порядке.

Напомни пожалуйста, что означает оператор is. Давно не программировал в Delphi.
Re[5]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.07.03 13:46
Оценка:
Здравствуйте, KBH, Вы писали:

KBH>Напомни пожалуйста, что означает оператор is. Давно не программировал в Delphi.

Ну, F1 в таких случаях помогает.
Так вот, оператор
AnObject is AClass
проверяет, является ли класс объекта AnObject потомком класса AClass. Возвращает true если так. Типичное применение — в обработчиках событий:
if Sender is TLabel then TLabel(Sender).Caption:= 'Vow';
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Фрейм bp DLL
От: KBH  
Дата: 08.07.03 13:49
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну, F1 в таких случаях помогает.


Я пользуюсь Builder'ом.
Re[6]: Фрейм bp DLL
От: mrred  
Дата: 08.07.03 14:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, KBH, Вы писали:


S>Так вот, оператор

S>AnObject is AClass
S>проверяет, является ли класс объекта AnObject потомком класса AClass. Возвращает true если так. S>
S>if Sender is TLabel then TLabel(Sender).Caption:= 'Vow';
S>


Опять-таки F1 помогает:

if Sender.InheritsFrom(TLabel) then TLabel(Sender).Caption := 'Vow';


При использовании динамической линковки с bpg(это я про Билдер) никаких проблем не возникает...
Re[7]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.03 10:27
Оценка:
Здравствуйте, mrred, Вы писали:

M>При использовании динамической линковки с bpg(это я про Билдер) никаких проблем не возникает...

Т.е в DLL корректно опознается класс объекта, созданного в главном приложении?
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Фрейм bp DLL
От: mrred  
Дата: 09.07.03 10:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, mrred, Вы писали:


M>>При использовании динамической линковки с bpg(это я про Билдер) никаких проблем не возникает...

S>Т.е в DLL корректно опознается класс объекта, созданного в главном приложении?

А почему он должен некорректно опознаваться? Если ты можешь привести пример ошибочного определения — я мог бы тебе сказать конкретно...
Re[9]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.03 11:02
Оценка:
Здравствуйте, mrred, Вы писали:

M>А почему он должен некорректно опознаваться? Если ты можешь привести пример ошибочного определения — я мог бы тебе сказать конкретно...

А потому, что опознание идет путем сравнения указателей на VMT. В DLL будет своя копия класса TLabel, а в главном приложении — своя. Все. Указатели на VMT не совпадают.
Вообще, этому вопросу на DelphiKingdom, да и в этом форуме уже посвятили довольно много внимания.
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Фрейм bp DLL
От: mrred  
Дата: 09.07.03 12:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, mrred, Вы писали:


M>>А почему он должен некорректно опознаваться? Если ты можешь привести пример ошибочного определения — я мог бы тебе сказать конкретно...

S>А потому, что опознание идет путем сравнения указателей на VMT. В DLL будет своя копия класса TLabel, а в главном приложении — своя. Все. Указатели на VMT не совпадают.
S>Вообще, этому вопросу на DelphiKingdom, да и в этом форуме уже посвятили довольно много внимания.


При динамической линковке package'й все работает и is и InheritsFrom. Без проблем.
Re[8]: Фрейм bp DLL
От: KBH  
Дата: 09.07.03 12:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Т.е в DLL корректно опознается класс объекта, созданного в главном приложении?


А почему он не должен опознаваться? К какому типу указатель приведешь такого типа и будет объект.
Re[9]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.03 14:02
Оценка:
Здравствуйте, KBH, Вы писали:
KBH>А почему он не должен опознаваться? К какому типу указатель приведешь такого типа и будет объект.
Это заблуждение.
От того, что ты откастишь TTimer к TLabel, он не станет TLabel'ом. Увы.
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.03 14:02
Оценка:
Здравствуйте, mrred, Вы писали:

M>При динамической линковке package'й все работает и is и InheritsFrom. Без проблем.

Ну да, есть и такой способ. Но только дело в том, что как только ты написал DLL таким образом, ты вынужден в хост-приложении тоже использовать runtime packages. Иначе у тебя VCLXX.bpl статически слинкуется с екзешником, а lkk заимпортирует его же динамически. И опять все классы будут в двойном экземпляре.
При этом если package requires чего-то там, то он это получит, неважно, статически или динамически слинкован этот VCL с приложением. И получит ровно один экземпляр.
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Фрейм bp DLL
От: s.ts  
Дата: 09.07.03 14:24
Оценка: -1
Здравствуйте, Sinclair, Вы писали:


S>Ну да, есть и такой способ. Но только дело в том, что как только ты написал DLL таким образом, ты вынужден в хост-приложении тоже использовать runtime packages. Иначе у тебя VCLXX.bpl статически слинкуется с екзешником, а lkk заимпортирует его же динамически. И опять все классы будут в двойном экземпляре.


Дык тогда и dll (в смысле .Lib) прилинковывай статически и не будет ни каких проблем.
Преимущество bpl выражается в основном в том, что из них проще экспортировать классы.
Re[12]: Фрейм bp DLL
От: mrred  
Дата: 10.07.03 06:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, mrred, Вы писали:


M>>При динамической линковке package'й все работает и is и InheritsFrom. Без проблем.

S>Ну да, есть и такой способ. Но только дело в том, что как только ты написал DLL таким образом, ты S>вынужден в хост-приложении тоже использовать runtime packages.

А что мешает сделать так? В конце концов — длл и пишут для придания приложению модульности и универсальности.


S>Иначе у тебя VCLXX.bpl статически слинкуется с екзешником, а lkk заимпортирует его же динамически. S>И опять все классы будут в двойном экземпляре.



S>При этом если package requires чего-то там, то он это получит, неважно, статически или динамически S>слинкован этот VCL с приложением. И получит ровно один экземпляр.


Безусловно получит, ты прав. Но — что опять таки мешает более тщательно отнестись к подбору package's, линкуемых в проект? В конце концов динамическая и статическая линковки — всего лишь 2 способа сборки проекта, выбор одного из которых зависит только от разработчика и его конечной цели — хочет ли он получить один — но большой запускаемый файл или один маленький, но с набором библиотек, которые можно менять без пересборки всего проекта.

Удачи.
Re[13]: Фрейм bp DLL
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.07.03 12:35
Оценка:
Здравствуйте, mrred, Вы писали:

M>Безусловно получит, ты прав. Но — что опять таки мешает более тщательно отнестись к подбору package's, линкуемых в проект? В конце концов динамическая и статическая линковки — всего лишь 2 способа сборки проекта, выбор одного из которых зависит только от разработчика и его конечной цели — хочет ли он получить один — но большой запускаемый файл или один маленький, но с набором библиотек, которые можно менять без пересборки всего проекта.


M>Удачи.

Я просто не могу понять, что мешает использовать Package вместо DLL. При котором не надо тщательно относиться к подбору и т.п. Ребята из борланд провели некривую работу для того, чтобы обеспечить разработчикам легкую жизнь. Единственная причина для написания именно DLL — это интеграция с non-VCL приложениями.
... << RSDN@Home 1.1 alpha 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Фрейм bp DLL
От: KBH  
Дата: 10.07.03 12:51
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Это заблуждение.

S>От того, что ты откастишь TTimer к TLabel, он не станет TLabel'ом. Увы.

Скажи, а зачем мне приводить TTimer к TLabel?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.