Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Встраиваемые приложения   Найти похожие ветки 

 
boris3b   (2008-10-28 12:33) [0]

Задача: Из приложения [B]А[/B] запускается приложение [B]В[/B] посредством CreateProcess. Хитрым способом получаю Handle приложения [B]В[/B]. Отправляю приложению [B]В[/B] некую команду (строку), в которой передаю Handle приложения [B]А[/B] и Handle панели этого приложения. Приложение [B]В[/B] получив команду меняет своё ParentWindow на Handle панели.
 В итоге приложение [B]В[/B] как бы встраивается в приложение [B]А[/B], НО если перебрать все контролы и компоненты панели, на которую встроилось приложение [B]В[/B], то там ничего нет. Соответственно не работают ни какие ограничения (Constraints) приложения [B]В[/B]. Получается полное Г.

Вопрос: Как грамотно из одной проги запустить другую и [U]правильно[/U] встроить её на панель первой проги.


 
tesseract ©   (2008-10-28 12:36) [1]

А зачем вообще такие махинации, зачем вообще делать исполнимый файл ?  

ISpecifyPropertyPage в DLL и никакого шаманства.


 
boris3b   (2008-10-28 12:44) [2]

Что такое ISpecifyPropertyPage?
Суть моей задачи следующая: есть приложение, которое будет у каждого юзера (клиент). Это приложение получает из БД список других доступных приложений и создает соответственно кнопки для их запуска. Нажав на такую кнопку должно запуститься требуемое приложение и встроиться в данного клиента. В итоге можно потихоньку создавать новые проги для решения различных задач и добавлять инфо о них в БД. А клиент со временем не меняется.


 
Сергей М. ©   (2008-10-28 13:01) [3]


> получаю Handle приложения


Как можно получить то чего не существует в природе ?


 
boris3b   (2008-10-28 13:14) [4]


> Как можно получить то чего не существует в природе ?


Лучше бы по делу чего сказал, чем к словам придираться!

Пусть будет "Handle окна, в котором запущено приложение"


 
Сергей М. ©   (2008-10-28 13:19) [5]


> Пусть будет "Handle окна, в котором запущено приложение"
>


И это тоже не существует в природе.


 
tesseract ©   (2008-10-28 16:36) [6]


> Что такое ISpecifyPropertyPage?


Справка не работает ? Это такой COM-интерфейс для встривания в GUI - например в панель управления в настройки мыши / клавиатуры пихаеться параметры от того же logitech - это стандартная модель. И кстати функциональность к интерфейсу ну никак не привязана.

Ты сейчас занимаешься полной бессмыслицей, ты где нибудь плагин в виде exe видел ?. Для таких дел существует COM/DCOM и дитя их ActiveX. DCOM кстати совершенно по барабану на какой машине он запущен. Да и хранить файлы в базе тоже не кайф.


> В итоге можно потихоньку создавать новые проги для решения
> различных задач


Жаргоничик студенческий. В общем тебе нужно смотреть на COM/ActiveX или .Net сборки.


 
boris3b   (2008-10-28 16:58) [7]


> Жаргоничик студенческий


Несколько обидная фраза - года уже не те. Года 3 назад разбирался с ActiveX и делал ActiveX Form, но очень хотелось бы, чтоб всё работало без дополнительных dll и ActiveX. Появилась в БД запись о новой программе -> при запуске клиента скачивается готовый exe-файл -> запускается и встраивается в клиента.
 Вся нагрузка на клиента - это предоставление списка доступных программ, их запуск/завершение и слежение за местоположением/размерами относительно клиента.
 Пример - на FreeBSD есть программа Contact. Она содержит в себе контакты персон, почту, календарь, задачи/проекты... Во время работы данной программы, если посмотреть список выполняемых процессов, то видно, что каждая - это отдельный процесс. Отсюда и возникла моя "бредовая" идея - как сделать программу масштабируемой. Т.е. сегодня я еще не знаю, какую задачу мне надо будет реализовать завтра, но условие, чтобы всё запускалось из одной программы уже поставлено.


 
Сергей М. ©   (2008-10-28 17:03) [8]

Да запускай себе на здоровье что угодно где угодно !

