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

Вниз

Дочерние окна при сворачивании главного   Найти похожие ветки 

 
RDS ©   (2006-07-05 16:54) [0]

Программа создает массив дочерних окон. Как можно следать, чтобы при сворачивании главного окна программы, дочерние окна оставались на экране.


 
Юрий Зотов ©   (2006-07-06 10:51) [1]

Программа MDI?


 
RDS ©   (2006-07-06 10:55) [2]

Главное окно программы имеет FormStyle=fsNormal. Это имелось в виду?


 
RDS ©   (2006-07-06 10:59) [3]

Поставил в главном окне FormStyle=fsMDIForm. Результат тот же самый. При сворачивании главного окна сворачиваются и дочерние.


 
Юрий Зотов ©   (2006-07-06 11:14) [4]

Верните FormStyle=fsNormal и поясните - если программа не MDI, то что Вы имеете в виду под словами "дочерние окна"? ParentWindow? Что-то еще?


 
RDS ©   (2006-07-06 11:24) [5]

Под дочерними окнами я понимаю окна, создаваемые главным окном программы. Возможно формулировка не точная, но как это назвать по другому я не знаю.


 
Jeer ©   (2006-07-06 11:38) [6]

Такова функциональность взаимодействия главного и дочерних окон неважно какой (MDI или SDI) режим выбран.


 
Юрий Зотов ©   (2006-07-06 11:52) [7]

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
 inherited;
 Params.WndParent := HWND_DESKTOP
end;


 
Jeer ©   (2006-07-06 11:54) [8]

А в принципе - можно.
Отлавливать минимизацию главного и на нее ShowWindow(hChild, SW_SHOW)


 
StriderMan ©   (2006-07-06 12:04) [9]


> и на нее ShowWindow(hChild, SW_SHOW)

сомнительно, что это будет работать. скорее всего главная форма тоже подымется


 
Jeer ©   (2006-07-06 12:05) [10]

работает


 
Eraser ©   (2006-07-06 13:34) [11]

> [7] Юрий Зотов ©   (06.07.06 11:52)

только здесь появится один неприятный глюк, при появлении любого хинта, главная форма приложения будет "выскакивать" на передний план.
как с этим бороться - не знаю, какое-то решение видел в группах google, но оно тоже было глючным. Если знаете правильное решение - дайте знать пожалуйста.


 
Юрий Зотов ©   (2006-07-06 15:35) [12]

> Eraser ©   (06.07.06 13:34) [11]

Проверил. Ничего никуда не выскакивает (XP, D6).


 
Eraser ©   (2006-07-06 15:41) [13]

> [12] Юрий Зотов ©   (06.07.06 15:35)

ну как же не выскакивает?

Пример на Д2006, на Д7 тоже самое.
Проект из двух форм. На первой форме только 1 кнопка, на второй установлено свойство ShowHint = true и св-во Hint = "test"
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 TForm2.Create(Application).Show;
end;

end.

при появлении хинта на 2 форме - 1 форма выскакивает на foreground.


 
Юрий Зотов ©   (2006-07-06 15:57) [14]

> Eraser ©   (06.07.06 15:41) [13]

Проверил еще раз. Все делал ТОЧНО как Вы сказали. Не выскакивает.


 
Eraser ©   (2006-07-06 15:59) [15]

> [14] Юрий Зотов ©   (06.07.06 15:57)

я забыл код второго модуля привести
unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
 protected
   procedure CreateParams(var Params: TCreateParams); override;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WndParent := HWND_DESKTOP;
end;

end.


 
Eraser ©   (2006-07-06 15:59) [16]

просьба к форумчанам, кто читает эту ветку, если не лень - протестируйте данный код, пожалуйста.


 
Eraser ©   (2006-07-06 16:05) [17]

да! вот ещё одна особенность.
Создаю вторую форму, навожу на неё указатель мыши - появляется хинт. Все нормально, ничего никуда не прыгает, а вот при всех последующих появлениях хинта наблюдается указанный выше эффект.


 
Юрий Зотов ©   (2006-07-06 16:15) [18]

> Eraser ©   (06.07.06 15:59) [15]

> код второго модуля
Он уменя точно такой же, только еще caFree в OnClose (и BorderStyle=bsToolWindow, чтоб в панели задач не висела).

> при всех последующих появлениях хинта наблюдается
Ну не наблюдается у меня, ни при 1-м, ни при 21-м, ну что я могу сделать?.


 
Германн ©   (2006-07-06 16:16) [19]

