StringGrid durchsuchen

Für Fragen von Einsteigern und Programmieranfängern...
Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

StringGrid durchsuchen

Beitrag von Adenos »

ich möchte die Spalte eines StringGrids nach einem bestimmten Eintrag durchsuchen und ihn, falls er noch nicht vorhanden sein sollte, in die nächste freie Reihe eintragen.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: StringGrid durchsuchen

Beitrag von h-elsner »

Ich würde das so machen:

Code: Alles auswählen

function GridSuche(grid: TStringGrid; spalte: integer; wert: string): integer;
                                               {Result: Nummer der Zeile, wo der Wert (jetzt) steht;
                                               -1, wenn Anzahl Spalten/Zeilen nicht passt}
begin
  try
    result:=grid.Cols[spalte].IndexOf(wert);  {Nachsehen, ob der Wert schon drinsteht, wenn ja - siehe result}
    if result<0 then begin                      {nicht gefunden}
      grid.RowCount:=grid.RowCount+1;         {neue Zeile anlegen}
      result:=grid.RowCount-1;
      grid.Cells[spalte, result]:=wert        {und Wert eintragen}
    end;
  except
    result:=-1;
  end;
end;
Mit dem result kannst du dann auch die Zeilenbennung oder Inhalte weiterer Spalten bearbeiten, weil du ja weißt, in welcher zeile dein Treffer steht.

Gruß und schöne Feiertage
HE

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

vielen Dank für Deine Mühen. Ich werde das Ganze in eine Procedur packen, weil ich mich mit Funktionen nicht auskenne. Mir kam es hauptsächlich darauf an, wie ich die Reihe mit dem entsprechenden Eintrag finde. Ich will auch keine Reihe anfügen, weil das StringGrid eine feste Anzahl von Reihen hat, und ich für den neuen Eintrag nur die nächste freie Reihe suche.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid durchsuchen

Beitrag von theo »

Adenos hat geschrieben:
Sa 25. Dez 2021, 14:01
vielen Dank für Deine Mühen. Ich werde das Ganze in eine Procedur packen, weil ich mich mit Funktionen nicht auskenne.
Ein Funktion ist eine Prozedur mit Rückgabewert, welchen man mit "Result" zuweist.
Sonst ist es das Gleiche.

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

ja vielen Dank. Vom Prinzip her ist mir das schon bekannt. Aber ich bin so dumm, dass ich es nicht mal fertig bringe, die Funktion zu deklarieren. Mit einer Procedur erhalte ich dann die Reihe auch als Integer.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid durchsuchen

Beitrag von theo »

Adenos hat geschrieben:
Sa 25. Dez 2021, 15:13
ja vielen Dank. Vom Prinzip her ist mir das schon bekannt. Aber ich bin so dumm, dass ich es nicht mal fertig bringe, die Funktion zu deklarieren.
Vielleicht solltest du die Ressourcen im Netz nutzen?
Gerade "Anfängerfragen" findet man ja meistens irgendwo beantwortet.
Z.B hier:
https://www.delphi-treff.de/object-pasc ... unktionen/
https://de.wikibooks.org/wiki/Programmi ... Funktionen

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: StringGrid durchsuchen

Beitrag von h-elsner »

Eigentlich brauchst du da keine function oder procedure.
Du kannst feststellen, ob überhaupt eine leere Zelle zum Eintragen vorhanden ist:

Code: Alles auswählen

zeilennr_leer:=StringGrid1.Cols[spaltennr].IndexOf('');
if zeilennr_leer>0 then  ... 
Du hast damit die Zeilennummer in die du etwas eintragen kannst (ohne Überschrift, mit Suche auch in Überschrift hieße es if zeilenr_leer>=0 then...).
Und du hast damit ja doch eine function benutzt. Warum dann keine eigenen functions nutzen?

Wenn es eine leere Zelle gibt, kannst du nach deinem Wert suchen:

Code: Alles auswählen

zeilennr_wert:=StringGrid1.Cols[spaltennr].IndexOf(wert);
if zeilennr_wert>0 then     //gefunden
   StringGrid1.Cells[spaltennr, zeilennr_leer]:=wert   // in oben gefundene Zeile eintragen 
else ....                                // nicht gefunden
Gruß HE

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

kann man in einem StringGrid eine Spalte editierbar machen, während die anderen vom Programm ausgefüllt werden und nicht editierbar sein sollen?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid durchsuchen

Beitrag von theo »

Adenos hat geschrieben:
Do 30. Dez 2021, 11:21
kann man in einem StringGrid eine Spalte editierbar machen, während die anderen vom Programm ausgefüllt werden und nicht editierbar sein sollen?
Grundsätzlich editierbar wird es mit der Option(s) "goEditing".
Wenn du einzelne Spalten nicht editierbar machen willst, musst du Columns erstellen und dort ReadOnly auf "true" setzen.

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

ich habe in das OnCreateEreignis des Formulars eingegeben:

Code: Alles auswählen

  StringGrid1.Columns.Items[2].ReadOnly := true;
, dann meldet der Compiler den Fehler EListError mit der Meldung List index (2) out of bounds, obwohl mein StringGrid 5 Spalten hat.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 990
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: StringGrid durchsuchen

Beitrag von kralle »

Moin,
Adenos hat geschrieben:
Do 30. Dez 2021, 12:37
ich habe in das OnCreateEreignis des Formulars eingegeben:

Code: Alles auswählen

  StringGrid1.Columns.Items[2].ReadOnly := true;
, dann meldet der Compiler den Fehler EListError mit der Meldung List index (2) out of bounds, obwohl mein StringGrid 5 Spalten hat.
Zu dem Zeitpunkt gibt es das Grid noch nicht, und damit auch noch kein Index 2.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: StringGrid durchsuchen

Beitrag von fliegermichl »

Am besten überschreibst du die Procedure TForm.Loaded. Diese wird aufgerufen, nachdem das Formular und alle Komponenten geladen und initialisiert wurden.

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

wo finde ich denn die Procedure TForm.Loaded? Ich habe den Befehl mal in das OnShow-Ereignis geschrieben, aber da kommt der gleiche Fehler.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid durchsuchen

Beitrag von theo »

Ich glaube, Adenas hat schlicht vergessen, mindestens 3 Columns zu erstellen.
OnCreate sollte nicht das Problem sein.
Ausserdem könnte man das auch bequem im Objektinspektor einstellen, statt im Code.
lazcols.png
lazcols.png (71.34 KiB) 1576 mal betrachtet
Im Objektinspektor die TGridColumn auswählen und die Eigenschaft bearbeiten.
lazcols2.png
lazcols2.png (83.75 KiB) 1575 mal betrachtet

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: StringGrid durchsuchen

Beitrag von Adenos »

danke, das hat geholfen.

Antworten