-
Задача: Из приложения [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] встроить её на панель первой проги.
-
А зачем вообще такие махинации, зачем вообще делать исполнимый файл ?
ISpecifyPropertyPage в DLL и никакого шаманства.
-
Что такое ISpecifyPropertyPage? Суть моей задачи следующая: есть приложение, которое будет у каждого юзера (клиент). Это приложение получает из БД список других доступных приложений и создает соответственно кнопки для их запуска. Нажав на такую кнопку должно запуститься требуемое приложение и встроиться в данного клиента. В итоге можно потихоньку создавать новые проги для решения различных задач и добавлять инфо о них в БД. А клиент со временем не меняется.
-
> получаю Handle приложения
Как можно получить то чего не существует в природе ?
-
> Как можно получить то чего не существует в природе ?
Лучше бы по делу чего сказал, чем к словам придираться!
Пусть будет "Handle окна, в котором запущено приложение"
-
> Пусть будет "Handle окна, в котором запущено приложение" >
И это тоже не существует в природе.
-
> Что такое ISpecifyPropertyPage?
Справка не работает ? Это такой COM-интерфейс для встривания в GUI - например в панель управления в настройки мыши / клавиатуры пихаеться параметры от того же logitech - это стандартная модель. И кстати функциональность к интерфейсу ну никак не привязана.
Ты сейчас занимаешься полной бессмыслицей, ты где нибудь плагин в виде exe видел ?. Для таких дел существует COM/DCOM и дитя их ActiveX. DCOM кстати совершенно по барабану на какой машине он запущен. Да и хранить файлы в базе тоже не кайф.
> В итоге можно потихоньку создавать новые проги для решения > различных задач
Жаргоничик студенческий. В общем тебе нужно смотреть на COM/ActiveX или .Net сборки.
-
> Жаргоничик студенческий
Несколько обидная фраза - года уже не те. Года 3 назад разбирался с ActiveX и делал ActiveX Form, но очень хотелось бы, чтоб всё работало без дополнительных dll и ActiveX. Появилась в БД запись о новой программе -> при запуске клиента скачивается готовый exe-файл -> запускается и встраивается в клиента. Вся нагрузка на клиента - это предоставление списка доступных программ, их запуск/завершение и слежение за местоположением/размерами относительно клиента. Пример - на FreeBSD есть программа Contact. Она содержит в себе контакты персон, почту, календарь, задачи/проекты... Во время работы данной программы, если посмотреть список выполняемых процессов, то видно, что каждая - это отдельный процесс. Отсюда и возникла моя "бредовая" идея - как сделать программу масштабируемой. Т.е. сегодня я еще не знаю, какую задачу мне надо будет реализовать завтра, но условие, чтобы всё запускалось из одной программы уже поставлено.
-
Да запускай себе на здоровье что угодно где угодно !
Но причем здесь какое-то там "встраивание" ?
> Соответственно не работают ни какие ограничения (Constraints)
Ты ни шиша не понимаешь работы этого свойства. Вот с изучения оного и начни, прежде чем обижаться.
-
> Ты ни шиша не понимаешь работы этого свойства.
Спорить не буду. Даже спасибо скажу за внимание к моему вопросу. Обида - так, секундный эмоциональный порыв. Со словарным запасом у меня видимо беда. Технарь я до мозгов костей. С человеками трудно общаюсь.
У меня в принципе уже всё работает. Если есть ещё силы обсуждать - давай попробуем...
Все контролы приложения В расположены на одной панели. При получении некой строковой команды от прил.А данная панель меняет своё ParentWindow на Handle панели приложения А. Теперь визуально кажется, что программа одна. Это я и называю встраиванием (заголовок на TaskBar я прячу). Далее при изменении размеров панели прил.А по средствам передачи строковых команд меняет свое местоположение и размеры панель прил.В.
Теперь ставим панели прил.B constraints.MinWidth := 400; Когда я уменьшаю ширину прил.А уменьшается и прил.В, пока оно не станет = 400. Далее прил.В ужЕ Уже не станет, а прил.А об этом ни чего не знает. На этом месте я застопорился. Можно конечно далее перекидывать всякие команды между приложениями, но понимаю, что это всё криво и не правильно. Мне казалось, что если я делаю Panel1.ParentWindow := Panel2.Handle, то у Panel2 должно было увеличиться ControlCount, а на практике такого не случилось. Также мне кажется, что если бы мои ожидания оправдались, то работали бы и св-ва Align и constraints, да и вообще всё было бы "в шоколаде"...
-
> у Panel2 должно было увеличиться ControlCount, а на практике > такого не случилось
И не должно было. А с какого, спрашивается, перепугу оно должно было случиться ? Рассуждай вслух ..
-
> но очень хотелось бы, чтоб всё работало без дополнительных > dll и ActiveX. Появилась в БД запись о новой программе - >
епт типо exe уже чем-то круче? В обсчем сейчас ты знаимаешься ректальной реализацией давно уже реализованного стандартными методами. Если хочешь иметь дело именно с VCL реализацией то нужно детально изучать структуру bpl и детали сношения с памятью VCL.
> Года 3 назад разбирался с ActiveX и делал ActiveX Form,
Я в возрасте полгода в пелёнки писал. Вырос понял что это неудобно. Ты в принципе не понимаешь как всё работает. ActiveX Form, это то ещё недоразумение.
-
> tesseract © (28.10.08 16:36) [6] > > Ты сейчас занимаешься полной бессмыслицей, ты где нибудь > плагин в виде exe видел ?
Я видел. Даже сам был однажды инициатором такого подхода. Но я никогда не болел тем, чтобы окно "внешнего" exe-шника встраивать в окно вызывающей программы. Не. Я бы тоже советовал бы СОМ, но они не потянули бы. :(
P.S. Недавно один из них освоил основы ActiveX и теперь он хочет непременно получать для своей программы "драйверы устройств" по такой технологии.
-
> Я в возрасте полгода в пелёнки писал. Вырос понял что это > неудобно
Не понял, а научили. Иж, какие мы высокопарные. Из всего тобой сказанного только первый пост в тему. Остальное - попытки тупо всё обосрать. На других форумах люди делали также как я и свои задачи решали. Все посты в уважительной форме и по делу.
В общем - иди ты лесом...
-
> Остальное - попытки тупо всё обосрать
Надеяться на остро пока нет повода)
Тебя заточка волнует или ты все же готов к диалогу, ведущему к осознанию где и в чем твоя ошибка ?
Вопрос в [10] остался без ответа ..
-
> Все посты в уважительной форме и по делу.
> Остальное - попытки тупо всё обосрать.
Тебе сказали по делу - COM. Не мучайся с остальным, "по делу" это как ? Дают куски когда с WASM.ru ? Ты имей в виду в Висте такое может не заработать.
-
> Надеяться на остро пока нет повода) > > Тебя заточка волнует или ты все же готов к диалогу, ведущему > к осознанию где и в чем твоя ошибка ? >
Первое предложение не понятно из-за опечатки. К диалогу готов.
Хотелось бы от Вас услышать, как бы сделали Вы? Если нужно еще какие-то детали описать - спрашивайте.
В идеале это должно работать и в WinXP и в WinVista и на FreeBSD под Wine.
-
> boris3b (29.10.08 10:28) [16]
Нет, подожди .. Речт идет о логике или ее напрочь отсутствии. Вот ты заявил, что тебе "казалось". Я хочу проследить твою логику и предлагаю тебе вслух изложить основания для такого предположения..
-
> Вот ты заявил, что тебе "казалось". > Я хочу проследить твою логику и предлагаю тебе вслух изложить > основания для такого предположения..
Вот чую, что это ещё одна попытка посмеяться над моими плясками с бубном.
Казалось мне потому, что: 1. Мои знания как взаимодействует VCL с API - никакие. 2. Я использую родное свойство VCL-компонента - ParentWindow, а не API - SetParent. И если почитать Delphi Help на ParentWindow, то там есть следующее - "This allows references to the control by applications based on other applications."
-
> ещё одна попытка посмеяться
Что ж ты такой закомплексованный-то, а ?) > если почитать 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.
|