D6, XP
Не выскакивает никогда. :-(


 
Eraser ©   (2006-07-06 16:17) [20]

> [18] Юрий Зотов ©   (06.07.06 16:15)


> и BorderStyle=bsToolWindow, чтоб в панели задач не висела

возможно в этом проблема, дело в том, что у меня была (и есть) необходимость как раз отображать кнопку на панели задач..


 
Eraser ©   (2006-07-06 16:18) [21]

> [19] Германн ©   (06.07.06 16:16)
> D6, XP

6, к сожалению, не установлена, вот бы на 7 и выше кто-нибудь протестил.


 
Юрий Зотов ©   (2006-07-06 16:20) [22]

Поставил bsSizeable - не выскакивает.


 
Eraser ©   (2006-07-06 16:34) [23]

чтобы мои заявления не звучали голословно, вот обсуждение схожей проблемы
http://groups.google.com/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/f5cd2161d871edc9/d7e78910e68dfccf#d7e78910e68dfccf

Hi,
I had been overriding the create params method on on of my forms so it would
show up in the task bar and be parented to the desktop,(I did this so I
could open this particular form from a tray icon) this worked great in
Delphi 6,  a week ago I compiled it in D7 and the form that was parented to
the desktop started to have problems with it"s tool bar hints, basicly if
you put the cursor over a tool bar button the hint fires and then brings the
main form to the top.
...


 
Юрий Зотов ©   (2006-07-06 16:54) [24]

> Eraser ©   (06.07.06 16:34) [23]

Дома как раз D7, вечером попробую, отпишусь.


 
Eraser ©   (2006-07-06 17:04) [25]

> [24] Юрий Зотов ©   (06.07.06 16:54)

вроде бы проблему решил с помощю рекомендаций в
http://groups.google.com/group/borland.public.delphi.language.delphi.general/browse_thread/thread/788d4f62abeb33a2/99f6a238d3624fbb?hl=en
но ещё как следует не тестировал, скорее всего будут недочеты.

следует создать примерно такой модуль и присоединить его к проекту
unit AledensoftHintWindow;

interface

uses
 Windows, Controls, Messages, Forms;

type
 TAledensoftHintWindow = class(THintWindow)
 private
   FActivating: Boolean;
   FLastActive: Cardinal;
   procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
 public
   procedure ActivateHint(Rect: TRect; const AHint: String); override;
 end;

implementation

{ TMyHintwindow }

procedure TAledensoftHintWindow.ActivateHint(Rect: TRect; const AHint: String);
type
 TAnimationStyle = (atSlideNeg, atSlidePos, atBlend);
const
 AnimationStyle: array[TAnimationStyle] of Integer = (AW_VER_NEGATIVE,
   AW_VER_POSITIVE, AW_BLEND);
var
 Animate: BOOL;
 Style: TAnimationStyle;
begin
 FActivating := True;
 try
   Caption := AHint;
   Inc(Rect.Bottom, 4);
   UpdateBoundsRect(Rect);
   if Rect.Top + Height > Screen.DesktopHeight then
     Rect.Top := Screen.DesktopHeight - Height;
   if Rect.Left + Width > Screen.DesktopWidth then
     Rect.Left := Screen.DesktopWidth - Width;
   if Rect.Left < Screen.DesktopLeft then Rect.Left := Screen.DesktopLeft;
   if Rect.Bottom < Screen.DesktopTop then Rect.Bottom := Screen.DesktopTop;
   SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
     SWP_NOACTIVATE);
   if (GetTickCount - FLastActive > 250) and (Length(AHint) < 100) and
      Assigned(AnimateWindowProc) then
   begin
     SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, @Animate, 0);
     if Animate then
     begin
       SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, @Animate, 0);
       if Animate then
         Style := atBlend
       else
         // Begin changes.
         if Mouse.CursorPos.Y > Rect.Top then
           Style := atSlideNeg
         // End changes.
         else
           Style := atSlidePos;
       AnimateWindowProc(Handle, 100, AnimationStyle[Style] or AW_SLIDE);
     end;
   end;
   // Begin changes.
   if Assigned(Screen.Activeform) then
     ParentWindow := Screen.Activeform.Handle
   else
     ParentWindow := Application.Handle;
   // End changes.
   ShowWindow(Handle, SW_SHOWNOACTIVATE);
   Invalidate;
 finally
   FLastActive := GetTickCount;
   FActivating := False;
 end;
end;

procedure TAledensoftHintWindow.CMTextChanged(var Message: TMessage);
begin
 if not FActivating then
   inherited;
end;

initialization
 HintWindowClass := TAledensoftHintWindow;
 
end.


 
Eraser ©   (2006-07-06 17:05) [26]

> Дома как раз D7, вечером попробую, отпишусь.

надеюсь найдете более красивое решение.


 
Eraser ©   (2006-07-06 22:01) [27]

преведенный мной в [25] вариант, к сожалению работает не стабильно, как и ожидалось.

вот более стабильный вариант, но 100% не гарантирую.

1. в dpr фал добавляем
 SetWindowLong(Application.Handle, GWL_EXSTYLE,
   GetWindowLong(Application.Handle, GWL_EXSTYLE) or
   WS_EX_TOOLWINDOW);

