Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

А как создать новую форму, чтобы она отобразилась в панели задач?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.015 c
7-47831
Yaro
2002-04-22 22:58
2002.07.15
Телефонный робот


14-47708
saurus
2002-06-18 16:10
2002.07.15
Боритесь с мусором в форуме!


3-47066
Hill
2002-06-19 14:39
2002.07.15
Столбец DBGrid a записать в StringList


3-47075
EugeneCher
2002-06-19 16:28
2002.07.15
IBQuery проблема с текстовыми вычисляемыми полями!


1-47247
Валет
2002-06-28 14:42
2002.07.15
Bmp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский