Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизНемодальные окна Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.016 c