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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.044 c
1-1079950125
Эдуард
2004-03-22 13:08
2004.04.11
Как в disign-time е отловить факт изменения размеров формы?


9-1065029378
HREF
2003-10-01 21:29
2004.04.11
<DelphiX>


14-1078984348
LiLa Ananda
2004-03-11 08:52
2004.04.11
Кто был на старом Адметасе.......


6-1075633462
димка
2004-02-01 14:04
2004.04.11
Как определить номер подключения


14-1079378014
ИМХО
2004-03-15 22:13
2004.04.11
Вот, только что пришло...





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