Текущий архив: 2002.07.15;
Скачать: CL | DM;
ВнизА как создать новую форму, чтобы она отобразилась в панели задач? Найти похожие ветки
← →
nester (2002-06-30 18:39) [0]А как создать новую форму, чтобы она отобразилась в панели задач, как это делает к примеру Internet Explorer.
Если запускать новый экземпляр приложения, то покажите пожалуйста как добраться до компонентов в нем.
← →
Юрий Зотов (2002-06-30 19:30) [1]Создаем новый проект с двумя формами. На первую форму кидаем кнопку, а вторую форму исключаем из списка автосоздаваемых. Далее привожу полный код обоих модулей.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
TForm2.Create(Application).Show
end;
end.
// =============================================
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm2 = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
implementation
{$R *.DFM}
{ TForm2 }
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW
end;
end.
Вот и все. Теперь сколько раз мы нажмем на кнопку - столько экземпляров TForm2 будет создано и показано. И каждая из них отобразится на панели задач. И все компоненты на всех формах будут доступны, как обычно.
← →
nester (2002-06-30 21:22) [2]Согласен, попробовал, работает зашибись, но одно "НО". Если я закрываю основную форму, то закрываются и все созданные. А мне нежно чтобы они оставались. Как с этим бороться?
← →
Юрий Зотов (2002-06-30 22:00) [3]Если Вы закрываете основную форму, то Вы завершаете всю программу. Естественно, все ее формы умирают. И бороться с этим не надо, потому что это правильно.
Похоже, Вам нужно другое решение, но для этого надо представлять себе саму исходную задачу.
← →
SPeller (2002-06-30 22:03) [4]Выход прост - сделать какую-нибудь пустую форму и поставить её главной, а из неё уже показывать и скрывать остальные.
← →
Юрий Зотов (2002-06-30 22:09) [5]> SPeller © (30.06.02 22:03)
Боюсь, что выход не так уж и прост. Потому что остается еще системное меню на кнопке Application на панели задач. Можно, конечно, и его искорежить, но не факт, что автору нужно именно это. Все же надо представлять себе саму задачу, иначе дальнейший разговор теряет смысл.
← →
SPeller (2002-06-30 22:19) [6]2 Юрий Зотов © (30.06.02 22:09)
Ну тогда вообще на API голый придётся переходить чтобы всё идеально гладко сделать. А так да, пока автор не скажет чего он хочет, дальнейшее обсуждение бесполезно.
← →
nester (2002-06-30 22:21) [7]Да задача простейшая, сделать примерно так же как делает Internet Explorer по нажатию Ctrl-N То есть открыть еще один экземпляр основного окна, так чтобы он отобразился в панели задач, и чтобы при закрытии "первого" окна не закрывались остальные. То есть мне нужно разорвать связь между Application и каждым экземпляром окна, чтобы Application.Terminate на них никак не влияло.
Другое решени у меня было просто запускать новый экземпляр программы, но после этого мне нужно во вновь запущенной программе в одном из компонентов на форме помянять пару свойств, а также прочесть пару свойств, как тогда такое сделать, если нельзя сделать первое?
← →
SPeller (2002-06-30 22:24) [8]Ну так эксплорер запускает ещё один экземпляр своего приложения. Окна тут ни при чём (всмысле те, о которых мы тут)
← →
Юрий Зотов (2002-06-30 22:29) [9]IE (и Word 2000) так и делают - запускают новый экземпляр программы. И Вам нужно делать то же самое. А чтобы читать/писать свойства, наладьте взаимодействие между разными экземплярами через обмен сообщениями WM_USER+<что-то>.
← →
Юрий Зотов (2002-06-30 22:31) [10]Добавление.
Если передаваемые данные большие, используйте WM_COPYDATA или File Mapping.
← →
nester (2002-06-30 22:31) [11]Ну а так ктонить-чтонить подскажет, как открыть тогда новый экземпляр своего приложения(точнее это я и сам могу) и как добраться до компонент на основной форме нового экземпляра приложения.
Это конечно, если нельзя оторвать формы от Application
← →
nester (2002-06-30 22:34) [12]Нет, это не подойдет, мне нужно получить IDispatch Одного контрола в новом экземпляре приложения. Конечно можно его по WM_COPYDATA передать, но мне кажется это слишком по-корявому,
← →
Юрий Зотов (2002-06-30 22:40) [13]А не по-корявому это называется, кажется, COM.
← →
jedi (2002-06-30 22:43) [14]ya dumaiu v vashem slu4ae immet smisl sdelat" ato prilojenie cac COM server. Togda vi smojete sozdavat" skol"ko hotite exemplearov,vizvat" ih metodi meneat" svoistva .
← →
nester (2002-06-30 22:45) [15]А пример с Com можно найти?
begin
CreateProcess(...); //- запустил я новый экземпляр приложения
//А как дальше мне получить IDispatch от контрола с именем к примеру "MyControl"?
end;
← →
Юрий Зотов (2002-06-30 23:05) [16]Это уже целая большая тема и совсем не так делается.
Рассказывать здесь очень много, поэтому ничего, кроме книжек посоветовать не могу. А в книжках есть во многих. Например, Н. Елманова и С. Трепалин.
← →
nester (2002-07-02 01:16) [17]У меня у самого пришла новая идея.
Можно сделать так:
var
App: TApplication;
NewForm: TFormMain;
begin
App:= TApplication.Create(nil);
App.Initialize;
App.CreateForm(TFormMain, NewForm);
//Тут я делаю через NewForm что хочу.
//Затем же нужно сделать App.Run, но это приводит к зависанию программы(точнее не зависанию, а не выходу из текущей процедуры, до App.Terminate).
Я пробовал SendMessage(А ну ка запустись на NewForm.Handle), а в процедуре приема ставил Run, но SendMessage собака не возвращается пока не произойдет выход из процедуры-приемника, то есть процедура опять подвисает. PostMessage почемуто не срабатывает.
Что делать, может у кого есть на этот счет идея?
← →
Юрий Зотов (2002-07-02 01:35) [18]Второй экземпляр App и все связанные с ним формы нужно создавать в отдельном потоке. Потому что вызов Run запускает цикл выборки сообщений, а чтобы два цикла одновременно работали в одном потоке - это никак не получится. Да и очереди разносить нужно.
PostMessage на самом деле срабатывает, но она просто помещает сообщение в очередь, откуда его никто не выбирает (Вы же ставите Run в цепочке обработки сообщения, а это самое сообщение без этого самого Run никогда не придет, так и будет в очереди висеть - получается замкнутый круг).
Вообще, хотите - верьте, хотите - нет, но это явно порочное решение, намучаетесь Вы с ним выше крыши, а надежности все равно не будет (ну не заточена VCL под такие фокусы, и все тут). Используйте COM - в итоге выйдет проще, быстрее и надежнее.
Страницы: 1 вся ветка
Текущий архив: 2002.07.15;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.01 c