Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TButton und ShowAccelChar (https://www.delphipraxis.net/209759-tbutton-und-showaccelchar.html)

OsCor 17. Jan 2022 20:01

Delphi-Version: 10.4 Sydney

TButton und ShowAccelChar
 
Hallo liebe Helfer,

bin gerade etwas verwirrt: Beim Erstellen eines Formulars habe ich versucht, die im Titel erwähnte Funktionalität zu nutzen. Am Anfang ging es, d.h. die Unterstriche unter den mit führendem & versehenen Buchstaben der Button.Caption wurden angezeigt. Jetzt plötzlich nicht mehr. Nach einigem Suchen habe ich gesehen, dass ShowAccelChar nur beim Label-Control gesteuert werden kann - und bei TButton anscheinend nicht.
Ich habe mir vor vielen Jahren (2007) das Buch Delphi 7 von Doberenz und Gewinnus gekauft. Da habe ich jetzt nochmal reingeschaut und festgestellt, dass viele Beispieldarstellungen von Buttons diese unterstrichenen Buchstaben anzeigen. Also war das doch keine Halluzination.
Nachdem die allermeisten Fragen zum & in diesem Forum die reine Darstellungsweise zum Thema hatten, möchte ich diese Frage doch mal stellen. Vielleicht geht es mir besser als dem Forumsteilnehmer, der 2017 eine solche Frage für eine Radiobuttongruppe hatte, auf die es anscheinend keine Antwort gab.

Gruß
Oswald

Dalai 17. Jan 2022 21:17

AW: TButton und ShowAccelChar
 
Das Verhalten wird durch Windows gesteuert. Standardmäßig werden die AccelChars von grafischen Controls wie Menüs, Popup-Menüs, Checkboxen, Buttons usw. erst nach dem Drücken der ALT-Taste angezeigt. In den Eingabehilfen von Windows (Systemsteuerung bzw. Einstellungen-App) kann man einstellen, ob diese immer angezeigt werden sollen.

Grüße
Dalai

OsCor 17. Jan 2022 21:43

AW: TButton und ShowAccelChar
 
Tatsächlich, wenn man die Alt-Taste drückt, erscheinen die Unterstriche. Das macht aber eigentlich noch nicht so richtig Sinn, also muss ich rauskriegen, wie ich diese Anzeige aktivieren kann, ohne die Alt-Taste zu benötigen.
Klasse Tipp!

Gruß
Oswald

himitsu 18. Jan 2022 07:52

AW: TButton und ShowAccelChar
 
Nja Sinn ... Mann Win denkt halt, dass Maus und vorallem Touch das Beste ist und niemand die Tastatur braucht. :wink:

Diese Option besagt nur, ob das Control grundsätzlich das Tastenkürzel anzeigen soll, oder eben "garnicht".
Windows regelt dann, "wann" das nun angezeigt wird, also standardmäßig nur bei ALT.
Und der Nutzer (welcher oftmals von dieser Option garnichts weiß), kann dann entscheigen (falls er es erfährt), ob er es nicht doch wieder "immer" sehen will, so wie es im letzten Jahrtausend mal war.


Man könnte mal im Unicode nachsehn (hab grad nichts gefunden, aber dachte mir, dass es sowas doch geben muß), ob es eine überschreibende Version von _ gibt.



[edit]
Na endlich, schaut man beim "Hersteller" und nicht bei dem Schrott, der bei Google und Co. aktuell auf Seite 1 gelistet wird, dann
https://www.unicode.org/charts/PDF/U0000.pdf

005F _ LOW LINE
02CD ˍ   modifier letter low macron

Ein ˍUnterstrich

'Ein '#$2CD'Unterstrich' = Ein ˍUnterstrich

bzw. vermutlich 'Ein '#$2CD'_Unterstrich'
Nur solltest du dann ShowAccelChar wohl besser abschalten, damit _ nicht eventuell doppelt vorkommt




alternativ https://util.unicode.org/UnicodeJsps...old%20symbols}
nur darfst dich das dann mit Surrogates auseinander setzen.
so geht es ja nicht 'Als '#$1D405'ett' , weil größer 16 Bit

'Als '#$D875#$DC05'ett' = Als 𝐅ett

Und einen passenden Font brauchst'e leider auch, (meistens, im Delphi genutzt, oder als Replacement im Windows registriert)
da es bei den Surrogates seit 20 Jahren noch etwas hängt. :cry:
Wie du siehst, das Forum und der Browser können es (falls du es dort siehst).

OsCor 18. Jan 2022 20:05

AW: TButton und ShowAccelChar
 
Oha, das ist mir doch etwas viel Aufwand. Schade, ich habe mir bei vielem angewöhnt, Tastaturbefehle zu nutzen.

Ich danke euch!
Oswald

himitsu 18. Jan 2022 22:34

AW: TButton und ShowAccelChar
 
Wie gesagt.
Einfach im Windows das aktivieren, dann siehst DU es immer.

OsCor 20. Jan 2022 20:35

AW: TButton und ShowAccelChar
 
Um ehrlich zu sein: Ich stehe gerade mächtig auf dem Schlauch. Ich habe in den Einstellungen gesucht und nichts gefunden. Tut mir leid: Ich verstehe nicht, was ich tun kann/muss.

Gruß
Oswald

Dalai 20. Jan 2022 21:00

AW: TButton und ShowAccelChar
 
Im Windows 7 bzw. in der klassischen Systemsteuerung ist das unter
Code:
Systemsteuerung\Alle Systemsteuerungselemente\Center für erleichterte Bedienung\Bedienung der Tastatur erleichtern
Die Option heißt "Tastenkombinationen und Zugriffstasten unterstreichen".

Ob das im Win10 wirklich in der Einstellungen-App ist (und wenn ja wo), weiß ich nicht.

Grüße
Dalai

OsCor 20. Jan 2022 21:31

AW: TButton und ShowAccelChar
 
Ich arbeite seit ein paar Wochen mit Win 11. Bisher habe ich in den Einstellungen noch nichts gefunden.

Gruß
Oswald

Dalai 20. Jan 2022 21:39

AW: TButton und ShowAccelChar
 
Gibt's denn noch die klassische Systemsteuerung? Probier's mal mit control.exe.

Grüße
Dalai

himitsu 20. Jan 2022 22:45

AW: TButton und ShowAccelChar
 
Windows 11 weiß ich grade nicht,
aber Windows 10:

[Win] > die "Einstellungen"-App > Tastatur > Funktionsweise von Tastenkombinationen ändern > Zugriffstasten unterstreichen, falls verfügbar


Zitat:

Gibt's denn noch die klassische Systemsteuerung
Zum Großteil, wird das sogar über das Startmenü noch gefunden.

Aber als ich vorhin suchen wollte, wie man "sicher" in das gefundene Menü kommt, fand ich erstmal die alte Tastsatursteuerung und da fehlte diese Option.

KodeZwerg 21. Jan 2022 01:56

AW: TButton und ShowAccelChar
 
ich habe es noch nie wirklich ausprobiert aber rein theoretisch würde doch ein kurzes senden der "alt" taste gefolgt von "escape" im "formcreate" das problem lösen ohne irgendwelche einstellungen vornehmen zu müssen, oder?

himitsu 21. Jan 2022 08:13

AW: TButton und ShowAccelChar
 
Bei Dialogen ja

Bei Menü/Kontektmenü muß man Alt vorher/während des Öffnens drücken.
Das Drücken von Alt während offen, schließt das Menü.
Mainmenü mit Alt oder F10 öffnen, da wird Accel auch aktiviert und bleibt aktiv, so lange "ein" Menü offen ist, auch beim Umblättern mit Maus/Tastatur.

Und aktuell schließt bei mir auch schon das noch-gedrückthalten der Alt-Taste die Kontextmenüs sofort wieder (ein neuer Bug, der mir grade erst auffiel) ... also im Kontextmenü hab ich aktuell die Accels nur, wenn Option im System aktiv ist.

KodeZwerg 21. Jan 2022 13:54

AW: TButton und ShowAccelChar
 
Also der Gedanke den ich hatte habe ich nun erfolgreich getestet.

Ich habe TButton auf einer Form mit einer "T&est" Caption.
Wenn ich das Programm starte ist "e" unterstrichen.

Das war es doch was der TE wollte, oder?

Delphi-Quellcode:
function SendVK(const TargetWindow: HWND = 0; const VK_KeyCode: Word = 0; const PressKey: Boolean = True): Boolean;
var
  inputArray: array[0..0] of TInput;
begin
  Result := False;
  if (TargetWindow = 0) then
    Exit;

  // Beginne Prüfung
  if (GetForegroundWindow <> TargetWindow) then
    begin
      // Ziel ist kein Fenster
      if (not IsWindow(TargetWindow)) then
        Exit;

      // Ziel ist minimiert
      if IsIconic(TargetWindow) then
        ShowWindow(TargetWindow, SW_RESTORE);

      // Ziel ist versteckt
      if (not IsWindowVisible(TargetWindow)) then
        ShowWindow(TargetWindow, SW_SHOW);

      // Ziel ist nicht im Vordergrund
      if (GetForegroundWindow <> TargetWindow) then
        BringWindowToTop(TargetWindow);

      // Finale prüfung
      if (GetForegroundWindow <> TargetWindow) then
        Exit;
    end;

  // Fülle Puffer und sende ihn
  FillChar(inputArray, Length(inputArray) * SizeOf(TInput), 0);
  inputArray[0].Itype := INPUT_KEYBOARD;
  inputArray[0].ki.wVk := VK_KeyCode;
  if (not PressKey) then
    inputArray[0].ki.dwFlags := KEYEVENTF_KEYUP;
  Result := (SendInput(Length(inputArray), inputArray[0], SizeOf(TInput)) <> 0);
end;

procedure TForm19.FormCreate(Sender: TObject);
begin
//  Self.BringToFront;
  SendVK(Handle, VK_LMENU);
  SendVK(Handle, VK_LMENU, False);
  SendVK(Handle, VK_ESCAPE);
  SendVK(Handle, VK_ESCAPE, False);
end;

venice2 21. Jan 2022 14:02

AW: TButton und ShowAccelChar
 
Und wenn
Zitat:

[Win] > die "Einstellungen"-App > Tastatur > Funktionsweise von Tastenkombinationen ändern > Zugriffstasten unterstreichen, falls verfügbar
Deaktiviert ist geht es dann immer noch?

himitsu 21. Jan 2022 14:04

AW: TButton und ShowAccelChar
 
Wenn, ann in OnActivate

Ist in der Form nicht schon Visible=True, dann will ich nicht wissen, was wo dein Code dann was macht.

KodeZwerg 21. Jan 2022 14:09

AW: TButton und ShowAccelChar
 
Das ist ein guter Einwand, also aufpassen wo man SendVK() ausführt, die Form muss sichtbar sein. Das SendVK() sendet stur an was auch immer im Vordergrund den Focus hat.

edit:
die obige methode etwas überarbeitet so das nun auch ein Ziel angegeben werden kann.

peterbelow 21. Jan 2022 16:55

AW: TButton und ShowAccelChar
 
Zitat:

Zitat von OsCor (Beitrag 1500774)
Hallo liebe Helfer,

bin gerade etwas verwirrt: Beim Erstellen eines Formulars habe ich versucht, die im Titel erwähnte Funktionalität zu nutzen. Am Anfang ging es, d.h. die Unterstriche unter den mit führendem & versehenen Buchstaben der Button.Caption wurden angezeigt. Jetzt plötzlich nicht mehr. Nach einigem Suchen habe ich gesehen, dass ShowAccelChar nur beim Label-Control gesteuert werden kann - und bei TButton anscheinend nicht.
Ich habe mir vor vielen Jahren (2007) das Buch Delphi 7 von Doberenz und Gewinnus gekauft. Da habe ich jetzt nochmal reingeschaut und festgestellt, dass viele Beispieldarstellungen von Buttons diese unterstrichenen Buchstaben anzeigen. Also war das doch keine Halluzination.
Nachdem die allermeisten Fragen zum & in diesem Forum die reine Darstellungsweise zum Thema hatten, möchte ich diese Frage doch mal stellen. Vielleicht geht es mir besser als dem Forumsteilnehmer, der 2017 eine solche Frage für eine Radiobuttongruppe hatte, auf die es anscheinend keine Antwort gab.

Gruß
Oswald

Versuch mal

Delphi-Quellcode:
var
  B : BOOL;

B:= True;
SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, @B, 0);

