Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringGrid - Zelle wie mit zweifachem Mausklick selektieren (https://www.delphipraxis.net/148227-tstringgrid-zelle-wie-mit-zweifachem-mausklick-selektieren.html)

HolgerCW 25. Feb 2010 10:41


TStringGrid - Zelle wie mit zweifachem Mausklick selektieren
 
Hallo zusammen,

ich habe ein TStringGrid.

Wenn ich mit der Pfeiltaste nach oben oder unter navigiere ist die entsprechende Zelle gestrichelt umrahmt.

Wenn ich nun mit der Maus auf die Zelle klicke ist der Inhalt markiert. Wenn ich nochmal mit der Maus klicke ist der Cursor zu sehen.

Wie kann ich diese beiden Mausklicks programmiertechnisch nachbauen, so das man nicht die Maus benutzen muss.

Ich habe mir vorgestellt, wenn man z.B. Strg drückt dies dann ausgelöst (OnKeyPress) wird.

Gruss

Holger

s-off 25. Feb 2010 14:45

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Wenn Du erreichen möchtest, dass nach der Aktivierung des Editors der Inhalt nicht markiert ist, dann drück doch mal F2, nachdem Du Deine Zelle selektiert hast.

HolgerCW 25. Feb 2010 15:03

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
So habe ich es nun auch gelöst.

Ich löse F2 aus, nachdem die oben oder unten Pfeiltaste gedrückt wird.

Delphi-Quellcode:
procedure TForm1.STG1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin

 If Key = 113 then exit;

 if (Key = VK_UP) OR (Key = VK_DOWN) then
 begin

  keybd_event(113,0,0,0);

 end;
 
end;
Dachte nur da gibt es eine besser Lösung ?

Gruss

Holger

s-off 25. Feb 2010 15:28

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Du kannst auch hier natürlich wieder auf den InplaceEditor zugreifen, und dann mit
Delphi-Quellcode:
SelLength := 0;
die Markierung aufheben.
Mir ist noch nicht ganz klar, was Du überhaupt erreichen möchtest. Wenn Du beim Drücken der Pfeiltaste gleich in den Editmodus schaltest, kannst Du mit den Pfeiltasten ja nicht mehr navigieren.

HolgerCW 26. Feb 2010 07:11

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Hi,

mit

Delphi-Quellcode:
SelLength := 0;
kann ich leider nicht die Markierung aufheben.

Was ich damit erreichen will:

Ein Anwender wollte alle Eingaben ausschliesslich mit der Tastatur machen, ohne die Maus benutzen zu müssen.

Er hatte dadurch immer das Problem, das er nach dem Navigieren keine Möglichkeit hatte, den Wert in der Zelle zu verändern, ohne Ihn vorher zu löschen.

Nun habe ich hier erfahren, das es mit "F2" möglich ist in den Editormodus zu schalten. Da habe ich diese Möglichkeit direkt in das Navigieren mit eingebaut.

Es ist auch ohne Probleme möglich aus dem Editormodus weiter zu navigieren.

Hier mal mein kompletter Code:

Delphi-Quellcode:
procedure TForm1.STG1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin

 If Key = 113 then exit;

 if (Key = VK_UP) OR (Key = VK_DOWN) then
 begin

  keybd_event(113,0,0,0);

 end;

 if (Key = VK_RIGHT) then
 begin

  If TMyStringGrid(STG1).InplaceEditor.SelStart = 6 then //Erst nach der 6 Zahl in die nächste Spalte springen
  begin

   STG1.col := STG1.col + 1;
   keybd_event(113,0,0,0);

  end;

 end;

 if (Key = VK_LEFT) then
 begin

  If TMyStringGrid(STG1).InplaceEditor.SelStart = 0 then //Erst an der vordersten Stelle in die vorherige Spalte springen
  begin

   STG1.col := STG1.col - 1;
   keybd_event(113,0,0,0);

  end;

 end;

 if (Key = 46) then //Taste Entfernen
 begin

  Form1.BB_entfClick(Sender);
  keybd_event(113,0,0,0);

 end;

end;
Zusätzlich wird durch die Taste "Return" einen neue Zeile freigeschaltet (RowCount + 1), bzw. in die nächste Zeile gesprungen.

Delphi-Quellcode:
procedure TForm1.STG1KeyPress(Sender: TObject;
  var Key: Char);
begin

 if Key = #13 then //Return
 begin

  If STG1.RowCount - 1 = STG1.Row then
  begin

   STG1.RowCount := STG1.RowCount + 1;
   STG1.Col := 1;
   STG1.Row := STG1.RowCount - 1;
   STG1.cells[1,STG1.Row] := '';
   STG1.cells[2,STG1.Row] := '';
   STG1.cells[3,STG1.Row] := '';
   STG1.cells[4,STG1.Row] := '';
   STG1.cells[5,STG1.Row] := '';
   STG1.cells[6,STG1.Row] := '';

  end
  else
  begin

   STG1.Col := 1;
   STG1.Row := STG1.Row + 1;

  end;

 end;

end;
Gruss

Holger

xZise 26. Feb 2010 08:09

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Moin,
bei der Methode STG1KeyDown solltest if-elseif-else verwenden ;) Und warum lässt du jetzt das editieren mit F2 nicht mehr zu? Lass das doch drin, dann kann auch der normale Benutzer damit besser klar kommen, der halt standardmäßig F2 benutzt um was zu editieren.

MfG
Fabian

DeddyH 26. Feb 2010 08:14

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Zitat:

Zitat von xZise
Moin,
bei der Methode STG1KeyDown solltest if-elseif-else verwenden ;)

Oder gleich case ;)

s-off 26. Feb 2010 08:26

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Das Simulieren von F2 ist für Deinen Zweck in der Tat etwas - naja ;)

Im Prinzip hat der Nutzer mehrere Möglichkeiten. Zwei davon wären:

1. Mittels ENTER in den Editmodus schalten und die Markierung mittels der Pfeiltasten aufheben oder den bestehenden Wert mittels einfachem Losschreiben löschen.
2. Mittels F2 in den Editmodus schalten und dabei gleich die Markierung aufheben.

Das sind beides Standardroutinen, die man kennen sollte. Alles andere verschlimmbessert die Usability meiner Meinung nach nur.

xZise 26. Feb 2010 08:37

Re: TStringGrid - Zelle wie mit zweifachem Mausklick selekti
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von xZise
Moin,
bei der Methode STG1KeyDown solltest if-elseif-else verwenden ;)

Oder gleich case ;)

Stimmt, da bietet sich ein case wirklich sehr an! ;)

MfG
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz