Navigation in Datasets per Tasten (Shortcuts)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Navigation in Datasets per Tasten (Shortcuts)

Beitrag von sierdolg »

Liebe Expertengemeinde,

auf einem kleinen Frontend für eine Datenbank befinden sich auf zahlreichen PairSlitterSides DBGroupBoxes, DBGrids usw., die jeweils zu einer Tabelle bzw. einer Abfrage gehören.

Dazu wäre der Wunsch, in den jeweiligen DataSets "blättern" zu können, d.h. zumindest einige Funktionen des jeweils zuständigen Datensatznavigators (First, Next, Last, Post, Next, Last etc.) auch via Tastatur bedienen zu können.
Das naheliegendste, nämlich die Buttons direkt im Navigator mit Shortcuts versehen zu können, scheint es nicht zu geben (oder hab ich was übersehen?).

Nun habe ich einige sehr vage Ideen, wie man das durch OnKeyPress bzw. OnKeyDown erreichen könnte, allerdings ist mir klar, daß man damit wahrscheinlich beliebig unübersichtlich werden kann. Soweit ich finden konnte, kann man das Auswerteverhalten der Tastenanschläge nur formularweit ändern (KeyPreview), nicht "kaskadiert" auf dem Level des Objektbaums, unter dem sich alle zusammengehörigen Datenbanksteuerelemente befinden.

Da das ganze Vorhaben für Programme mit Datenbankanbindung aber eine Standardsituation ist, nehme ich an, es gibt wohl doch eine Standardlösung, die ich nur noch nicht entdeckt habe. Und da ich weder auf den soliden Hintergrund (kein gelernter Programmierer oder gar Informatiker) noch auf tägliche Training wie viele von Euch hier habe (komme nur alle paar Monate mal zu einer Kleinigkeit) zurückgreifen kann, würde ich den Rat der Profis sehr schätzen!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Navigation in Datasets per Tasten (Shortcuts)

Beitrag von mse »

MSEgui bietet die entsprechende Funktionalität. Lazarus macht etwas ähnliches mit Actions:
http://forum.lazarus.freepascal.org/ind ... ic=25140.0
http://forum.lazarus.freepascal.org/ind ... 072.0.html

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: Navigation in Datasets per Tasten (Shortcuts)

Beitrag von sierdolg »

Danke für den Tip zu den ActionLists, allerdings kommt mir das für meine Zwecke auch relativ kompliziert vor.

Momentan halte ich den Ansatz noch für am übersichtlichsten, an einer zentralen Stelle (FormKeyDown) die relevanten Tasten zu überwachen und, falls es sich um ein Datenbanksteuerelement handelt, von hier aus die entsprechenden Navigationsvorgänge auszulösen. Der Minimalansatz:

Code: Alles auswählen

 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if Key in [VK_PRIOR,VK_NEXT] then begin //relevante Taste gedrückt
      if LeftStr(Screen.ActiveControl.ClassName,3)='TDB' Then // auf einem DB-Steuerelement
        StatusBar1.Panels[0].Text:=StatusBar1.Panels[0].Text
      +IntToStr(Key)+' '+Screen.ActiveControl.Name;
  end;
end;
 


gibt schon mal den Namen des DB-Steuerelements aus, das gerade den Fokus hat.
Jetzt müßte man aber noch herausfinden, an welche DataSource es gebunden ist. Ist das möglich?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Navigation in Datasets per Tasten (Shortcuts)

Beitrag von mse »

Du könntest nach der Published Property "DataSource" suchen.

Code: Alles auswählen

 
Function GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds): PPropInfo;
Function  GetObjectProp(Instance: TObject; PropInfo: PPropInfo; MinClass: TClass): TObject;
 

aus unit typinfo.

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: Navigation in Datasets per Tasten (Shortcuts)

Beitrag von sierdolg »

Das war's, was ich gesucht hatte - vielen Dank!

Code: Alles auswählen

procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
var
  oP: TObject;
  oDs: TDataSource;
begin
  if Key in [VK_PRIOR, VK_NEXT, VK_R, VK_S] then
  begin //relevante Taste gedrückt
    if LeftStr(Screen.ActiveControl.ClassName, 3) = 'TDB' then
    begin// es ist ein DB-Steuerelement
      oP := GetObjectProp(Form1.FindComponent(Screen.ActiveControl.Name), 'DataSource');
      if oP <> nil then //DataSource gefunden
      begin
        oDS := TDataSource(oP);
        if Shift = [] then
          case Key of
            VK_PRIOR: oDS.DataSet.Prior;
            VK_NEXT: oDS.DataSet.Next;
          end;
        if Shift = [ssCtrl] then
          case Key of
            VK_PRIOR: oDS.DataSet.First;
            VK_NEXT: oDS.DataSet.Last;
            VK_R: oDS.DataSet.Refresh;
            VK_S: oDS.DataSet.Post;
          end;
      end;
    end;
  end;
end;   

Antworten