Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 20.08.20 16:39 
Hallo!

Ich möchte bei den MenuItems eines TMainMenus direkt neben den Items die zugehörigen Hints anzeigen, also so, wie bei anderen Komponenten auch. Bei Delphi funktioniert dieser Code:
www.thoughtco.com/ho...u-item-hints-1058397

Warum funktioniert das aber bei Lazarus nicht? :gruebel: :nixweiss: Da wird Prozedur TForm1.WMMenuSelect erst gar nicht angesprungen. Wie bekomme ich das auch bei Lazarus hin?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 20.08.20 18:25 
So ganz versteh ich den Artikel nicht, also daß man dafür selber auf WM_MENUSELECT reagieren muß + eigener Hint-Klasse.
In einem meiner alten BCB 5 - Projekte habe ich einfach Application->OnHint dafür benutzt:
ausblenden C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  Application->OnHint = ShowHint;
}

void __fastcall TMainForm::ShowHint(TObject *Sender)
{
  StatusBar->Panels->Items[0]->Text = Application->Hint;
}

Hast du das denn schon bei Lazarus mal ausprobiert?

Edit: Oder meinst du einen Tooltip direkt bei einem MenuItem anzeigen? Das ist aber schon eine sehr ungewöhnliche UI-Funktionalität.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 20.08.20 18:53 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Edit: Oder meinst du einen Tooltip direkt bei einem MenuItem anzeigen? Das ist aber schon eine sehr ungewöhnliche UI-Funktionalität.
Ja, genau das meine ich!

Stimmt, das ist bei MenuItems nicht Standard. Es erscheint mir nur konsequent, das auch bei MenuItems so zu machen. Bei einem Button zeigst du Hint doch auch nicht in einer Statuszeile oder ähnlichem an. Aber ok, kann man auch anders sehen!

Nur: Warum kann Delphi das, Lazarus aber nicht?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 20.08.20 19:58 
Da mußt du wohl die Entwickler von Lazarus fragen (bzw. einen Bug-Report einstellen).
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 20.08.20 20:17 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Da mußt du wohl die Entwickler von Lazarus fragen (bzw. einen Bug-Report einstellen).
Ich hatte gehofft, dass ihr hier eine Lösung findet, dass die Prozedur TForm1.WMMenuSelect ausgeführt wird!

Muss man diese im interface-Abschnitt anders gestalten? Braucht man da zusätzlichen Code, damit das Programm in diese Prozedur geht?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 21.08.20 08:15 
Du kannst auch selber mal die Messages mittels Überschreiben von WndProc abfangen. Laut Lazarus-Quellcode müßte WM_MENUSELECT := $011F sein.
Im Quellcode von win32callback.inc (ab Zeile 2111) wird diese Message auch behandelt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 21.08.20 08:42 
Du kannst auch selber mal die Messages mittels Überschreiben von WndProc abfangen. Laut WM_MENUSELECT müßte WM_MENUSELECT := $011F sein (ich kann die Definition davon jedoch so im Lazarus-Quellcode nicht finden: Suche nach WM_MENUSELECT).
Im Quellcode von win32callback.inc (ab Zeile 2111) wird diese Message jedoch auch behandelt.

Welchen Int-Wert hat denn WM_MENUSELECT bei dir? Falls der anders als $011F ist, so würde es erklären, warum die Message nicht so empfangen werden kann (sie wird ja von Windows aus versendet).
Probiere mal direkt:
ausblenden Delphi-Quelltext
1:
procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message $011F;					

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 21.08.20 09:35 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Probiere mal direkt:
ausblenden Delphi-Quelltext
1:
procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message $011F;					
Danke, werde ich versuchen - aber erst nächste Woche!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 24.08.20 07:20 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Probiere mal direkt:
ausblenden Delphi-Quelltext
1:
procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message $011F;					
$011F Funktioniert mit Delphi, mit Lazarus aber nicht.

Ich verwende jetzt Application.OnHint :=
Das hat aber den unschönen Effekt, dass zB. bei Buttons Hint jetzt doppelt angezeigt wird: 1x Hint des Buttons, 1x Hint per Application.OnHint. Ich suche jetzt nach einem Weg, herauszubekommen, ob das MainMenu ausgeklappt ist oder nicht, dann könnte ich das abfangen. Oder ich ermittle, welche Komponente gerade Hint anzeigen soll. Wenn ich aber [...].ClassName überprüfe, bekomme ich immer nut TApplication. Ich benötige aber ein Konstrukt wie if [...].ClassName = TMenuItem.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.08.20 08:28 
Und wenn du eine eigene Konstante für $011F definierst und dort benutzt?

Welchen Wert hat denn WM_MENUSELECT unter Lazarus?

Und bzgl. Application.OnHint: dafür gibt es noch eine andere Message CM_HINTSHOW, welche ein THintInfo-Object mit der Eigenschaft HintControl bereitstellt, s.a. How to show hint using Application.ActivateHint on Delphi? (kann aber auch wieder sein, daß sich dies unter Lazarus anders verhält)

Edit: Es gibt auch noch das TApplication.OnShowHint-Ereignis, welche u.a. das HintInfo-Objekt als Parameter übergibt.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 24.08.20 16:53 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn du eine eigene Konstante für $011F definierst und dort benutzt?
Das nützt doch nichts, der Wert bleibt doch der selbe, egal, wo die Konstante definiert ist!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Welchen Wert hat denn WM_MENUSELECT unter Lazarus?
287, wie bei Delphi auch.

Deine weiteren Vorschläge sehe ich mir gleich an!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 24.08.20 17:35 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Deine weiteren Vorschläge sehe ich mir gleich an!
Beide funktionieren nicht, wenn das MainMenu aufgeklappt wird, da wird der Code überhaupt erst gar nicht ausgeführt. TMainMenu ist wohl etwas ganz eigenes, von dem weder TForm noch TApplication so ohne weiteres etwas mitbekommen.

Ich suche weiter nach einem Weg, wie ich herausbekomme, welche Komponente Hint gerade anzeigen soll.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.08.20 10:40 
galagher hat folgendes geschrieben:
$011F Funktioniert mit Delphi, mit Lazarus aber nicht.

Ich dachte, es gibt dort einen Kompilerfehler bei Lazarus.

Ansonsten fällt mir auch nichts mehr ein (da wird man wohl den Lazarus-Code ändern müssen).
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 25.08.20 15:53 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ich dachte, es gibt dort einen Kompilerfehler bei Lazarus.
Nein, das Programm lässt sich kompilieren, es wird nur nie die Prozedur TForm1.WMMenuSelect ausgeführt.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ansonsten fällt mir auch nichts mehr ein (da wird man wohl den Lazarus-Code ändern müssen).
Da wage ich mich nicht heran. Das lasse ich lieber.

Aber ich habe einen Weg gefunden, wie man einerseits Hints direkt bei den MenuItems des MainMenu's anzeigt, und andererseits bei Komponenten wie Buttons etc. Hint nur 1x angezeigt wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//...
  Application.OnShowHint := ApplicationPropertiesShowHint;
//...

procedure TForm1.ApplicationPropertiesShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  HintStr := '';//<- Das löst das Problem der doppelten Hints bei Komponenten!
end;

Nicht besonders elegant, funktioniert aber!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!