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

Вниз

Немодальные окна   Найти похожие ветки 

 
dima_matrix ©   (2003-09-10 19:38) [0]

Господа! Кто-нибудь пробовал в Делфи создавать немодальное окно без владельца и не функциями API? Понимаю, что изврат, но очень интересно можно ли это сделать возможностями Делфи без переделывания половины его исходников. Спасибо за понимание.


 
Романов Р.В. ©   (2003-09-10 21:40) [1]

TForm1.Create(nill)?


 
jack128 ©   (2003-09-10 22:48) [2]

procedure TCustomForm.CreateParams(var Params: TCreateParams);
var
Icons: TBorderIcons;
CreateStyle: TFormBorderStyle;
begin
inherited CreateParams(Params);
with Params do
begin
if (Parent = nil) and (ParentWindow = 0) then
begin
WndParent := Application.Handle;
Style := Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP);
end;


Так что переопределяй CreateParams


 
Германн ©   (2003-09-11 02:38) [3]

2 jack128 © (10.09.03 22:48) [2]
А я собс-но не очень понял, чем ответ "Романов Р.В. © (10.09.03 21:40) [1]" не подходит под сабж?
Согласен, что "родитель" весьма нужен, но про него не было ничего в сабже.
Более того, весьма часто используется конструкция типа:
with TForm1.Create(nil) do begin
...
...
Free;

Так что какой тут "изврат" (это к автору сабжа) я не понимаю.


 
dima_matrix ©   (2003-09-11 19:01) [4]

Отвечу вначале на топики господина Романова и господина Германна.
Так как показал господин Романов делать конечно можно, но тут появляется одна неприятная вещь - в случае отсутствия владельца (т.е. nil) при создании параметров происходит проверка на это дело и при отсутствии им назначется текущее приложение, что с успехом продемонстрировал господин jack128, за что ему отдельное спасибо. А по поводу перегрузки данного метода - это хорошая идея, я как-то ее пропустил, наверно вчера к вечеру мозг уже не соображал. Всем спасибо. Если кто-то не согласен с моими высказываниями готов поддержать дискусию.


 
dima_matrix ©   (2003-09-11 19:41) [5]

Все получилось как я и хотел! Для этого нужно перегрузить для формы, которая должна быть без родителя, метод CreateParams, в котором сначала вызвать аналогичный метод родительского класса (inherited CreateParams(Params)), а затем написать такую строчку Params.WndParent := 0; и все заработает. Спасибо всем за поддержку и отдельное большое спасибо 2 jack128!


 
Юрий Зотов ©   (2003-09-11 19:48) [6]

> dima_matrix

> в случае отсутствия владельца (т.е. nil) при создании
> параметров происходит проверка на это дело и при отсутствии им
> назначется текущее приложение, что с успехом продемонстрировал
> господин jack128

И где же Вы нашли эту демонстрацию? Ткните пальцем, плз.

Вы ведь спрашивали о ВЛАДЕЛЬЦЕ, не так ли? Тогда при чем тут родительское окно?


 
dima_matrix ©   (2003-09-11 20:31) [7]

Возможно я не правильно сформулировал свой вопрос, хотя честно говоря чем отличается владелец окна от родителя?


 
Андрей Сенченко ©   (2003-09-11 20:38) [8]

А что ? Владельца нельзя переназначит в рантайме ?

С уважением, ваш ламер.


 
dima_matrix ©   (2003-09-11 20:58) [9]

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


 
Андрей Сенченко ©   (2003-09-11 21:00) [10]

хотя честно говоря чем отличается владелец окна от родителя?

Вопрос относился к этой фразе


 
dima_matrix ©   (2003-09-11 21:22) [11]

Что-то, честно говоря, я опять не понял сути вопроса. Эта фраза об владельце относится к замечанию господина Зотова, как мне показалось, о различии владельца окна от родителя окна. Вот я у него и спросил в чем на его взгляд различие. А владельца переназначить в рантайме действительно можно, с этим я согласен.


 
Андрей Сенченко ©   (2003-09-11 21:59) [12]

