So, nun habe ich wieder ein Projekt mit einem BalloonHint und der 'Bug' ist in DelphiXE immer noch vorhanden.
Ich habe das Problem damals per Timer gelöst, der nach ns BalloonHint auf '' setzt... dann verschwindet er auch...
Nun möchte ich in meinem neuen Projekt diese zusätzlichen Timer aber nicht haben, da diese (und das ganze Starten und Stoppen usw.) dan Quellcode unübersichtlich macht.
Deswegen habe ich mir gedacht ich mache mir einfache eine von TTrayIcon abgeleitete Komponete, welche einen Timer enthält.
Das habe ich soweit auch schon gemacht:
Delphi-Quellcode:
unit MyTrayIcon;
interface
uses
ExtCtrls, Classes;
type
TMyTrayIcon =
class(TTrayIcon)
private
FBallonShowInterval: cardinal;
FTimer: TTimer;
protected
public
published
constructor Create(Owner: TComponent);
override;
destructor Destroy;
override;
property BallonShowInterval: cardinal
write FBallonShowInterval;
end;
procedure Register;
implementation
uses
SysUtils;
procedure Register;
begin
RegisterComponents('
MyComponents', [TMyTrayIcon]);
end;
{ TMyTrayIcon }
constructor TMyTrayIcon.Create(Owner: TComponent);
begin
inherited;
FTimer := TTimer.Create(self);
end;
destructor TMyTrayIcon.Destroy;
begin
if assigned(FTimer)
then
FreeAndNil(FTimer);
inherited;
end;
end.
Nur fehlt mir das Ergeifnis wenn der BalloonHint angezeigt wird. In diesem muss ich den Timer dann ja starten.
TTrayIcon hat aber nur diese Ereignisse:
Zitat:
Ereignisse von ExtCtrls.TTrayIconAus
RAD Studio
VCL Reference
Übergeordnetes: TTrayIcon
OnAnimate
OnBalloonClick Wird ausgelöst, wenn der Sprechblasenhinweis angeklickt wird.
OnClick
OnDblClick
OnMouseDown
OnMouseMove
OnMouseUp
Wie kann ich diese Problem lösen?
Noch eine
OT Zusatzfrage: Muss ich im destructor eigentlich
FreeAndNil(FTimer);
machen?
Im Konstruktor habe ich ja einen Owner angegeben. Wenn dieser freigegeben wird, werden doch auch automatisch alle Objekte welche dieses Objekt als Owner haben freigegeben, oder?