Но причем здесь какое-то там "встраивание" ?


> Соответственно не работают ни какие ограничения (Constraints)


Ты ни шиша не понимаешь работы этого свойства.
Вот с изучения оного и начни, прежде чем обижаться.


 
boris3b   (2008-10-28 17:33) [9]


> Ты ни шиша не понимаешь работы этого свойства.


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

У меня в принципе уже всё работает. Если есть ещё силы обсуждать - давай попробуем...

Все контролы приложения В расположены на одной панели. При получении некой строковой команды от прил.А данная панель меняет своё ParentWindow на Handle панели приложения А. Теперь визуально кажется, что программа одна. Это я и называю встраиванием (заголовок на TaskBar я прячу).
Далее при изменении размеров панели прил.А по средствам передачи строковых команд меняет свое местоположение и размеры панель прил.В.

Теперь ставим панели прил.B constraints.MinWidth := 400; Когда я уменьшаю ширину прил.А уменьшается и прил.В, пока оно не станет = 400. Далее прил.В ужЕ Уже не станет, а прил.А об этом ни чего не знает.
 На этом месте я застопорился. Можно конечно далее перекидывать всякие команды между приложениями, но понимаю, что это всё криво и не правильно.
 Мне казалось, что если я делаю Panel1.ParentWindow := Panel2.Handle, то у Panel2 должно было увеличиться ControlCount, а на практике такого не случилось. Также мне кажется, что если бы мои ожидания оправдались, то работали бы и св-ва Align и constraints, да и вообще всё было бы "в шоколаде"...


 
Сергей М. ©   (2008-10-28 20:03) [10]


> у Panel2 должно было увеличиться ControlCount, а на практике
> такого не случилось


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


 
tesseract ©   (2008-10-28 21:37) [11]


> но очень хотелось бы, чтоб всё работало без дополнительных
> dll и ActiveX. Появилась в БД запись о новой программе -
>


епт типо exe уже чем-то круче? В обсчем сейчас ты знаимаешься ректальной реализацией  давно уже реализованного стандартными методами. Если хочешь иметь дело именно с VCL реализацией то нужно детально изучать структуру bpl и детали сношения с памятью VCL.


> Года 3 назад разбирался с ActiveX и делал ActiveX Form,


Я в возрасте полгода  в пелёнки писал. Вырос понял что это  неудобно. Ты в принципе не понимаешь как всё работает. ActiveX Form,  это то ещё недоразумение.


 
Германн ©   (2008-10-29 01:26) [12]


> tesseract ©   (28.10.08 16:36) [6]
>
> Ты сейчас занимаешься полной бессмыслицей, ты где нибудь
> плагин в виде exe видел ?

Я видел. Даже сам был однажды инициатором такого подхода. Но я никогда не болел тем, чтобы окно "внешнего" exe-шника встраивать в окно вызывающей программы.
Не. Я бы тоже советовал бы СОМ, но они не потянули бы. :(

P.S. Недавно один из них освоил основы ActiveX и теперь он хочет непременно получать для своей программы "драйверы устройств" по такой технологии.


 
boris3b   (2008-10-29 09:43) [13]


> Я в возрасте полгода  в пелёнки писал. Вырос понял что это
>  неудобно


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

 В общем - иди ты лесом...


 
Сергей М. ©   (2008-10-29 09:49) [14]


> Остальное - попытки тупо всё обосрать


Надеяться на остро пока нет повода)

Тебя заточка волнует или ты все же готов к диалогу, ведущему к осознанию где и в чем твоя ошибка ?

Вопрос в [10] остался без ответа ..


 
tesseract ©   (2008-10-29 10:09) [15]


> Все посты в уважительной форме и по делу.



> Остальное - попытки тупо всё обосрать.


Тебе сказали по делу - COM. Не мучайся с остальным, "по делу" это как ? Дают куски когда с WASM.ru ? Ты имей в виду в Висте такое может не заработать.


 
boris3b   (2008-10-29 10:28) [16]

> Надеяться на остро пока нет повода)
>
> Тебя заточка волнует или ты все же готов к диалогу, ведущему
> к осознанию где и в чем твоя ошибка ?
>


Первое предложение не понятно из-за опечатки.
К диалогу готов.

Хотелось бы от Вас услышать, как бы сделали Вы? Если нужно еще какие-то детали описать - спрашивайте.

В идеале это должно работать и в WinXP и в WinVista  и на FreeBSD под Wine.


 
Сергей М. ©   (2008-10-29 10:36) [17]


> boris3b   (29.10.08 10:28) [16]


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


 
boris3b   (2008-10-29 10:55) [18]


> Вот ты заявил, что тебе "казалось".
> Я хочу проследить твою логику и предлагаю тебе вслух изложить
> основания для такого предположения..


Вот чую, что это ещё одна попытка посмеяться над моими плясками с бубном.

Казалось мне потому, что:
1. Мои знания как взаимодействует VCL с API - никакие.
2. Я использую родное свойство VCL-компонента - ParentWindow, а не API - SetParent. И если почитать Delphi Help на ParentWindow, то там есть следующее - "This allows references to the control by applications based on other applications."


 
Сергей М. ©   (2008-10-29 11:26) [19]


> ещё одна попытка посмеяться


Что ж ты такой закомплексованный-то, а ?)


> если почитать Delphi Help на ParentWindow, то там есть следующее


Да, есть.

Но где там хоть какое-либо упоминание о ControlCount ?

И о каком ControlCount может идти речь, если родительским окном становится, к примеру, произвольное окно, не имеющее ни малейшего отношения к VCL ?

В конце-концов, если есть сомнения в справ.информации, открываем генофонд и видим там истину:

procedure TWinControl.SetParentWindow(Value: HWnd);
begin
 if (FParent = nil) and (FParentWindow <> Value) then
 begin
   if (FHandle <> 0) and (FParentWindow <> 0) and (Value <> 0) then
   begin
     FParentWindow := Value;
     Windows.SetParent(FHandle, Value);
     if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) then
       Perform(WM_CHANGEUISTATE, MakeWParam(UIS_INITIALIZE, UISF_HIDEACCEL or UISF_HIDEFOCUS), 0);
   end else
   begin
     DestroyHandle;
     FParentWindow := Value;
   end;
   UpdateControlState;
 end;
end;


Где здесь хоть какой-либо намек на ControlCount ?
Нет его.

И в UpdateControlState тоже ничего подобного нет.

Все что по сути делается - вызывается API-функция SetParent и следом перерисовываются все видимые окна, имеющие отношение к старому и новому родству окна переносимого к новому родителю контрола.


> 1. Мои знания как взаимодействует VCL с API - никакие


Ты же не предпринял элементарных телодвижений, чтобы они появились, откуда ж им взяться ?


> использую родное свойство VCL-компонента - ParentWindow,
>  а не API - SetParent


Элементарные, как видишь, исследования показывают, что установка TWinControl.ParentWindow сводится к вызову Windows.SetParent.


 
boris3b   (2008-10-29 11:50) [20]

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

  В общем иду я лесом сам в направлении COM. Если можете помочь найти книгу для скачки "Эрик Хармон "Разработка COM- приложений в среде Delphi" буду признателен.

P.S.: Всегда серьёзно относился к программированию БД, а к интерфейсу клиента так - красивые фантики, всегда получались без особых заморочек. А тут встрял.


 
Сергей М. ©   (2008-10-29 12:06) [21]


> если перебрать все контролы и компоненты панели, на которую
> встроилось приложение [B]В[/B], то там ничего нет


А собссно зачем этот перебор нужен ?



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
2-1255649628
mm0
2009-10-16 03:33
2009.12.13
Фокус на главную форму


3-1231501515
Виталий Панасенко
2009-01-09 14:45
2009.12.13
Ошибка с CHAR_SET WIN1251


15-1255725008
Юрий
2009-10-17 00:30
2009.12.13
С днем рождения ! 17 октября 2009 суббота


4-1225119197
K1LLADR1LLA
2008-10-27 17:53
2009.12.13
Windows Script Host + COM + ThreadPool


2-1256315797
xyz
2009-10-23 20:36
2009.12.13
WriteFile не компилируется