Dalai 21. Jan 2022 18:49

AW: TButton und ShowAccelChar
 
Die Funktion SystemParametersInfo zum Setzen von Einstellungen zu benutzen, kann man vielleicht tun, wenn man die Software nur auf dem eigenen System verwendet. Aber ich empfinde es als NoGo, wenn man dies in einer Software tut, die bei anderen Leuten laufen soll. Der Nutzer hat immer irgendwelche Gründe, warum bestimmte Dinge auf dem System oder im Nutzerprofil so eingestellt sind wie sie eingestellt sind.

Nur mal ein kurzer Abschweif, warum ich das so sehe. Es gibt ein Total Commander Plugin, das bis vor einigen Jahren das Smoothscrolling von Listboxen im Windows aktivierte, sobald das Plugin geladen wurde. Smoothscrolling von Listboxen ist auf allen Systemen, die ich installiere, deaktiviert, weil dieses "Feature" für mich weder sinnvoll noch nötig sondern eher hinderlich ist.
Das beeinflusst(e) - weil das eine globale Einstellung für das Nutzerprofil ist - alle (Standard-Windows) Listboxen in allen Programmen. So war es nicht nur im Total Commander und dessen Listboxen aktiv sondern auch im PuTTY, in allen Standard-Schriftauswahl-Dialogen usw. usf.

