Shortcuts im Programm

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Antworten
reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Shortcuts im Programm

Beitrag von reiter »

Hallo,
Ich hab da mal eine Frage..
Ich möchte mit öffnen des Programms gewisse Shortcuts aktivieren

Vorweg
wenn ich ein KeyDown definiere funktioniert das soweit. also ich kann mit einem Shortcut z.b. eine checkbox aktivieren.
wenn ich aber die selbe Tastenkompination erneut drücke hätte ich gern das sie sich wieder deaktiviert wird
das funktioniert nicht
kann mir da jemand helfen ? wie ich ein Event auslösen kann und mit nochmaligen Druck der selben Tastenkompination das wieder deaktivieren kann?
hab da schnell mal was zusammen geclickt

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    CheckBox1: TCheckBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure CheckBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private

  public

  end;

var
  Form1: TForm1;
  key: Word;
  Shift: TShiftState;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if bitbtn1.Enabled=true then checkbox1.Checked:=false;
end;

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  if checkbox1.Checked then
  bitbtn1.Enabled:=true;
  if checkbox1.Checked=false then
  bitbtn1.Enabled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
  bitbtn1.Enabled:=false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
             if ((ssMeta in Shift) and (ssAlt in Shift) and (Key = 69)) then               // key = 65 - Taste 'A'
                                                                                                                                  // key = 69 - Taste 'E'
    checkbox1.Checked:=true;                                                                           // (ssMeta in Shift ) steht für die CMD Taste beim MAC
end;

end.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Shortcuts im Programm

Beitrag von Winni »

Hi!

Definier für jeden Shortcut eine boolsche Variable als private.

Dann machst Du im KeyDown:

Code: Alles auswählen

MyBool := not MyBool;
if MyBool then .....
   else ......

Winni

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Shortcuts im Programm

Beitrag von Ally »

oder

Code: Alles auswählen

checkbox1.Checked := not checkbox1.Checked;

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Shortcuts im Programm

Beitrag von wennerer »

Hallo Andy,
wenn du hin und her schalten willst musst du das mit if ... then ... else... machen.
Hab dein Beispiel mal ein bißchen umgestellt:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    CheckBox1: TCheckBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure CheckBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private

  public

  end;

var
  Form1: TForm1;
  key: Word;
  Shift: TShiftState;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if bitbtn1.Caption='Drück mich' then bitbtn1.Caption:='Drück mich nochmal'
  else
  bitbtn1.Caption:='Drück mich';
end;

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  {if checkbox1.Checked then
  bitbtn1.Enabled:=true;
  if checkbox1.Checked=false then
  bitbtn1.Enabled:=false; }
  if checkbox1.Checked then bitbtn1.Enabled:=true
  else
  bitbtn1.Enabled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
  bitbtn1.Enabled:=false;
  self.KeyPreview:= true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
 { if ((ssMeta in Shift) and (ssAlt in Shift) and (Key = 69)) then     // key = 65 - Taste 'A'
  checkbox1.Checked:=true;  // (ssMeta in Shift ) steht für die CMD Taste beim MAC  key = 69 - Taste 'E'
  }
  if (ssAlt in Shift) and (Key = Ord('A')) then
  begin
   if bitbtn1.Enabled = false then bitbtn1.Enabled:=true
   else
   bitbtn1.Enabled:=false;
  end;
end;

end.

Viele Grüße
Bernd
Dateianhänge
IfThenElse.zip
(125.68 KiB) 119-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Shortcuts im Programm

Beitrag von Winni »

Hi!

Kann man auch weniger umständlich machen:

Code: Alles auswählen

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  bitbtn1.Enabled := checkbox1.Checked;
end;
Es lebe kurzer code!

Winni

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Shortcuts im Programm

Beitrag von wennerer »

@ Winni: so hab ich es noch nicht gemacht. Cool :D .
Wieder was gelernt.

Gruß
Bernd

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: Shortcuts im Programm

Beitrag von reiter »

Danke Bernd und winni für die Antworten, schau ich mir nachher wenn ich wieder am PC bin gleich an
Das heißt ,
Wenn man mehrere Shortcuts definieren will , müssen die alle in die Procedure Form1.FormKeyDown........ wenn man die unabhängig von Komponenten deklarieren will ?