тем самамым скрывая кнопку application из таск-бара.
2. в главной форме приложения добавляем
procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle :=  Params.ExStyle or WS_EX_APPWINDOW;
end;

этот код добавляет кнопку формы на панель задач.
а так же
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TfmMain.WMSysCommand(var Message: TWMSysCommand);
begin
 if (Message.CmdType and $FFF0 = SC_MINIMIZE) and
   (Application.MainForm = Self) then
 begin
   if not IsIconic ( Handle) then
   begin
     Application.NormalizeTopMosts;
     SetActiveWindow(Handle);
     if (Application.MainForm <> nil) and (Application.ShowMainForm
       or Application.MainForm.Visible) and IsWindowEnabled( Handle) then
       DefWindowProc( Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
   end;
 end
 else
   if (Message.CmdType and $FFF0 <> SC_MOVE) or (csDesigning in
     ComponentState) or (Align = alNone) or (WindowState = wsMinimized) then
     inherited;
 if ((Message.CmdType and $FFF0 = SC_MINIMIZE) or
   (Message.CmdType and $FFF0 = SC_RESTORE)) and
   not (csDesigning in ComponentState) and (Align <> alNone) then
   RequestAlign;
end;

этот код позволяет правильно сворачивать окно.


 
ViK ©   (2006-07-07 04:59) [28]

У меня была подобная проблема, TUser посоветовал: "Не делать сворачиваемое окно главным."
Вроде бы все работает, и не надо никаких особых обработчиков


 
Юрий Зотов ©   (2006-07-07 09:12) [29]

> Eraser

Проверил с D7 и XP SP2 - точно, есть такой эффект.


 
Юрий Зотов ©   (2006-07-07 10:07) [30]

> Eraser ©   (06.07.06 22:01) [27]

А справиться с этим можно и проще:

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
 inherited;
 if (FindControl(GetForegroundWindow) is TForm2) and
    (FindControl(WindowFromPoint(Mouse.CursorPos)) is TForm2) then
    with Message.WindowPos^ do
      flags := flags or SWP_NOZORDER
end;



 
Eraser ©   (2006-07-07 16:24) [31]

> [30] Юрий Зотов ©   (07.07.06 10:07)

хитрый способ :) спасибо, буду иметь ввиду.


 
Юрий Зотов ©   (2006-07-07 19:14) [32]

> Eraser ©   (07.07.06 16:24) [31]

Только надо иметь в виду, что код в [30] - это пример, а не готовое решение. Пример работает, если при показе хинта мышь находится над самой формой TForm2,  но он не сработает, если мышь находится над каким-то из лежащих на ней контролов. Чтобы он сработал, в любом случае, нужно сначала с помощью FindControl сначала получить этот контрол (как в примере), затем проверить его на nil и получить форму, на которой он лежит (что-то типа GetParentForm) - вот ее класс уже и сравнивать с TForm2.


 
Eraser ©   (2006-07-07 19:28) [33]

> [32] Юрий Зотов ©   (07.07.06 19:14)

да это я понял )

но мысль понятна.


 
!_SM_!   (2006-07-07 23:52) [34]


> Юрий Зотов ©   (07.07.06 09:12) [29]
> > Eraser
>Проверил с D7 и XP SP2 - точно, есть такой эффект.

У меня D7 и XP SP2 - НЕТ такого эффекта. Все нормально, при появлении hint"a на второй форме, первая никуда ни выскакивает....
Дело наверное не в сочетании D и Win....


 
Eraser ©   (2006-07-08 01:37) [35]

> [34] !_SM_!   (07.07.06 23:52)

не забыли во второй форме перекрыть CreateParams?


 
!_SM_!   (2006-07-08 16:31) [36]


> Eraser ©   (08.07.06 01:37) [35]

Нет, не забыл ...
только вот без этого делал - WMWindowPosChanging
На панеле задач для каждой формы своя панелька.
И свернув первую(главную), при появлении хинта на второй, первая не разворачивается. и ничего особого не происходит хинт отоброжается, прячется...отоброжается...прячется... вообщем первая лежит на "панеле"
пока по ней не "щелкнешь"... ВОТ.



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

Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.043 c
1-1152077296
dreamse
2006-07-05 09:28
2006.08.20
Как вытащить дату из строки типа 03.07.06_17.-32-.21.txt


2-1154516059
VitV
2006-08-02 14:54
2006.08.20
DBGrid случайное расположение данных


15-1153644917
Рырыры
2006-07-23 12:55
2006.08.20
Медным тазом ...:(


8-1140432629
sco
2006-02-20 13:50
2006.08.20
Ускорение слайд-шоу


1-1151967710
MNC
2006-07-04 03:01
2006.08.20
фокус на первый символ в РичЕдит





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