Форум: "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