Gruß
Andy

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Shortcuts im Programm

Beitrag von wennerer »

Hallo Andy,
ShortCuts kann man auch relativ einfach mit einer TActionList machen.

- eine TActionList auf die Form ziehen (in Standard ganz rechts)
- auf die Actionlist in der Form doppelklicken
- auf das Pluszeichen klicken, jetzt wird eine Aktion hinzugefügt
- eventuell im Oi unter Name einen geeigneten Namen eingeben
- jetzt im OI auf ShortCut die drei ... anklicken
- jetzt einen ShortCut eingeben (mit Taste fangen, hier muss man nur die Tasten drücken)
- jetzt im OI auf Ereignisse und in onexecute doppelklicken
- in der Execute Procedure die gewünschte Aktion auslösen (z.Bsp Button1Click(nil))

Jetzt wird mit dem eingegebenen ShortCut die gewünschte Aktion ausgelöst.

Bildschirmfoto.png
Bildschirmfoto.png (182.81 KiB) 3426 mal betrachtet
Quelle:
https://forum.lazarus.freepascal.org/in ... ic=12709.0
https://wiki.freepascal.org/TActionList

In meinem Mini Beispiel verwende ich Strg+A und Strg+B.

Viele Grüße
Bernd
Dateianhänge
Mit_Actionlist.zip
(125.57 KiB) 106-mal heruntergeladen

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: Shortcuts im Programm

Beitrag von reiter »

Hallo Bernd,
danke..
wieder was gelernt.
Die TActionList hatte ich noch garnicht auf den Plan...
da kann man ja genug Shortcuts anlegen und dann in die Form1.FormKeyDown legen

PS: in dem Beispiel von if-then-else oben funktioniert das zwar aber die checkbox wird nicht aktiv dabei

danke
Andy
Zuletzt geändert von reiter am Sa 29. Aug 2020, 21:03, insgesamt 1-mal geändert.

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Shortcuts im Programm

Beitrag von wennerer »

Hallo Andy,
Keydown benötigst du da nicht mehr. Schau dir in Ruhe mal das kleine Beispiel an.

Viele Grüße
Bernd

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: Shortcuts im Programm

Beitrag von reiter »

ah gut, da wird jeden Shortcut ne eigene Procedur zugewiesen
da hätte ich aber wieder das Problem mit dem nochmaligen drücken des Shortcuts z.b. mit der checkbox ,oder einen Button aktiv zu schalten und wieder zu deaktivieren in Verbindung mit ner checkbox

ich schau mir das mal in Ruhe an

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Shortcuts im Programm

Beitrag von Winni »

Hi!

Nichts dagegen , jemandem die Actionlist zu erklären,
aber das ist doch ein bischen mit Kanonen auf Spatzen schießen .

Mal ganz einfach:

Eine Form, ein Panel, ein Label.
KeyPreview der Form auf true setzen.
Keydown der Form mit folgender Procedure verbinden :

Reagiert auf ALT-A, ALT-B, ALT-C

Code: Alles auswählen

var MyBool: Boolean = true;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState );
begin
 if (ssalt in Shift) then
   begin
    case key of
      VK_A: Panel1.visible := not Panel1.visible; 
      VK_B: If Label1.Font.Color = clRed Then Label1.Font.Color := clBlue else Label1.Font.Color:= clRed;
      VK_C: begin
                  myBool := NOT MyBool;
                   if myBool then  showMessage ('True')
                            else showMessage ('False');
                 end; // VK_C
      end; // case
      end; // ssalt
end;
Viel Spaß!

Winni

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: Shortcuts im Programm

Beitrag von reiter »

Danke winni für dein Beispiel
wenn man wie ich mal 2,3 Shortcuts vergeben will ist das ne feine Sache
Trotzdem finde ich das mit der ActionList super
wenn man sagen wir 10-20 ShortCuts verwenden will ist das sicher angenehmer mit ner ActionList zu programmieren.
die ich eigentlich so nicht auf dem Plan hatte.. darum wieder was dazu gelernt

danke euch beiden

gruss
andy

Antworten