![]() |
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 ? |
Re: im Stringgrid Zellen total sperren
Zitat:
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. |
Re: im Stringgrid Zellen total sperren
Ich habe Unions Beispiel etwas umgebaut, aber ich steh anscheinend mit dem OnSelectCell auf Kriegsfuß. :shock:
Delphi-Quellcode:
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.
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. 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. |
Re: im Stringgrid Zellen total sperren
Es sieht jetzt so aus :
Delphi-Quellcode:
Die auskommentierte Zeile ********** funktioniert nicht. Kennt denn keiner sich mit der Delphi-Komponente Stringgrid aus ? :shock:
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; |
Re: im Stringgrid Zellen total sperren
Zitat:
|
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 09:58 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