StringGrid durchsuchen
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
StringGrid durchsuchen
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.
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- 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
Ich würde das so machen:
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
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;
Gruß und schöne Feiertage
HE
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
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.
Re: StringGrid durchsuchen
Ein Funktion ist eine Prozedur mit Rückgabewert, welchen man mit "Result" zuweist.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.
Sonst ist es das Gleiche.
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
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.
Re: StringGrid durchsuchen
Vielleicht solltest du die Ressourcen im Netz nutzen?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.
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
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- 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
Eigentlich brauchst du da keine function oder procedure.
Du kannst feststellen, ob überhaupt eine leere Zelle zum Eintragen vorhanden ist:
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:
Gruß HE
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 ...
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
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
kann man in einem StringGrid eine Spalte editierbar machen, während die anderen vom Programm ausgefüllt werden und nicht editierbar sein sollen?
Re: StringGrid durchsuchen
Grundsätzlich editierbar wird es mit der Option(s) "goEditing".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?
Wenn du einzelne Spalten nicht editierbar machen willst, musst du Columns erstellen und dort ReadOnly auf "true" setzen.
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
ich habe in das OnCreateEreignis des Formulars eingegeben:
, dann meldet der Compiler den Fehler EListError mit der Meldung List index (2) out of bounds, obwohl mein StringGrid 5 Spalten hat.
Code: Alles auswählen
StringGrid1.Columns.Items[2].ReadOnly := true;
- kralle
- Lazarusforum e. V.
- Beiträge: 1196
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: StringGrid durchsuchen
Moin,
Gruß Heiko
Zu dem Zeitpunkt gibt es das Grid noch nicht, und damit auch noch kein Index 2.Adenos hat geschrieben: Do 30. Dez 2021, 12:37 ich habe in das OnCreateEreignis des Formulars eingegeben:, dann meldet der Compiler den Fehler EListError mit der Meldung List index (2) out of bounds, obwohl mein StringGrid 5 Spalten hat.Code: Alles auswählen
StringGrid1.Columns.Items[2].ReadOnly := true;
Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: StringGrid durchsuchen
Am besten überschreibst du die Procedure TForm.Loaded. Diese wird aufgerufen, nachdem das Formular und alle Komponenten geladen und initialisiert wurden.
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
wo finde ich denn die Procedure TForm.Loaded? Ich habe den Befehl mal in das OnShow-Ereignis geschrieben, aber da kommt der gleiche Fehler.
Re: StringGrid durchsuchen
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. Im Objektinspektor die TGridColumn auswählen und die Eigenschaft bearbeiten.
OnCreate sollte nicht das Problem sein.
Ausserdem könnte man das auch bequem im Objektinspektor einstellen, statt im Code. Im Objektinspektor die TGridColumn auswählen und die Eigenschaft bearbeiten.
-
- Beiträge: 67
- Registriert: So 17. Okt 2021, 17:18
- OS, Lazarus, FPC: Windows 7
- CPU-Target: X86
- Wohnort: Allgäu
Re: StringGrid durchsuchen
danke, das hat geholfen.