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/)
-   -   HintPause in FireMonkey? (https://www.delphipraxis.net/213966-hintpause-firemonkey.html)

schorsch666 30. Okt 2023 14:59

HintPause in FireMonkey?
 
Moin @ALL,
hat jemand nen tipp, wie/wo ich in fmx festlegen kann, wie lange ein hint angezeigt werden soll? in der vcl ist dat ja kein problem, aber in fmx hab ich nix gefunden.

waere supi..

...de Schorsch

Harry Stahl 30. Okt 2023 20:18

AW: HintPause in FireMonkey?
 
Leider gibt es da (meines Wissens nach) keine eingebaute Möglichkeit so etwas zu setzen.

Ich hätte mir so eine Möglichkeit auch gewünscht, ich selber hatte ja so etwas mal in einer Unit implementiert, als es noch keine Hints in FireMonkey gab.

Dir bliebe nur noch die Möglichkeit, eine Zuweisung für Application.onhint vorzunehmen und den Inhalt des Hints selber nach Deinen Wünschen anzuzeigen. Du müsstest dazu im Onhint-Event die normale Hintanzeige canceln und dann anhand des Hinttextes die passende Komponente dazu in Deiner Form finden, so dass Du dann den Hint an der richtigen Stelle anzeigen kannst.

Für den Fall, dass das für Dich in Betracht kommen sollte, als evtl. Inspiration für die Gestaltung des Hints ein (älteres) Video dazu: https://youtu.be/eWGbhOexrJk?si=S5CBKClRGL08mdRW

Harry Stahl 1. Nov 2023 00:30

AW: HintPause in FireMonkey?
 
Na, noch der Hinweis, bevor Du Dir evtl. entsprechende Arbeit machst: Nachdem ich das gestern hier geschrieben hatte, kam mir der Gedanke, dass die Lösung die ich damals zur Anzeige von Hints etnwickelt hatte, mir sehr viel besser gefällt, also das nun in Delphi FMX integriert ist.

Habe daher selber die vorgeschlagene Lösung umgesetzt und hierzu auch ein kleines Video gemacht, dort findest Du auch den Downloadlink zu der Unit: https://youtu.be/n2H5Vji_wKE?si=b2qyTH4uVL2dYjNu

himitsu 1. Nov 2023 06:55

AW: HintPause in FireMonkey?
 
Einfach mal VCL.Forms einbinden und in dessen Application die HintPause setzen?

Mit etwas Glück wird, auch an dieser Stelle, etwas der VCL benutzt.

Harry Stahl 1. Nov 2023 11:24

AW: HintPause in FireMonkey?
 
Zitat:

Zitat von himitsu (Beitrag 1528810)
Einfach mal VCL.Forms einbinden und in dessen Application die HintPause setzen?

Mit etwas Glück wird, auch an dieser Stelle, etwas der VCL benutzt.

Meinst Du diesen Rat ernst? FMX und VCL zu mischen ist nie eine gute Idee. Im Zweifel wird sich das schon gar nicht kompilieren lassen auf Ebene von MacOS oder Linux sowieso schon nicht.

himitsu 1. Nov 2023 12:15

AW: HintPause in FireMonkey?
 
Nein, nicht direkt. (auch wenn es mehrere Leute gibt, welche VCL und FMX mischen, also beide Fenstertypen in einer Anwendungen verwenden)

Unter Windows greift das FMX ja auf Funktionen des Windows zu.
Der Einfachheit halber kann Emba dort dann auch Funktionen der VCL benutzt haben ... wenn dem so ist, würde man über den Zugriff auf die VCL dann eventuell die selbe Funktion steuern, welche über FMX nicht direkt zugreifbar ist.

Ähnlich wie bei den Windows-Services, wo es "Application" (TServiceApplication aus Vcl.SvcMg) gibt, welches in der DPR benutzt wird.
Intern verwendet Dieses aber das "Application" der VCL (TApplication aus Vcl.Forms).
Will man z.B. an die Fehlerbehandlung des Services ran, dann kann es über die VCL lösen.
(siehe TServiceApplication.Create, .Run und .Destroy)

Einfach nur ein Versuch:
* Unit Vcl.Forms ins Uses
* über dessen Application diese Eigenschaft ändern und schauen ob es im FMX eine Wirkung hat
Delphi-Quellcode:
Vcl.Forms.Application.HintHidePause := 666;

Harry Stahl 1. Nov 2023 12:58

AW: HintPause in FireMonkey?
 
Zitat:

Zitat von himitsu (Beitrag 1528848)
Nein, nicht direkt. (auch wenn es mehrere Leute gibt, welche VCL und FMX mischen, also beide Fenstertypen in einer Anwendungen verwenden)

Unter Windows greift das FMX ja auf Funktionen des Windows zu.
Der Einfachheit halber kann Emba dort dann auch Funktionen der VCL benutzt haben ... wenn dem so ist, würde man über den Zugriff auf die VCL dann eventuell die selbe Funktion steuern, welche über FMX nicht direkt zugreifbar ist.

Ähnlich wie bei den Windows-Services, wo es "Application" (TServiceApplication aus Vcl.SvcMg) gibt, welches in der DPR benutzt wird.
Intern verwendet Dieses aber das "Application" der VCL (TApplication aus Vcl.Forms).
Will man z.B. an die Fehlerbehandlung des Services ran, dann kann es über die VCL lösen.
(siehe TServiceApplication.Create, .Run und .Destroy)

Einfach nur ein Versuch:
* Unit Vcl.Forms ins Uses
* über dessen Application diese Eigenschaft ändern und schauen ob es im FMX eine Wirkung hat
Delphi-Quellcode:
Vcl.Forms.Application.HintHidePause := 666;

Wie gesagt, Dein Vorschlag lässt sich nicht kompilieren. Und ansonsten ist es so, dass unter Windows-FMX die Zugriffe auf die Windows-Api nur sehr gezielt stattfinden. Dafür gibt es aber spezielle units und die findest Du nicht in der VCL (sondern vor allem in RTL_units). Ein mischen ist zwar unter bestimmten Fällen möglich wird aber u.U. mit unstabilen Programmverhalten erkauft und einer erheblich größerer Exe-Datei (denn dann wird auch sehr viel Windows-VCL-Code eingebaut, den man nicht nutzt oder nicht nutzen kann).

schorsch666 1. Nov 2023 14:16

AW: HintPause in FireMonkey?
 
tks, habe es mir mal angeschaut, doch dazu die frage:
du sagtest im video, dass texte umgebrochen werden - ich habe die aber alle muehsam in ner unit mittels slinebreak entspr. formatiert. koennte man das als option "abschalten", oder ist das vllt. schon drin?

...de Schorsch

schorsch666 1. Nov 2023 14:35

AW: HintPause in FireMonkey?
 
Liste der Anhänge anzeigen (Anzahl: 1)
...hab mir das schon gedenkt. macht probs :(

(siehe anhang)

Harry Stahl 1. Nov 2023 15:00

AW: HintPause in FireMonkey?
 
Du könntest insofern eine Anpassung vornehmen, als dass Du bei der Zuweisung des Hints an den Label-Text die sLinebreaks entfernst und die Aufteilung der Zeilen ansonsten der Routine überlässt.

Ändere einfach die Zeile
Delphi-Quellcode:
Lab.text := Application.hint; // alt

// in
Lab.text := ReplaceStr (Application.hint, sLineBreak, ' '); // neu
Dafür musst Du auch die Unit "System.StrUtils" noch einbinden.

himitsu 1. Nov 2023 15:18

AW: HintPause in FireMonkey?
 
Zitat:

Wie gesagt, Dein Vorschlag lässt sich nicht kompilieren
Kann eigentlich nicht sein. (aber ich würde vorschlagen die VCL-Units als Ersts ins Uses zu schreiben)

Und, wie gesagt, das ist nur für Windows ... Android, iOS, OSX usw. nutzen ein anderes Backend. :stupid:

himitsu 1. Nov 2023 15:38

AW: HintPause in FireMonkey?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmmm, gibt es überhaupt einen Timeout?
[edit]
Ups, falschrum ... HintPause, nicht HidePause.
Außerdem hab ich vergessen Max hochzusetzen :oops:

Und Vcl.Forms.Application.HintPause und .HintHidePause haben eh keine Wirkung. :cry:
[/edit]

Bei mir werden die Hints ewig angezeigt,
und bei ControlType=Platform werden garkeine Hints angezeigt.

himitsu 1. Nov 2023 15:57

AW: HintPause in FireMonkey?
 
Unter Windows wird direkt die WinAPI benutzt.

Hab gesehn, dass der Hint ein tooltips_class32 ist, also im Code danach gesucht und gefunden. :angle2:

Delphi-Quellcode:
unit FMX.Controls.Win;

const
  TOOLTIPS_CLASS = 'tooltips_class32';

constructor TWindowsHint.Create(const AHandle: TWindowHandle);
var
  LToolInfo: TOOLINFO;
begin
  inherited;
  FWindowHandle := AHandle;
  FNativeControlHandle := WindowHandleToPlatform(AHandle).Wnd;
  if FNativeControlHandle <> 0 then
  begin
    FToolTipHandle := CreateWindowEx(0, TOOLTIPS_CLASS, nil, WS_POPUP or TTS_ALWAYSTIP, 0, 0, 300, 300,
      FNativeControlHandle, 0, hInstance, nil);

    SetWindowPos(FToolTipHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);

    FillChar(LToolInfo, SizeOf(TOOLINFO), 0);
    LToolInfo.cbSize := SizeOf(TOOLINFO);
    LToolInfo.uFlags := TTF_SUBCLASS or TTF_IDISHWND or TTF_PARSELINKS;
    LToolInfo.hinst := hInstance;
    LToolInfo.hwnd := FNativeControlHandle;
    LToolInfo.uId := FNativeControlHandle;
    LToolInfo.lpszText := nil;

    SendMessage(FToolTipHandle, TTM_ADDTOOL, 0, LPARAM(@LToolInfo));
    SendMessage(FToolTipHandle, TTM_ACTIVATE, NativeInt(False), LPARAM(@LToolInfo));
  end;
end;
Die Wrapper-Klasse dazu hat auch nicht viele oder komplizierte Funkionen.



Also weiter siehe Hilfe:
https://learn.microsoft.com/en-us/wi...oltip-controls

Es läuft ein WM_TIMER, welcher für's Anzeigen und Ausblenden zuständig ist. (den könnte man vielleicht manipulieren)

Tja, TTM_SETDELAYTIME :stupid:
https://learn.microsoft.com/en-us/wi...m-setdelaytime

Jetzt mußt du nur noch rausbekommen, wie du an dessen Handle kommst.
Oder an den Systemeinstellungen rumpfuschen ... siehe Remarks :lol:

Harry Stahl 1. Nov 2023 16:30

AW: HintPause in FireMonkey?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von schorsch666 (Beitrag 1528859)
...hab mir das schon gedenkt. macht probs :(

(siehe anhang)

Weiterhin könntest Du auch, falls Dir bei der Aufteilung in Zeilen wichtig ist, wann der Zeilenumbruch stattfindet auch noch folgenden Code nach der Berechnung der Höhe des Callouts einfügen (= vor der Zeile "AcallHint.width := aw"):

Delphi-Quellcode:
if pos (slinebreak, lab.Text) <> 0 then begin
  ACallhint.Height := ACallHint.Height + (CountLineBreaks (lab.Text) * lab.canvas.textheight ('T'));
end;
Die Function "CountLinebreaks" sieht so aus (da gibt es wohl gar nichts fertiges in Delphi?):

Delphi-Quellcode:
function CountLinebreaks (S: string): Integer;
  var start: Integer;
  begin
    Result := 0;
    start := 1;

    while pos (sLineBreak, s, start) <> 0 do begin
      Inc (Result);
      start := pos (sLineBreak, s, start) + 2;
    end;
  end;

Wenn Dein Button hint, also so erstellt wurde:
Delphi-Quellcode:
button1.Hint := 'Zeile 1 ' + sLineBreak + 'Zeile 2 ' + slinebreak + 'Zeile 3';
sieht das Ergebnis dann wie im anliegenden Screenshot gezeigt aus.

Um diesen Fall der evtl. Gestaltung der Hints zu berücksichtigen baue ich das auch noch in meine Unit ein und lade die aktualisierte Fassung noch mal hoch.

Ich glaube ich habe noch nicht erwähnt, dass die Unit sowohl unter Windows, als auch unter Linux und MacOS funktioniert.

Rollo62 2. Nov 2023 15:06

AW: HintPause in FireMonkey?
 
Das findet anscheinend zentral in FMX.Forms.TApplication statt.

Delphi-Quellcode:
    /// <summary>Cancels the display of a hint for a control.</summary>
    procedure CancelHint;
    /// <summary>Hides the current hint.</summary>
    procedure HideHint;
    /// <summary>Occurs when the mouse pointer moves over a control or menu item that can display a Help Hint.</summary>
    property OnHint: TNotifyEvent read FOnHint write FOnHint;
Man könnte schlimmstenfalls OnHint abfangen und da seinen eigenen Timer laufen lassen,
der den Hint dann mit CancelHint oder HideHint brutal abbricht.

schorsch666 2. Nov 2023 16:55

AW: HintPause in FireMonkey?
 
hmmmm. finde ich irgendwie alles nicht prickelnd - und die unit von harry, ok, aber zb bei einem groesseren memo - da geht der hint auf, wo die maus gerade ist... ich moechte eigtl. auch ungern "fremde" units in meinen progs und was aufzublaehen, was im kern da ist - nee, will ich auch nicht. ausserdem bauen viele externe kompos auf der "normalen" hint-logik auf - und da will ich nix veraendern.

ich dachte halt, es gibt da etwas, analog zur vcl - und das unter allen bs laeuft. naja, muessen die leute halt schneller lesen :(

tks in die runde...

...de Schorsch

himitsu 2. Nov 2023 18:49

AW: HintPause in FireMonkey?
 
Zitat:

Zitat von schorsch666 (Beitrag 1528902)
naja, muessen die leute halt schneller lesen :(

Meinst du jetzt wirklich die HintPause (Verzögerung, bis angezeigt wird)
oder die HintHidePause (Dauer der Anzeige) :?:

Wie schon gesagt, bleibt bei mir (im Windows) der Hint scheinbar unbegrenzt lange sichtbar.

schorsch666 6. Nov 2023 10:43

AW: HintPause in FireMonkey?
 
HintHidePause (Dauer der Anzeige)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr.

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