Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-82345
Edelweiss
2003-05-29 16:21
2003.09.25
Цвет точки. Как узнать?


14-82441
Ihor Osov'yak
2003-09-09 15:06
2003.09.25
аяяй..


1-82298
Pomashok
2003-09-14 17:32
2003.09.25
Перекодировка


1-82218
First_May
2003-09-15 16:07
2003.09.25
Свойство TComponent


1-82306
Regul
2003-09-11 21:04
2003.09.25
Microsoft Equation





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский