AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

im Stringgrid Zellen total sperren

Ein Thema von Hansa · begonnen am 15. Nov 2004 · letzter Beitrag vom 17. Nov 2004
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

im Stringgrid Zellen total sperren

  Alt 15. Nov 2004, 21:49
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 ?
Angehängte Grafiken
Dateityp: bmp stringgrid.bmp (327,3 KB, 38x aufgerufen)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: im Stringgrid Zellen total sperren

  Alt 15. Nov 2004, 22:08
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: im Stringgrid Zellen total sperren

  Alt 16. Nov 2004, 20:39
Ich habe Unions Beispiel etwas umgebaut, aber ich steh anscheinend mit dem OnSelectCell auf Kriegsfuß.

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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: im Stringgrid Zellen total sperren

  Alt 17. Nov 2004, 18:19
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: im Stringgrid Zellen total sperren

  Alt 17. Nov 2004, 18:27
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 ?
Was funktioniert daran nicht ? z ist doch nach der Abarbeitung der Zeile entweder true oder false. Drück Dich mal genauer aus, bitte.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: im Stringgrid Zellen total sperren

  Alt 17. Nov 2004, 19:55
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.
Angehängte Dateien
Dateityp: zip strgrid.zip (435,2 KB, 13x aufgerufen)
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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