Zum Glück behob der Autor des Plugins das irgendwann und vermerkte das sogar im Changelog. Aber genervt hat mich das lange Zeit. Es hatte Monate gedauert, bis ich herausfand, dass es von diesem Plugin verursacht wird, weil das Smoothscrolling sich nur unregelmäßig aktivierte, weil das Plugin natürlich nicht immer benutzt wurde.

Nichtsdestotrotz kann man die Keyboard Indicators damit (einmalig) aktivieren, falls man die Einstellung in der Systemsteuerung bzw. der Einstellungen-App nicht findet.

Grüße
Dalai

OsCor 22. Jan 2022 21:34

AW: TButton und ShowAccelChar
 
Ich habe jetzt beide Lösungsversisonen ausprobiert. Da ich die Software hauptsächlich für meine eigenen Zwecke nutzen werde, sollte die Benutzung der Windows-Funktion kein Problem darstellen. Aber die Langversion von KodeZwerg werde ich in petto halten. Dabei habe ich aber noch nicht verstanden, was „Ziel angeben” bedeutet. Vielleicht kann mir KodeZwerg das noch erklären?

Wenn man nicht immer zwischen Tastatur und Maus hin und her springen will, ist Alt+ sehr hilfreich - zumal, wenn man wie ich immer mal wieder unter einem „Mausarm” leidet.

