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

Вниз

Диалог внутри формы: как сделать лучше?   Найти похожие ветки 

 
GrayFace ©   (2004-01-27 15:25) [0]

Мне приходится использовать Timer. Иначе вылетает по ошибке. Как можно без него? Вот часть кода:

procedure TForm2.FontDialogShow(Sender: TObject);
begin
 Form2.Show;
 timer2.Enabled:=true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if isWindow(FontDialog.Handle) then SendMessage(FontDialog.Handle,wm_close,0,0);
end;

procedure TForm2.FontDialogClose(Sender: TObject);
begin
 Form2.Close;
end;

procedure TForm2.Timer2Timer(Sender: TObject);
var x,y:LongWord; p:TPoint; r,r1:TRect;
begin
 Timer2.Enabled:=false;
 windows.GetWindowRect(FontDialog.Handle,r1);
 if not IsWindow(FontDialog.Handle) then exit;
 windows.GetClientRect(FontDialog.Handle,r);
 p:=ClientToScreen(MakePoint(0,0));
 x:=0-p.X+Left;
 y:=0-p.Y+Top;
 Constraints.MaxWidth:=r1.Right-r1.Left;
 Constraints.MinWidth:=r1.Right-r1.Left;
 SetWindowPos(FontDialog.Handle,HWND_BOTTOM,x,y,0,0,SWP_NOSIZE or SWP_NOSENDCHANGING or SWP_NOACTIVATE);
end;

procedure TForm2.FormShow(Sender: TObject);
begin
 if not isWindow(FontDialog.Handle) then exit;
 windows.SetParent(FontDialog.Handle,Panel1.Handle);
end;


 
YuRock ©   (2004-01-27 17:32) [1]

Может я что-то не так понял, но почему бы не создавать диалог (на сколько я понял - Form2) так:

 Form2 := TForm2.CreateParented(Form1.Handle);
 Form1.InsertControl(Form2);

И все?


 
GrayFace ©   (2004-01-28 15:40) [2]

Нет. Во-первых CreateParented, как я помню, глючит.
Вовторых, все по-другому: Стандартный FontDialog внутри Form2


 
YuRock ©   (2004-01-28 16:25) [3]

1. Почему Вы решили, что CreateParented глючит? Я не замечал никогда...

2. Для этого используется API"шная функция SetParent


 
VMcL ©   (2004-01-28 16:45) [4]

>>YuRock

Ничего ты не понимаешь. Человек написал "глючит" - значит глючит. Borland специально глюкавые методы у своих классов пишет.


 
SPeller ©   (2004-01-28 17:02) [5]


> Borland специально глюкавые методы у своих классов пишет.

:-))) И в каждый ЕХЕ-шник трояна засовывает. Назло пользующимся :-))


 
YuRock ©   (2004-01-28 17:09) [6]

Кстати, Borland иногда глюкавые (я бы сказал - корявые) методы делает. Причем действительно "специально". Но это обычно описывается в help"е.

О глюкавости же CreateParented в help"е ничего не сказано (да и при проверке работает, пользовался 100 раз). Да и чему там глючить? "FParentWindow := ParentWindow"? Никогда не видел "глюков" при присвоении числовых (тем более - однотипных) переменных...


 
Digitman ©   (2004-01-28 17:13) [7]


> Кстати, Borland иногда глюкавые (я бы сказал - корявые)
> методы делает


чрезвычайно смелое заявление !


 
YuRock ©   (2004-01-28 17:17) [8]

> чрезвычайно смелое заявление

А чего (кого) бояться то? Побъет меня чтоль, этот Borland ?


 
Игорь Шевченко ©   (2004-01-23 13:14) [9]


> Кстати, Borland иногда глюкавые (я бы сказал - корявые)
> методы делает. Причем действительно "специально". Но это
> обычно описывается в help"е.


Примерчики в студию.


 
YuRock ©   (2004-01-28 19:23) [10]

> Игорь Шевченко
> Digitman

А вам, уважаемые мастера, все что написали программисты Борланда кажется идеальным? Что-то не верится, извините, уж...

На счет примеров? Пожалуйста! Только сразу предупреждаю, корявость нижеприведенных примеров - мое субъективное мнение об удобстве и красоте:

1. Событие OnActivate (у форм) - не работает для главной формы. А жаль - ведь WM_ACTIVATE приходит когда надо.

2. WndProc у контролов. Почему это процедура??? Я же не могу ничего вернуть! Нет, я конечно могу через API перекрыть оконную процедуру, но перегрузка метода - гораздо красивее, но, к сожалению, не всегда помогает...

3. Графические объекты (я имею в виду TLabel, TSpeedButton...). Это во-первых тормозит перерисовку окна, во-вторых напрочь убивает возможность поиска этих "на вид окон" из других программ (я имею в виду хендлов, которых нет).

...

Есть еще масса неудобств в BDE, VCL ... (по крайней мере - для меня), всех привести не смогу.