владельца то можно ... но вот переназначить родителя - это уже как-то не совсем ... ИМХО, да ладно - это уже не из области решения поставленной задачи.


 
Ihor Osov'yak ©   (2003-09-12 00:06) [13]

2 [7] dima_matrix © (11.09.03 20:31)

> отличается владелец окна от родителя?

Parent - обьект, окно которого содержит наше окно, как дочернее. Parent - всегда наследник от TWinControl.

Owner - ответсвенный за уничтожение.. Наследник от TComponent..

Например, на форме панель, на панели - button1: TButton.. Так вот, для button1 парентом будет панель, owner - форма..


 
Германн ©   (2003-09-12 03:44) [14]

2 dima_matrix © (11.09.03 20:31) [7]
>Возможно я не правильно сформулировал свой вопрос, хотя честно >говоря чем отличается владелец окна от родителя?

Именно неправильно сформулировал. А владелец окна не имеет ничего общего с его родителем. (это в теории).

Родитель(Parent) - есть понятие самой ОС(Windows) и отвечает за отображение дочернего(Child) окна и за уничтожение его.(это я к Игорю). Но, в частности, в Дэльфи есть невизуальные компоненты, которые естественно не могут иметь родителя и не могут являться детьми. Посему нужно было придумать что-то, что могло бы взять ответственность за уничтожение на себя. И тут появился владелец(Owner).


 
Ihor Osov'yak ©   (2003-09-12 10:11) [15]

2 [14] Германн © (12.09.03 03:44)

> Родитель(Parent) - есть понятие самой ОС(Windows)
Это если говорить в контексте понятий окон ОС(Windows). Если говорить в контексте VCL - по см. (12.09.03 00:06)

И еще:
>> Owner - ответсвенный за уничтожение.. Наследник от TComponent..

ответсвенный за уничтожение экземпляра класса. Экземпляр класса и окно - не одно и то же :-)

Зы. Сделайте маленький тест:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin //
ShowMessage("Parent = " + Button1.Parent.ClassName);
ShowMessage("Owner = " + Button1.Owner.ClassName);
end;

end.

object Form1: TForm1
Left = 251
Top = 152
Width = 502
Height = 252
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 96
Top = 88
Width = 185
Height = 41
Caption = "Panel1"
TabOrder = 0
object Button1: TButton
Left = 56
Top = 8
Width = 75
Height = 25
Caption = "Button1"
TabOrder = 0
OnClick = Button1Click
end
end
end


 
dima_matrix ©   (2003-09-12 18:48) [16]

Господа, попробую отсветить сразу всем. Видимо я действительно не совсем корректно сформулировал свой вопрос, поскольку я действительно подразумевал окно в терминах ОС, а не Делфи (тогда бы я использовал термин форма, компонент и т.п.) - каюсь. А в терминах ОС владелец окна и родитель окна - это одно и то же (можно посмотреть в MSDN по функции CreateWindow). В общем то такая ситуация приключилась скорее всего из-за того, что основной средой проектирования для меня является все таки VisualC, вот я с привычными понятиями и полез... Но все равно я рад, что удалось пообщаться со столькими умными людьми. С удовольствием продолжу обсуждение данной темы, если кому-то интересно.



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

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

Наверх




Память: 0.51 MB
Время: 0.017 c
4-82562
stkatch
2003-07-22 11:04
2003.09.25
Вызов MessageBox из сервиса (службы)


1-82192
BAYES
2003-09-12 13:51
2003.09.25
MDI


3-82144
ss300
2003-09-04 09:34
2003.09.25
фильтр


1-82214
Senator
2003-09-11 14:47
2003.09.25
Отсоединение Attache файла из Outlook a


3-82102
pkert
2003-09-04 18:41
2003.09.25
View в Interbase6.0