Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DBGrid und MultiSelect (https://www.delphipraxis.net/92218-dbgrid-und-multiselect.html)

Rolf.Blessing 16. Mai 2007 10:05


DBGrid und MultiSelect
 
Ich möchte gerne in einem DBGrid mehrere Zeilen markieren - also multiselect - und dabei aber auschliesslich die Tastatur benutzen. Kein SHIFT-Pfeil oder STRG-Maus !
Mein Wunsch wäre:
Mit den Pfeiltasten durch ein DBGrid zu wandern und mittels RETURN die gewünschten Zeilen auswählen.
Habt ihr eine Idee oder einen Ansatz ?

uwewo 16. Mai 2007 10:42

Re: DBGrid und MultiSelect
 
Ansatz genug?

Delphi-Quellcode:
procedure TForm.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
   if key= chr(13) then DbGrid.SelectedRows.CurrentRowSelected := True;
end;

s-off 16. Mai 2007 10:48

Re: DBGrid und MultiSelect
 
Hi,

probier ess mal so:

Delphi-Quellcode:
Procedure TForm1.DBGrid1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
Begin
   If Key = VK_RETURN Then
      DBGrid1.SelectedRows.CurrentRowSelected := True

   Else If Key = VK_DOWN Then Begin
      DBGrid1.DataSource.DataSet.MoveBy(1);
      Key := 0;
   End

   Else If Key = VK_UP Then Begin
      DBGrid1.DataSource.DataSet.MoveBy(-1);
      Key := 0;
   End;
End;
Edit: @Uwe - Der Ansatz ist schon ok, nur die Problematik sind wohl die Cursortasten ;o)

uwewo 16. Mai 2007 10:54

Re: DBGrid und MultiSelect
 
Zitat:

Zitat von s-off
Edit: @Uwe - Der Ansatz ist schon ok, nur die Problematik sind wohl die Cursortasten ;o)

Wieso? Diese werden doch völlig ignoriert und tun ihre gewohnte Arbeit.
Delphi-Quellcode:
if key= chr(13)
bedeutet nur bei <ENTER>

s-off 16. Mai 2007 10:58

Re: DBGrid und MultiSelect
 
Ja, genau - sie tun Ihre gewohnte Arbeit.

Und die besteht darin, dass DataSet.NextRow aufgerufen wird, was die vorher gesetzte Markierung wieder entfernt.
Dieses muss halt unterbunden und statt dessen mit einer anderen Funktion belegt werden, beispielsweise der, die im MouseWheelUp/Down Event stattfindet, nämlich MoveBy.

uwewo 16. Mai 2007 11:10

Re: DBGrid und MultiSelect
 
@s-off

Delphi-Quellcode:
DBGrid1.SelectedRows.CurrentRowSelected
Nimmt trotzdem den Datensatz in die Bookmarkliste auf.

Mit
Delphi-Quellcode:
DBGrid1.DataSource.DataSet.MoveBy(1);
machst Du auch nur den nächsten Datensatz zum aktiven, sowie die Cursor Tasten.

Rolf.Blessing 16. Mai 2007 11:28

Re: DBGrid und MultiSelect
 
Hallo s-off,

herzlichen Dank für die perfekte Lösung !
Das Entscheidende war das Abschalten der Pfeiltasten (MoveBy).

Endlich Grids ohne die Maus verwenden zu müssen. Danke !!!

Rolf.Blessing 16. Mai 2007 11:39

Re: DBGrid und MultiSelect
 
Ich habe abschliessend noch den Fall der Rückmahme einer Markierung aufgenommen:

Delphi-Quellcode:
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if ( Key = VK_RETURN ) then
      if ( DBGrid1.SelectedRows.CurrentRowSelected = False ) then
         DBGrid1.SelectedRows.CurrentRowSelected := True
      else
         DBGrid1.SelectedRows.CurrentRowSelected := False

   else
   if ( Key = VK_DOWN ) then
   begin
      DBGrid1.DataSource.DataSet.MoveBy(1);
      Key := 0;
   end

   else
   if ( Key = VK_UP ) then
   begin
      DBGrid1.DataSource.DataSet.MoveBy(-1);
      Key := 0;
   end;
end;

s-off 16. Mai 2007 12:25

Re: DBGrid und MultiSelect
 
Uwe,

ich glaube, wir reden aneinandeer vorbei.

Es steht ausser Frage, dass CurrentRowSelected := True die aktuelle Zeile in die Bookmarkliste aufnimmt.
Wenn Du anschliessend aber mit den Cursortasten auf/ab durch das Grid navigierst, gehen die Markierungen wieder verloren; und genau das ist das Problem, welches aber durch das überschreiben dieser Anweisung mit Key := 0 aus der Welt geschafft wird.

Wenn Du das, worum es hier geht, einmal ausprobieren würdest, dann wüsstest Du, was ich meine.

Und wie Rolf angemerkt hat, ist dieses genau das Ergebnis, das er erzielen wollte.
'CurrentRowSelected' ist ihm, das entnehme ich jedenfalls seiner Aussage, wohl schon selber eingefallen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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-2025 by Thomas Breitkreuz