Vielen Dank einstweilen!
Oswald

KodeZwerg 23. Jan 2022 00:29

AW: TButton und ShowAccelChar
 
Zitat:

Zitat von OsCor (Beitrag 1501053)
Dabei habe ich aber noch nicht verstanden, was „Ziel angeben” bedeutet. Vielleicht kann mir KodeZwerg das noch erklären?

Ich verstehe die Frage nicht ganz. "Ziel angeben" kommt nirgendwo vor im Quelltext.
Mein Quelltext angewandt auf einem Formular Handle macht was du wolltest, das Formular (inklusive TButton) zeigt den AccelChar.
Ich wäre auch ein Gegner davon Systemeinstellungen einfach so zu ändern aber es ist ja nur für Dich.

Es ist besser du kopierst betreffende Zeile und ich erkläre sie Dir gerne.

(Mein Quelltext verändert nichts, er simuliert lediglich das drücken der Alt Taste gefolgt von einer Escape Taste.)

OsCor 23. Jan 2022 17:25

AW: TButton und ShowAccelChar
 
In Beitrag #17 hast du geschrieben
Zitat:

die obige methode etwas überarbeitet so das nun auch ein Ziel angegeben werden kann.
Das hat mich irritiert, weil ich es nicht zuordnen kann.

Gruß
Oswald

KodeZwerg 23. Jan 2022 17:34

AW: TButton und ShowAccelChar
 
Okay, hier die Auflösung zu Deiner Frage, wie du in diesem Quelltext teil sehen kannst wird eine Methode aufgerufen.

Zitat:

Zitat von KodeZwerg (Beitrag 1500985)
Delphi-Quellcode:
procedure TForm19.FormCreate(Sender: TObject);
begin
//  Self.BringToFront;
  SendVK(Handle, VK_LMENU);
  SendVK(Handle, VK_LMENU, False);
  SendVK(Handle, VK_ESCAPE);
  SendVK(Handle, VK_ESCAPE, False);
end;

Dieser Methode habe ich beigebracht mehr aufzupassen indem man das "TargetWindow", also ein Handle von einem Fenster, mit liefern muss damit hoffentlich alles gut funktioniert.
Falls Du Dich fragst warum jeder VK_KeyCode zweimal gesendet wird in diesem Schnippsel, beim ersten mal wird entsprechende Taste gedrückt und beim zweiten mal wieder losgelassen.

In version 1 die ich hier reingestellt hatte, da gab es noch keine Prüfungen weswegen himitsu was schrieb und ich es überarbeitet hatte.

OsCor 23. Jan 2022 18:22

AW: TButton und ShowAccelChar
 
Ok, jetzt habe ich das verstanden. Es ist schon sehr lange her, seit ich im Rahmen der Darstellung von vertikaler Schrift mit Handles zu tun hatte.

Danke
Oswald


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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