Тем не менее хочу в очередной раз заметить: Структуры оконных классов лучше VCL я еще не видел - потому и пользуюсь.


 
Polevi ©   (2004-01-28 20:21) [11]

>WndProc у контролов. Почему это процедура??? Я же не могу ничего вернуть!
а ты Message.Result:=1234 не пробовал ?
так что руки выпрями


 
YuRock ©   (2004-01-28 20:45) [12]

> Polevi ©   (28.01.04 20:21) [11]
> так что руки выпрями

Ну, ладно обзываться. Не замечал я такого раньше, и вот почему: я думал, что TMessage - это те же 4 параметра (как в обычной оконной процедуре), ну, без хендла. А там оказывает еще и Result... Ну не очевидно это, потому и не заметил...


 
VMcL ©   (2004-01-29 09:54) [13]

>>YuRock ©  (28.01.04 20:45) [12]
>Ну не очевидно это, потому и не заметил...

Если ничто не помогает, прочтите наконец инструкцию :)


 
VMcL ©   (2004-01-29 09:59) [14]

>>YuRock ©  (28.01.04 19:23) [10]
>Графические объекты (я имею в виду TLabel, TSpeedButton...).
>Это во-первых тормозит перерисовку окна


Ну если насовать штук 200, то может и тормозят. Это раз. А во-вторых, TStaticText и TBitBtn никто не отменял.

>во-вторых напрочь убивает возможность поиска этих
>"на вид окон" из других программ


Это ужасно. Вот пишу я программу и только и думаю, а вдруг кто-то захочет найти мой контрол по HWND.
Если захочу сделать взаимодействие с др. программами, предусмторю специальные способы.


 
YuRock ©   (2004-01-29 10:20) [15]

> VMcL ©   (29.01.04 09:54) [13]
> Если ничто не помогает, прочтите наконец инструкцию

Ну хватит умничать, форумы не для этого


 
YuRock ©   (2004-01-29 10:20) [16]

Удалено модератором
Примечание: Дубль


 
YuRock ©   (2004-01-29 10:29) [17]

Да, кстати, мастера, а как вы относитесь к тому, что метод SetFocus (почти всегда) вызывает exception, если окно "disabled or invisible"? Постоянно приходится пользоваться Windows.SetFocus! Это Вам доставляет удовольствие, а, VMcL?


 
Плохиш   (2004-01-29 10:31) [18]


> YuRock ©   (29.01.04 10:29) [17]
> Да, кстати, мастера, а как вы относитесь к тому, что метод
> SetFocus (почти всегда) вызывает exception, если окно "disabled
> or invisible"?

И правильно делает


 
YuRock ©   (2004-01-29 10:50) [19]

> И правильно делает

Да... пользователю очень нужно знать об этом...


 
Плохиш   (2004-01-29 10:56) [20]


> YuRock ©   (29.01.04 10:50) [19]
> > И правильно делает
> Да... пользователю очень нужно знать об этом...

А при чём здесь пользователь? Система говорит об этом программисту, который зачем-то пытается активизировать запрещённые компоненты.


 
YuRock ©   (2004-01-29 11:11) [21]

Понятно... Я раньше думал, что exception"ы иногда бывают и на машинах пользователей, и они емы не нужны... Ну, коль это для программиста, то эти ситуации надо в документациях описывать, понятно...
Т.е. что если непонятное окошко появилось на экране - то это не для Вас, заплативших деньги за программу, а для "программиста, который зачем-то пытается активизировать запрещённые компоненты"...
Что ж, используйте такие методы дальше...


 
Плохиш   (2004-01-29 11:24) [22]


> YuRock ©   (29.01.04 11:11) [21]
> Понятно

Ничего тебе не понятно

Вы что прилагаете к программам документацию по делфи?
И назовите мне хоть один способ вызова пользователем метода SetFocus.


 
YuRock ©   (2004-01-29 11:47) [23]

>  назовите мне хоть один способ вызова пользователем метода SetFocus

Выполнение (части) программы, в котором есть вызов этого метода. Слава богу, что в моих программах таких "частей" немного...


 
Anatoly Podgoretsky ©   (2004-01-29 11:53) [24]

YuRock ©   (28.01.04 17:17) [8]
Почему именно Борланд, что больше никого нет.

Очень ты Борландом не доволен, да плюнь ты на них.
Ежики плакали, кололись, но продолжади есть кактус.


 
YuRock ©   (2004-01-29 11:57) [25]

> Anatoly Podgoretsky ©   (29.01.04 11:53) [24]
> Очень ты Борландом не доволен

Я еще раз обращаю внимание всех на то, что я ДОВОЛЕН Борландом (см. самый конец [10]).

Но это не означает, что некоторый код Борланда не поддается критике.


 
Anatoly Podgoretsky ©   (2004-01-29 11:59) [26]

