StringGrid durchsuchen

Für Fragen von Einsteigern und Programmieranfängern...
wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid durchsuchen

Beitrag von wp_xyz »

Columns beim TStringGrid sind für mich eine etwas verunglückte Konstruktion. Wenn ein Grid 1 feste Zeile und 1 feste Spalte (FixedRows =1 und FixedCols=1) hat, dann hat die erste beschreibbare Zelle links oben den ZeilenIndex 1 und den Spaltenindex 1, d.h. man kann mit Grid.Cells[1, 1] die Zelle beschreiben und auslesen. Arbeitet man aber mit Columns, dann sitzt dieselbe Zelle aber in der GridColumn mit dem Index 0 (Columns[0])...

Ohne Columns anzulegen kann man eine Spalte (oder Zeile, oder beliebige Zelle) mit Hilfe des OnSelectEditor-Events read-only machen, indem man als Rückgabewert für den zu verwendenden Editor den Wert nil angibt (oder EditorByStyle(cbsNone)):

Code: Alles auswählen

procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; 
  var Editor: TWinControl);
begin
  if aCol = 1 then 
    Editor := nil;
    // oder Editor := StringGrid1.EditorByStyle(cbsNone);
end;

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 »

wenn ich in einem Stringgrid die Zeile mit dem Begriff "TRY" mit der Maus anklicke, wird die Reihe markiert und das entsprechende Stringgrid-Onklick-Ereignis ausgelöst. Mit welchem Befehl kann ich per Programm die Zeile mit dem Begriff "TRY" markieren und das entsprechende Onklick-Ereignis auslösen?

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 muss mich berichtigen. Ich meinte nicht das OnKlick-Ereignis. sondern das OnSelection-Ereignis. Also meine Frage ist, mit welchem Befehl kann man in einem Stringgrid die Reihe mit dem Begriff "TRY" markieren und das OnSelection-Ereignis auslösen.

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 verstehe die Frage nicht ganz. Wenn ich eine Zelle anklicke (egal was drin steht), wird bei mir nur die Zelle markiert.
Was hast du eingestellt und was willst du machen?

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 »

ich möchte die Zelle eben nicht mit der Maus anklicken, sondern per Befehl die Reihe mit dem Eintrag "TRY" markieren, so dass die entsprechende Reihe ausgewählt ist und das OnSelection-Ereignis ausgelöst wird.

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 »

Die Frage ist, wozu du den Event auslösen willst. Willst du mit der gefundenen Zelle (wo TRY oder sonst was drinsteht) etwas machen? Wozu dann der Event?
Dein Programm kennt doch schon die Zelle.

Vielleicht hilft dir das:

Code: Alles auswählen

procedure SelectRowPlusEvent(aGrid: TStringGrid; aCol, aRow: integer);
var
  recSel:  TGridRect;                           {ein Rechteck für die Selection}

begin
  recSel.Top:=aRow;                             {die Zeile oben}
  recSel.Bottom:=aRow;                          {die Zeile unten}
  recSel.Left:=0;                               {ganze Zeile markieren, von Anfang...}
  recSel.Right:=aGrid.ColCount;                 {... bis Ende (rechte Spalte)}
  aGrid.Selection:=recSel;                      {Das selektierte Reckteck anwenden}
  aGrid.OnSelection(aGrid, aCol , aRow);        {und den Event für die Zelle auslösen}
end;
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 »

ich möchte wissen, welcher Wert in der Spalte rechts von der Zelle steht, in der "TRY" eingetragen ist. Dieser Wert kann sich ständig ändern, so dass ich wissen will. in welcher Reihe der Wert "TRY" steht.

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 »

Na das ist doch einfach. Du sucht in der Spalte Nummer 2 (Als Beispiel), ermittelst die Zeilennummer, wo der gesuchte Wert steht. Und der Wert rechts davon steht in Zelle [Spalte+1, Zeilennummer].

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 »

Also etwas so:

Code: Alles auswählen

zeilennr_wert:=StringGrid1.Cols[spaltennr].IndexOf(wert);
if zeilennr_wert>0 then     //gefunden
   WertRechtsDavon:=StringGrid1.Cells[spaltennr+1, zeilennr_wert];


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. Das wollte ich wissen.

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 »

das Rechnen mit dem Eintrag in der rechten Spalte klappt jetzt wunderbar, aber die Reihe im Stringgrid wird immer noch nicht markiert.

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 »

Wie du eine Zeile markierst, steht doch oben. Du kannst den Aufruf von OnSelection einfach weglassen.

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 möchte eine verschachtelte Schleife konstruieren. Als erstes soll mein StringGrid nach €-Einträgen durchsucht werden, dann nach $-Einträgen. Doch Lazarus nimmt den folgenden Code nicht an und sagt am Ende ("BEGIN" expected):

Code: Alles auswählen

begin
for i := 1 to 20 do
  begin
    if StringGridDepot.Cells[4,i]= '€' then
      begin

      end else
      begin
        if StringGridDepot.Cells[4,i]= '$' then

      end;
  end;
end;
Was mache ich falsch?

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: StringGrid durchsuchen

Beitrag von six1 »

Code: Alles auswählen

begin
for i := 1 to 20 do
  begin
    if StringGridDepot.Cells[4,i]= '€' then
    begin

    end else
    if StringGridDepot.Cells[4,i]= '$' then
    begin

    end;
  end;
end;
Gruß, Michael

Antworten