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/)
-   -   Delphi im Stringgrid Zellen total sperren (https://www.delphipraxis.net/33983-im-stringgrid-zellen-total-sperren.html)

Hansa 15. Nov 2004 20:49


im Stringgrid Zellen total sperren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

in einem StringGrid muß ich verhindern, daß mit der Maus auf Zellen, die nicht mehr verändert werden sollen, zugegriffen wird. Die Tastatur habe ich hierfür voll im Griff, aber mit der Maus könnte noch Unheil angerichtet werden, indem Zellen angeklickt werden, die nicht mehr editiert werden sollen.

Ich kann es am besten anhand des angehängten Screenshots erklären :

das rot eingekreiste "a" ist der momentane Standort des Cursors. Sofern das Grid so aussieht, sollen die grün umrandeten Zellen oben nicht mehr editiert werden können. Am besten wäre es, gar nicht mehr zuzulassen, daß eine der grünen Zellen überhaupt selektiert werden kann.

Aber irgendwie gelingt mir das nicht vollständig. Das Hauptproblem liegt wohl darin, daß ich nicht weiß, wo Col und Row zugeswiesen werden, um dann gezielt zu reagieren. Wie mache ich das am besten ?

Union 15. Nov 2004 21:08

Re: im Stringgrid Zellen total sperren
 
Zitat:

Zitat von Hansa
Hi,

in einem StringGrid muß ich verhindern, daß mit der Maus auf Zellen, die nicht mehr verändert werden sollen, zugegriffen wird. Die Tastatur habe ich hierfür voll im Griff, aber mit der Maus könnte noch Unheil angerichtet werden, indem Zellen angeklickt werden, die nicht mehr editiert werden sollen.

Ich kann es am besten anhand des angehängten Screenshots erklären :

das rot eingekreiste "a" ist der momentane Standort des Cursors. Sofern das Grid so aussieht, sollen die grün umrandeten Zellen oben nicht mehr editiert werden können. Am besten wäre es, gar nicht mehr zuzulassen, daß eine der grünen Zellen überhaupt selektiert werden kann.

Aber irgendwie gelingt mir das nicht vollständig. Das Hauptproblem liegt wohl darin, daß ich nicht weiß, wo Col und Row zugeswiesen werden, um dann gezielt zu reagieren. Wie mache ich das am besten ?

Hi Hansa,

so gehts:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    function IsRowComplete(ARow : integer) : boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.IsRowComplete(ARow: integer): boolean;
var
   iCol : integer;
begin
   result := true;
   for iCol := StringGrid1.FixedCols to StringGrid1.ColCount-1 do
   begin
      if trim(StringGrid1.Cells[iCol, ARow]) = '' then
      begin
         result := false;
         break;
      end;
   end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   // Wenn reihe komplett ausgefüllt ist, nicht mehr
   // anwählen lassen
   Canselect := not IsRowComplete(ARow)
end;

end.

Hansa 16. Nov 2004 19:39

Re: im Stringgrid Zellen total sperren
 
Ich habe Unions Beispiel etwas umgebaut, aber ich steh anscheinend mit dem OnSelectCell auf Kriegsfuß. :shock:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    AktRow : integer;
    function ZelleZulaessig(ACol,ARow: integer): boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses hauptmod;

{$R *.dfm}

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #13) then begin
    if StringGrid1.Col = 1 then
      StringGrid1.Col := 4
    else begin
      StringGrid1.Col := 1;
      StringGrid1.RowCount := StringGrid1.RowCount + 1;
      StringGrid1.Row := StringGrid1.Row + 1;
    end
  end;
end;

function TForm1.ZelleZulaessig (ACol,ARow: integer): boolean;
var z : boolean;
begin
  z := false;
  if ACol in [1,4] then with StringGrid1 do begin
    z := AktRow = ARow; // zumindest mal die richtige Zeile !
    if z then begin     // jetzt kommt Spalte dran
      if ACol = 1 then begin
        z := Trim (Cells[ACol,ARow]) = '';
      end;
    end;
  end;
  ZelleZulaessig := z;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   if AktRow < ARow then
     AktRow := ARow;
   Canselect := ZelleZulaessig(ACol,ARow);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  AktRow := 0;
end;

end.
Ist eine Zeile gefüllt, so kann sie jetzt nicht mehr selektiert werden. Das gilt auch für die Spalten 2 und 3 von insges. 4, egal in welcher Zeile. Nun ist noch folgendes : Spalte 4 darf nur selektiert werden, sofern in Spalte 1 etwas steht. Und Spalte 1 darf nicht mehr editiert werden können, sofern man sie verläßt.

Mit obigem Code sieht es jetzt so aus : nur in jeder 2. Zeile geht der Cursor nach verlassen der 4. Spalte in die 1. der nächsten Zeile weiter. Selektieren kann ich allerdings per Maus die Spalten 1 und 4 der letzten Zeile.

Hansa 17. Nov 2004 17:19

Re: im Stringgrid Zellen total sperren
 
Es sieht jetzt so aus :

Delphi-Quellcode:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #13) then begin
    if StringGrid1.Col = 1 then
      StringGrid1.Col := 4
    else begin
      StringGrid1.RowCount := StringGrid1.RowCount + 1;
      StringGrid1.Row := StringGrid1.Row + 1; // jetzt erst Row und Col setzen !!
      StringGrid1.Col := 1;
    end
  end;
end;

function TForm1.ZelleZulaessig (ACol,ARow: integer): boolean;
var z : boolean;
begin
  z := false;
  if ACol in [1,4] then with StringGrid1 do begin
    z := AktRow = ARow;     // zumindest mal die richtige Zeile !
    if z then begin         // jetzt kommt Spalte dran
      if (ACol = 1) then begin
        z := Trim (Cells[1,ARow]) = '';
      end
      else if (Acol = 4) then begin
//        z := (Trim (Cells[1,ARow]) <> '');  // *******************************************
      end;
    end;
  end;
  ZelleZulaessig := z;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   if AktRow < ARow then
     AktRow := ARow;
   Canselect := ZelleZulaessig(ACol,ARow);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  AktRow := 0;
end;
Die auskommentierte Zeile ********** funktioniert nicht. Kennt denn keiner sich mit der Delphi-Komponente Stringgrid aus ? :shock:

Union 17. Nov 2004 17:27

Re: im Stringgrid Zellen total sperren
 
Zitat:

Zitat von Hansa
Es sieht jetzt so aus :

Delphi-Quellcode:
      else if (Acol = 4) then begin
//        z := (Trim (Cells[1,ARow]) <> '');  // *******************************************
      end;
Die auskommentierte Zeile ********** funktioniert nicht. Kennt denn keiner sich mit der Delphi-Komponente Stringgrid aus ? :shock:

Was funktioniert daran nicht ? z ist doch nach der Abarbeitung der Zeile entweder true oder false. Drück Dich mal genauer aus, bitte.

Hansa 17. Nov 2004 18:55

Re: im Stringgrid Zellen total sperren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist mal der komplette Code. Ich habe soweit alle Zellen ausgeschaltet. Wie gesagt, wurde eine Zeile komplett ausgefüült, so gibt es eine neue. Die alten dürfen nicht mehr zugreifbar sein.

Der einzige Schönheitsfehler ist folgender : neue leere Zeile. Die Spalten rechts von Column 1, in diesem Fall die 4. kann ich mit der Maus immer noch anklicken. Das darf aber nur sein, sofern in Spalte 1 etwas steht. Umgekehrt rum soll Spalte 1, sofern etwas drin ist, nicht mehr erreicht werden können.


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