ich würde die beiden prozeduren
AddControlName()
und
AddControlTip()
zu einer einzigen Prozedur mit 2 Parametern zusammenfassen.
Dein Anwendungbeispiel sieht dann so aus:
Delphi-Quellcode:
//Hinzufuegen der Controls & Texte, welche angezeigt werden sollen
Tooltip.AddControlTip(Image_Beispiel, 'Dies ist der Tip zum Bild Image_Beispiel');
Tooltip.AddControlTip(Edit_Beispiel, 'Dies ist der Tip zur TextBox Edit_Beispiel');
Tooltip.AddControlTip(Listbox_Beispiel, 'Dies ist der Tip zur ListBox Listbox_Beispiel');
// der Tooltip für ein Control kann auch nachträglich geändert werden
Tooltip.AddControlTip(Edit_Beispiel, 'Geänderter Tip zur TextBox Edit_Beispiel');
// man kann sogar den Tooltip wieder entfernen
Tooltip.AddControlTip(Listbox_Beispiel, '');
Damit wird die Schnittstelle klarer und es wird verhindert, dass Controls und Tips auseinanderlaufen.
Delphi-Quellcode:
// die neue Prozedur
procedure TTooltip.AddControlTip(control: Tcontrol; const ToolTip: String);
var
i : integer;
begin
i := Tips.IndexOfObject(control); // prüfe ob Control schon in Liste
if i <> -1 then
begin
if ToolTip = '' then
Tips.Delete(i) // lösche bestehenden Eintrag in der Liste
else
Tips.Strings[i] := ToolTip // ändere Tooltip für gefundenes Control
end
else if Assigned(control) then
Tips.AddObject(ToolTip, control); // Control & Tooltip anhängen
end;
Das Feld
Elements: TStringList
kann dann komplett entfallen.
In der Procedure procedure TTooltip.ShowDelayOnTimer müssen dann natürlich Veränderungen vorgenommen werden.
Delphi-Quellcode:
LObject := (Parent as TForm).ObjectAtPoint(FMousePoint) ;
idx := Tips.IndexOfObject(LObject);
if idx <> -1 then // prüfe ob das Control in der Liste ist
begin
Text := Tips.Strings[idx]; // Hole den Tooltip zu dem Control
LMousePos := Screen.MousePos;
ShowToolTip(LMousePos.X, LMousePos.Y);
end;
Die Hilfsprozeduren
GetElementIndex()
und
GetElementTip()
werden nicht mehr gebraucht.