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 Eingabe in Stringgrid (https://www.delphipraxis.net/4508-eingabe-stringgrid.html)

Hansa 2. Mai 2003 12:05


Eingabe in Stringgrid
 
Hi,

ich habe hier ein Stringgrid mit 7 Spalten. In 2 dieser Spalten soll man etwas eingeben können, in die anderen nicht. Jetzt ist es aber so, daß von vorneherein gar nichts irgendwo eingegeben werden kann. Wer weiß mehr ?

Stanlay Hanks 2. Mai 2003 12:19

Wenn du in das Grid nix eingeben kannst, musst du im OI unter Optionen die Eigenschaft Editing auf true setzen. Dann kannst du die Zellen im StringGrid ändern.

Man liest sich, Stanlay :bounce1:

Hansa 2. Mai 2003 12:24

es heißt "goEditing", gilt aber für das ganze Grid. Und wie schränke ich das auf 2 von 7 Spalten ein ?

Christian S. 2. Mai 2003 12:26

Du könntest es so machen:
Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
const erlaubt = [2,3];
begin
  if not (ACol in Erlaubt) THEN CanSelect:=False;
end;
Dann kann der Benutzer nur die Spalten 2 und 3 auswählen!

MfG,
Peter

[edit=Daniel B]Delphi-Tags ergänzt. MfG Daniel B.[/edit]

Hansa 2. Mai 2003 12:32

Thx, genau so geht es. Mal abwarten, bis das nächste Problemchen auftaucht. Kann nicht mehr lange dauern. 8)

Hansa 2. Mai 2003 12:36

Da ist schon eines: Gibt es so was wie OnExitCell? Es geht mir darum, falls das Grid gefüllt ist noch eine Zeile dran zu hängen. Durch einen Buttonclick geht das, aber es müßte gehen, sobald eine Zelle einen Wert besitzt. Und dann noch was: kann ich eine ganze Zeile löschen ?

Christian S. 2. Mai 2003 12:47

Bei der Sache mit OnExitCell muss ich passen. Du könntest im OnDrawCell-Ereignis abfragen, ob in der letzten Zeile was steht und wenn dem so ist, noch eine dran hängen.

Eine Zeile löschen kannst Du, glaube ich, nur, wenn Du alle nachfolgenden Zeilen eins nach oben verschiebst und dann den RowCount um eins erniedrigst.

MfG,
Peter

Neo2084 2. Mai 2003 14:35

Hallo Hansa,

Zitat:

Zitat von Hansa
Da ist schon eines: Gibt es so was wie OnExitCell? Es geht mir darum, falls das Grid gefüllt ist noch eine Zeile dran zu hängen. Durch einen Buttonclick geht das, aber es müßte gehen, sobald eine Zelle einen Wert besitzt.

so könnte es mit der "PfeilNachUnten-Taste" funktionieren :

Delphi-Quellcode:
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if Key=40 {Down} then
     begin
       if (Stringgrid1.Row=Stringgrid1.RowCount-1) and
          (Stringgrid1.Cells[1,Stringgrid1.Row]<>'') then
       begin
          Stringgrid1.RowCount :=Stringgrid1.RowCount+1;
       end;
     end;
end;
Gruß Jan

Christian Seehase 2. Mai 2003 14:48

Moin Hansa,

Zeilen löschen wie im RichEdit oder einer StringList geht definitiv nicht. Ein StringGrid ist ein borlandspezifisches Control, bei dem der erforderliche Speicher automatisch vom Stringgrid selber verwaltet wird.
Du kannst auch problemlos in Zellen schreiben, die ausserhalb von RowCount bzw. ColCount liegen. Diese geben nur den sichtbaren Bereich an.

Keldorn 2. Mai 2003 15:38

Zitat:

Zitat von Peter Lustig
Du könntest es so machen:
Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
const erlaubt = [2,3];
begin
  if not (ACol in Erlaubt) THEN CanSelect:=False;
end;
Dann kann der Benutzer nur die Spalten 2 und 3 auswählen!

MfG,
Peter

Hallo,

die Lösung find ich nicht ganz so gut. Grund: wenn man Canselect auf False stellt, kann die Zelle gar nicht ausgewählt werden. Leute, die sich gern mit den Cursortasten durch Grid hangeln werden nie von Spalte 1 zu spalte 4 kommen. Das mit Goediting mache ich so:

Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin
  if acol in [2,3] then stringgrid1.Options:=stringgrid1.Options-[goediting]
                   else stringgrid1.Options:=stringgrid1.Options+[goediting];
end;
Mfg Frank

[edit=Daniel B]Delphi-Tags ergänzt. MfG Daniel B.[/edit]

Christian S. 2. Mai 2003 15:40

@Keldorn: Du hast völlig recht. Da habe ich gar nicht dran gedacht. Da ist Deine Lösung dann wirklich vorzuziehen.

Hansa 2. Mai 2003 19:43

Das verdammte Grid nervt mich langsam. Wie kann ich denn auf eine Zelle gezielt reagieren :?: Wenn sie "betreten" wird, z.B. kleinen Hinweis zeigen und beim Verlassen in Abhängigkeit, ob etwas eingegeben wurde Cursor irgendwohin bewegen. Jetzt verzichte ich schon auf ein DBgrid, weil das noch unflexibler ist und programmiere alles selber, aber das StringGrid scheint nicht viel besser zu sein.

Keldorn 3. Mai 2003 13:49

Zitat:

Zitat von Hansa
Das verdammte Grid nervt mich langsam. Wie kann ich denn auf eine Zelle gezielt reagieren :?: Wenn sie "betreten" wird, z.B. kleinen Hinweis zeigen und beim Verlassen in Abhängigkeit, ob etwas eingegeben wurde Cursor irgendwohin bewegen. .

Hallo

was gefällt dir denn an OnselectCell nicht?
Wenn du wissen willst, ob etwas eingegeben wurde, dann merk dir doch die Position der alten Zelle+Wert und beim nächsten onselectCell fragst du diese werte entsprechend und reagierst entsprechend.

Mfg Frank

Jens Schumann 6. Mai 2003 17:25

Hallo,
Zitat:

Zitat von Christian Seehase
Zeilen löschen wie im RichEdit oder einer StringList geht definitiv nicht.

Mit dieser procedure kann eine bestimmt Zeile aus einem TStringGrid gelöscht werden.
Delphi-Quellcode:
procedure DeleteRow(yourStringGrid: TStringGrid; ARow: Integer);
var i: Integer;
begin
  with yourStringGrid do
  begin
    for i := ARow to RowCount-2 do
      Rows[i].Assign(Rows[i+1]);
    RowCount := RowCount - 1
  end;
end;


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