YuRock ©   (29.01.04 10:50) [19]
Да нужно, иначе как он узнает об ошибке программиста, если тот ее замаскирует.


 
YuRock ©   (2004-01-29 12:06) [27]

> Anatoly Podgoretsky ©   (29.01.04 11:59) [26]

1. (В общем случае) Да, пользователь должен знать об ошибке программиста (если это ошибка программиста). По-этому я стараюсь свести количество ошибок к минимуму (в том числе - количество exception"ов, если, конечно, я их создал не специально).

2. (к конкретному примеру) В 99.99% случаев, если я хочу поставить фокус на невидимое или disabled окно, и это, естественно, не получается, то мне нужно не трогать фокус, т.е. вообще ничего не делать. За что я и ценю Windows.SetFocus (а используй я TWinControl.SetFocus - мне пришлось бы либо делать проверку if Visible and Enabled или вообще исключение обрабатывать - разве не идиотизм?)


 
GrayFace ©   (2004-01-30 17:46) [28]

CreateParanted, возможно, не глючит. Кстати, у кнопки есть CreateParanted. Кто-нибудь знает, как им пользоваться? Кнопка ведь все равно не показывается, пока не поставишь Button1.Parent.

Все-таки, хоть это уже и не важно в данный момент, но я повторяю: Я использую TFontDialog и SetParentю его во 2-ю форму. При Execute он показывается модально. Это я обхожу это, как написал в начале, но это криво. Как сделать нормально?


 
Игорь Шевченко ©   (2004-01-30 18:27) [29]

YuRock ©   (28.01.04 19:23)

Не могу согласиться с тем, что приведенные примеры - это корявость программистов Borland.

Я бы посоветовал изучить раздел Tips and Tricks на www.torry.net, там много полезных советов.

Если не ошибаюсь, в свое время на delphipus.da.ru была статья с более убедительными примерами не совсем корректного поведения классов VCL и пути их обхода. Но их было приведено немного, и в повседневной практике они не часто встречаются.


 
Игорь Шевченко ©   (2004-01-30 18:30) [30]

YuRock ©   (29.01.04 10:29)


> а как вы относитесь к тому, что метод SetFocus (почти всегда)
> вызывает exception, если окно "disabled or invisible"? Постоянно
> приходится пользоваться Windows.SetFocus!


if WinControl.CanFocus then
 WinControl.SetFocus


 
Grinder ©   (2004-01-30 19:38) [31]

fsStayOnTop для неглавной формы - это ужас. Не работает. Только для текущего проекта и всё.


 
YuRock ©   (2004-01-30 21:31) [32]

> Игорь Шевченко

Я же предупреждал в [10] - это мое личное представление об удобстве и красоте


 
YuRock ©   (2004-01-30 22:25) [33]

> GrayFace

Советую вызвать этот диалог через API (см. исходники TFontDialog.Execute) - тогда сможете сделать все, что угодно.

Но если уж хотите использовать готовое, то вот:


unit Unit1;

interface

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

type

 TForm1 = class(TForm)
   Button1: TButton;
   FontDialog1: TFontDialog;
   procedure Button1Click(Sender: TObject);
   procedure FontDialog1Show(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 FontDialog1.OnShow := FontDialog1Show;
 if FontDialog1.Execute then begin
   // Здесь делайте все, что хотите...
 end;
end;

procedure TForm1.FontDialog1Show(Sender: TObject);
var
 hHandle: HWND;
begin
 // Установка родителя диалога
 Windows.SetParent(FontDialog1.Handle, Handle);

 // Убираем Caption
 SetWindowLong(FontDialog1.Handle, GWL_STYLE, GetWindowLong(FontDialog1.Handle, GWL_STYLE) and not WS_CAPTION);
 SetWindowLong(FontDialog1.Handle, GWL_EXSTYLE, GetWindowLong(FontDialog1.Handle, GWL_EXSTYLE) and not WS_EX_DLGMODALFRAME);

 // Двигаем как надо
 MoveWindow(FontDialog1.Handle, 0, 0, ClientWidth, ClientHeight, True);

 // "Обманываем" модальность
 hHandle := Handle;
 repeat
   EnableWindow(hHandle, True);
   hHandle := GetParent(hHandle);
 until hHandle = 0;
end;

end.


Кстати, я уже говорил об этом в [3]!



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

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

Наверх




Память: 0.56 MB
Время: 0.041 c
9-1065886084
Beaver
2003-10-11 19:28
2004.04.11
Как поставить DelphiX для 6 delphi на Delphi 7?


7-1075378020
User3000
2004-01-29 15:07
2004.04.11
Как получить список всех процессов в win9x/Me


8-1076409176
_none_
2004-02-10 13:32
2004.04.11
GDI+ и win2003server


1-1082447654
Top100
2004-04-20 11:54
2004.04.11
Уничтожение формы


14-1079283485
Undert
2004-03-14 19:58
2004.04.11
Кинте плиз....