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

Вниз

Иконка на таскбаре для каждой формы приложения   Найти похожие ветки 

 
Enlight   (2009-07-22 16:06) [0]

Доброго времени суток.

Возникла задача отображения иконки на таскбаре для каждой формы приложения. Очевидное решение в подмене в базовом (моем базовом классе формы) метода CreateParams следующим образом:


procedure TMyCustomForm.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);

 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
 Params.WndParent := GetDesktopwindow;
end;


В таком случае необходимый эффект достигаеться, но взамен возникает следующий артефакт:
Если на форме есть некий контрол у которого есть свойство подсказки

 Hint := "Some Hint";
 ShowHint := True;

то при наведении указателя мыши на данный объект хинт всплывает, дожидаемся момента убирания хинта, и при переводе указателя мыши за пределы данного контрола или переводе на другой такой же происходит показ главной формы приложения, при чем фокус все таки остается на прежней форме (не переходит на главную).
артефакт нужно заметить, создает ряд неудобств работы с приложением.

Каким образом полечить артефакт или решить сабж не данным методом?
Всем спасибо.


 
brother ©   (2009-07-23 04:28) [1]

> Каким образом полечить артефакт

это не артефакт.


 
Enlight   (2009-07-27 17:37) [2]

А что это в таком случае?


 
brother ©   (2009-07-28 07:57) [3]

http://ru.wikipedia.org/wiki/%D0%90%D1%80%D1%82%D0%B5%D1%84%D0%B0%D0%BA%D1%82
в компьютерной графике
а у тебя - не верный алгоритм работы программы...
зы Слово красивое?)


 
Enlight   (2009-08-05 12:17) [4]

В каком именно месте проявляеться неверность алгоритма? (приводить википедию со словом алгоритм только не нужно, уже ясно что ты умен).
И почему же у меня не артефакт, если следовать приведенным тобою определением?


Артефа́кт (от лат. artefactum — искусственно сделанное) — явление, процесс, предмет, свойство предмета или процесса, появление которого в наблюдаемых условиях по естественным причинам невозможно или маловероятно. Появление артефакта, следовательно, является признаком целенаправленного вмешательства в наблюдаемый процесс, либо наличия неких неучтённых факторов.


 
brother ©   (2009-08-05 12:26) [5]

> В каком именно месте проявляеться неверность алгоритма?

в 17 строке?

> то при наведении указателя мыши на данный объект хинт всплывает,
> дожидаемся момента убирания хинта, и при переводе указателя
> мыши за пределы данного контрола или переводе на другой
> такой же происходит показ главной формы приложения, при
> чем фокус все таки остается на прежней форме
(не переходит
> на главную).

в этом проблемма?
тогда я не понял как это:

> и при переводе указателя мыши за пределы данного контрола
> или переводе на другой такой же происходит показ главной
> формы приложения

активации формы не должно быть, тк явного клика нет...


 
Enlight   (2009-08-06 13:39) [6]


> активации формы не должно быть, тк явного клика нет...

В том то и дело что ее не должно быть, и не происходит. Активной остается все та же форма, но меняеться Z порядок форм, и главная форма приложения оказывается в нем первой. Воспроизведите елементарно описанное приложение и увидите (Делать это стоит только на версиях Делфи выше 5, т.к. в 5 почему-то описаный трюк работает правильно).


 
n200   (2009-08-06 16:59) [7]


> Воспроизведите елементарно описанное приложение и увидите (Делать это стоит только на версиях Делфи выше 5, т.к. в 5 почему-то описаный трюк работает правильно).

Delphi 7.
Воспроизвёл.
Описанная вами ситуация не возникает.


 
Enlight   (2009-08-10 13:53) [8]

Создаем новый проект. Код созданной формы подменяем следующим ниже.
Алгоритм воспроизмедения:
- запускаем
- клик по кнопке
- на новосоданной форме наводим указатель на кнопку до появления хинта
- после появления хинта убираем
- снова наводим до появления хинта и смотрим


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure ButtonClick(Sender: TObject);
 private
   { Private declarations }
 protected
   procedure CreateParams(var Params: TCreateParams); override;
   { Protected declarations }
 public
   procedure AfterConstruction; override;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);

 if Application.MainForm <> nil then begin
   Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
   Params.WndParent := GetDesktopWindow;
 end;
end;

procedure TForm1.AfterConstruction;
var
 FButton: TButton;
begin
 inherited;

 Self.KeyPreview := True;

 FButton := TButton.Create(Self);
 FButton.Parent := Self;
 FButton.Top := 30;
 FButton.Left := 30;
 FButton.Hint := "SomeHint";
 FButton.ShowHint := True;
 FButton.OnClick := ButtonClick;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
 FForm: TForm;
begin
 FForm := TForm1.Create(Application);
 FForm.Caption := FForm.Caption + " Created " + DateTimeToStr(Now);
 FForm.Show;
end;

end.


ПС: Если в методе CreateParams убираем проверку  
 if Application.MainForm <> nil then begin
   Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
   Params.WndParent := GetDesktopWindow;
 end;

то артефакт не воспроизводиться, но на панеле задач иконок приложения больше чем нужно)


 
dreel   (2009-09-30 17:38) [9]

Таже самая ситуация, решения пока не нашел.
А две одинаковых закладки на панели задач- не прикольно.


 
dreel   (2009-09-30 18:10) [10]

Нашел решение http://qc.embarcadero.com/wc/qcmain.aspx?d=9407

Нужно подменить хендл родительского окна для Hint

type
 TFixHintWindow = class(THintWindow)
 protected
   procedure CreateParams(var Params: TCreateParams); override;
 end;

procedure TFixHintWindow.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WndParent := 0; // не привязываем к конкретному окну
end;


При создании формы

procedure TMainForm.FormCreate(Sender: TObject);
begin
 HintWindowClass := TFixHintWindow;
 // ...
end;


 
Enlight   (2009-10-09 17:58) [11]

Спасибо. Так и есть. Проблема то старая) на QC датируется 2004 годом. Странно, что весь инет по запросу как сделать дает такое решение, но при этом я не находил фактов того, что кто-то с проблемой сталкивался.
Еще просмотрю QC, т.к. они утверждают что воспроизвели на Д6-Д7, а еще и на Д2007. Видимо описаную фичу они менять упорно не хотят


 
Enlight   (2009-10-09 19:53) [12]


> т.к. они утверждают что воспроизвели на Д6-Д7, а еще и на
> Д2007

изивините описался, правильно читать: т.к. они утверждают что воспроизвели на Д6-Д7, а я еще и на



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

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

Наверх





Память: 0.49 MB
Время: 0.004 c
15-1297075464
istok
2011-02-07 13:44
2011.05.22
мониторинг принтеров...


3-1259290992
Diplomat
2009-11-27 06:03
2011.05.22
Поиск заданного значения в БД


15-1296849834
Baks
2011-02-04 23:03
2011.05.22
Variants unit в Delphi 5


15-1297086003
oldman
2011-02-07 16:40
2011.05.22
Для тех кто хочет знать, какого пола их компьютер


2-1297715273
Чайник
2011-02-14 23:27
2011.05.22
Настройка Д2010





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