Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Form verliert Focus beim zeigen eines zweiten Hints (https://www.delphipraxis.net/110369-form-verliert-focus-beim-zeigen-eines-zweiten-hints.html)

sega84 17. Mär 2008 08:06


Form verliert Focus beim zeigen eines zweiten Hints
 
Hallo,
habe das folgende Problem bei einer TForm-Komponente:
Wenn der User den Hint eines TSpeedButton anzeigen lässt, bleibt das aktive Fenster (auf dem auch der TSpeedButton ist) im Vordergrund. Sobald er nun mit der Maus auf einen zweiten TSpeedbutton geht und sich dessen Hint anzeigen lässt, verschiebt sich das Fenster in den Hintergrund. Die Titelleiste dieser Form bleibt allerdings blau hinterlegt, das Fenster ist somit noch als aktiv deklariert. Dieses Problem konnte ich bisher nur mit einem Timer umgehen, der alle x-Millisekunden den Befehl: FormMain.BringToFront ausführt. Dies hat den Nachteil, dass die Fenster beim zeigen von Hints anfangen zu Flackern, was natürlich auch schlecht ist.
Gibt es eine globale Änderung, um diesen Bug zu umgehen? Vielen Dank für Ihre Mithilfe.

Der.Kaktus 17. Mär 2008 09:49

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
Hallo,

ist im OI Parentshowhint=false? ..bei mir geht es nämlich.

sega84 17. Mär 2008 10:46

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
Zitat:

Zitat von Der.Kaktus
Hallo,

ist im OI Parentshowhint=false? ..bei mir geht es nämlich.

Hallo,
ja bei allen TSpeedButtons ist ParentShowHint = false und ShowHint = true.
Zur Info: Ich öffne die TForm mit Form.Show!
Eine Änderung auf ParentShowhint = true brachte zwar erfolg, zeigte aber anschließend nicht die Hints an!

sega84 18. Mär 2008 07:32

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
Weiss denn niemand eine Antwort?

Fussball-Robby 18. Mär 2008 07:40

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
Also bei mir funktioniert das auch normal, Form bleibt im Vordergrund. Bist du dir sicher, dass du das nicht mit anderen Funktionen oder so hervorrufst? Öffne doch zum testen mal ein neues Projekt, mache zwei Speedbuttons drauf und guck, ob es so geht.

Mfg

Jessica 1. Apr 2008 14:47

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
Ich hab genau das selbe Problem! Bin schon den ganzen Tag am suchen, was das Problem sein könnte, kann aber nichts finden...

Was ich noch hinzufügen kann:

Bei mir hat das 2. Fenster mit den TSpeedButtons einen eigenen Taskbareintrag. War es in dem ersten Fall auch so?

Gibt es villeicht schon eine Lösung außer den Timer?

iskywalker 30. Apr 2008 14:12

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
http://groups.google.de/group/borlan...d5bbd819ad6b73

Hatte ich auch das problem, hier miniprojectcode:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
HintWindowClass :=Tmyhint;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);

Application.Run;
end.

unit Unit1;

interface

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

type
Tmyhint = class(THintWindow)
private
FActivating:boolean;
FLastActive:Cardinal;
public
procedure ActivateHint(Rect: TRect; const AHint: string); override;
end;

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


var
Form1: TForm1;

implementation

uses
Unit2;
{$R *.dfm}

procedure Tmyhint.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
if Mouse.CursorPos.Y > Rect.Top then
Style := atSlideNeg
else
Style := atSlidePos;
AnimateWindowProc(Handle, 100, AnimationStyle[Style] or AW_SLIDE);
end;
end;
ShowWindow(Handle, SW_SHOWNOACTIVATE);
Invalidate;
finally
FLastActive := GetTickCount;
FActivating := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//application.createform(tform2,form2);
form2.Show;
end;

end.


unit Unit2;

interface

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

type
TForm2 = class(TForm)
Label1: TLabel;
Button1: TButton;
private
procedure CreateParams(var Params : TCreateParams); override;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}



procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow;
end;

end.

tomsel 30. Apr 2008 14:56

Re: Form verliert Focus beim zeigen eines zweiten Hints
 
linksbündiger Code :evil:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz