Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Stringgrid: Scroll-Focus entfernen (https://www.delphipraxis.net/200487-stringgrid-scroll-focus-entfernen.html)

Int3g3r 25. Apr 2019 11:18

Stringgrid: Scroll-Focus entfernen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag,

Ich möchte im Stringgrid eine Zelle komplett "Deselektieren".
Code:
StringGrid1.Selection := NoSelection ;
Führt leider nicht zum gewünschten Erfolg. Dieser entfernt nur die "Markierung", die Zelle ist aber immer noch selektiert (Bild).

Da das StringGrid kein "OnCellClick" Event verfügt muss ich das "SelectCell" Event verwenden.
Sobald nun aber der user im Grid scrollt wird nun mein "SelectCell" Event ausgelöst was nicht passieren darf.
Im Prinzip muss sich die letzte Coloum wie eine Checkbox verhalten. Wenn man Klickt wird der Wert darin verändert. Aber nicht beim Scrollen.

Delphi-Quellcode:
procedure TfrmCSV.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
const
      NoSelection : TGridRect = (Left: -1; Top: -1; Right: -1; Bottom: -1);
begin
      if ACol = StringGrid1.ColCount-1 then
    begin
       if StringGrid1.Cells[ACol,ARow] = 'Nein' then
       begin
         StringGrid1.Cells[ACol,ARow] := 'Ja';
       end
       else
       begin
         StringGrid1.Cells[ACol,ARow] := 'Nein';
       end;
    end;
    StringGrid1.Selection := NoSelection ;
end;
Wie lässt sich dies bewerkstelligen ?

Mfg Int3g3r

hoika 25. Apr 2019 13:30

AW: Stringgrid: Scroll-Focus entfernen
 
Hallo,
fang doch erst mal vorn an.

Zitat:

Da das StringGrid kein "OnCellClick" Event verfügt muss ich das "SelectCell" Event verwenden.
Was soll denn bei einem "OnCellClick" passieren?
Es gibt ja KeyDown und MouseDown bzw. -Up.

Dieser Murks mit dem Mißbrauchen des SelectCell habe ich manchmal auch, das gibt bei mir immer Ärger.

Int3g3r 25. Apr 2019 13:44

AW: Stringgrid: Scroll-Focus entfernen
 
Zitat:

Zitat von hoika (Beitrag 1430948)
Hallo,
fang doch erst mal vorn an.

Zitat:

Da das StringGrid kein "OnCellClick" Event verfügt muss ich das "SelectCell" Event verwenden.
Was soll denn bei einem "OnCellClick" passieren?
Es gibt ja KeyDown und MouseDown bzw. -Up.

Dieser Murks mit dem Mißbrauchen des SelectCell habe ich manchmal auch, das gibt bei mir immer Ärger.

Das was oben im Code steht muss passieren.
Also beim klicken auf die Zelle soll darin "Ja" eingetragen werden.
Beim erneuten klicken soll "Nein" eingetragen werden.

Wie du oben siehst brauche ich irgendwoher die Information welche Zelle angeklickt wurde um das "Ja/Nein"
in die richtige Zelle einzutragen.

Das wäre schon alles.

EDIT:

Habe ne Lösung gefunden durch deinen Tipp.
Ich wusste nicht das eine procedure existiert die X,Y Koordinaten in eine Col/Row umwandeln kann.
Code:
StringGrid1.MouseToCell(X,Y, Col,Row);
Kann mir jemand erklären wie man folgendes Konstrukt nennt ?
Code:
procedure MouseToCell(X: Integer; Y: Integer; var ACol: Longint; var ARow: Longint);
Dies ist doch im prinzip eine procedure die mehrere Werte zurückgibt, oder nicht ?
1. ) Eine Procedure hat per definition keinen Rückgabewert
2. ) Eine Funktion hingegen hat nur einen Rückgabewert.

Dies irritiert mich ein wenig.

Besten Dank!
Int3g3r

hoika 25. Apr 2019 15:13

AW: Stringgrid: Scroll-Focus entfernen
 
Hallo,
eine Prozedur hat keinen Rückgabewert, kann aber Rückgabeparameter (Referenzparameter) haben.


function Foo1(S: String): Integer;
S: Parameter
: Integer = Rückgabewert der Funktion

procedure Proc1(S: String);
S: Parameter

procedure Proc2(S: String; var X: Integer);
S: Parameter - Wertparameter
X: Parameter - Referenzparameter
Wird X in der Prozedur verändert, ändert sich auch der Wert der Variable das Aufrufers

procedure Proc2(S: String; var X: Integer; Y: Integer);
S: Parameter
X: Parameter
Y: Parameter = Referenzparameter
Wird X in der Prozedur verändert, ändert sich auch die Variable das Aufrufers
Wird Y in der Prozedur verändert, ändert sich die Variable das Aufrufers NICHT

Das var kann man sich wie einen Pointer (eine Referenz) auf die eigentliche Variable beim Aufrufer vorstellen, der an die Prozedur übergeben wird.

http://bergt.de/workshop/delphi/html/delphi39.htm

Int3g3r 26. Apr 2019 07:35

AW: Stringgrid: Scroll-Focus entfernen
 
Zitat:

Zitat von hoika (Beitrag 1430953)
procedure Proc2(S: String; var X: Integer; Y: Integer);
S: Parameter
X: Parameter
Y: Parameter = Referenzparameter
Wird X in der Prozedur verändert, ändert sich auch die Variable das Aufrufers
Wird Y in der Prozedur verändert, ändert sich die Variable das Aufrufers NICHT

Das var kann man sich wie einen Pointer (eine Referenz) auf die eigentliche Variable beim Aufrufer vorstellen, der an die Prozedur übergeben wird.

http://bergt.de/workshop/delphi/html/delphi39.htm

"s,y" sind normale übergabeparameter
Die "var x" existiert dort wo sie aufgerufen wird:
Delphi-Quellcode:
procedure btnCSVClick(Sender: TObject);
var Zahl1: integer;
   begin
          proc2(test, zahl1, zahl2 );
   end;
Somit wird beim aufruf eine druch die Variable "X" eine Referenz auf Zahl1 mitgegeben ?

Wäre dann folgendes zulässig ?
Delphi-Quellcode:
procedure btnCSVClick(Sender: TObject);
var Zahl1: integer;
    X: integer; //X wird ja bereits in der proc2 als variable verwendet
   begin
          proc2(test, zahl1, zahl2 );
   end;
Danke für die Hilfe,

Int3g3r

hoika 26. Apr 2019 07:48

AW: Stringgrid: Scroll-Focus entfernen
 
Hallo,
nein, ist nicht richtig.

Delphi-Quellcode:
procedure proc2(s: String; var x: Integer);
begin
  if s='' then
  begin
    // diverser Code1
    x:= 1;  
  end
  else
  begin
    // diverser Code2
    x:= 2;  
  end;
end;

procedure proc1;
var
  s: String;
  x: Integer;
begin
  s:= 'Test';
  x:= 10;
  proc2(s,x);

     x ist ? -> 2, weil in proc2 ja steht
     // diverser Code2
     x:= 2;  
 
  s:= '';
  proc2(s,x);

     x ist ? -> 1, weil in proc2 ja steht
     // diverser Code1
     x:= 1;  
end;
Aber nu kommst !

Delphi-Quellcode:
procedure proc2(Max: String; var Moritz: Integer);
begin
  if Max='' then
  begin
    // diverser Code1
    Moritz:= 1;  
  end
  else
  begin
    // diverser Code2
    Moritz:= 2;  
  end;
end;

procedure proc1;
var
  s: String;
  x: Integer;
begin
  s:= 'Test';
  x:= 10;
  proc2(s,x);

     x ist ? -> 2, weil in proc2 ja steht
     // diverser Code2
     Moritz:= 2;  
 
  s:= '';
  proc2(s,x);

     x ist ? -> 1, weil in proc2 ja steht
     // diverser Code1
     Moritz:= 1;  
end;
Die in proc1 definierte Variable x hat nichts mit dem Parameter x in proc2 zu tun!
Das war im Bsp. 1 einer Zufall. OK, war Absicht ;)

In den Delphi-Quellen wird deshalb bei Parameter immer ein A vorangestellt (ARow).
Das dient einer besseren optischen Unterscheidung zwischen Parametern und Variablen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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