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!
Navigation in Datasets per Tasten (Shortcuts)
-
- 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)
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
http://forum.lazarus.freepascal.org/ind ... ic=25140.0
http://forum.lazarus.freepascal.org/ind ... 072.0.html
Re: Navigation in Datasets per Tasten (Shortcuts)
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:
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?
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;
Jetzt müßte man aber noch herausfinden, an welche DataSource es gebunden ist. Ist das möglich?
-
- 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)
Du könntest nach der Published Property "DataSource" suchen.
aus unit typinfo.
Code: Alles auswählen
Function GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds): PPropInfo;
Function GetObjectProp(Instance: TObject; PropInfo: PPropInfo; MinClass: TClass): TObject;
Re: Navigation in Datasets per Tasten (Shortcuts)
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;