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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.052 c
8-1140424615
barakuda
2006-02-20 11:36
2006.08.20
освобождение памяти после просмотра большого JPEG


1-1152435012
17Landgraf
2006-07-09 12:50
2006.08.20
Как узнать, что файл полностью загрузился?


15-1153645976
Der Nechk@ssoff
2006-07-23 13:12
2006.08.20
Монитор


3-1150127390
Вася
2006-06-12 19:49
2006.08.20
Как создать поле в ClientDatSet


15-1153732118
Ketmar
2006-07-24 13:08
2006.08.20
как запихнуть в образ MDF ещё один файлик?