Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Durch Befehl eine bestimmte Zeile im StringGrid markieren (https://www.delphipraxis.net/9750-durch-befehl-eine-bestimmte-zeile-im-stringgrid-markieren.html)

dopeline 3. Okt 2003 08:56


Durch Befehl eine bestimmte Zeile im StringGrid markieren
 
Morgen!

ich habe ein StringGrid in dem nur ganze Zeilen markiert werden können. mit hilfe eines stringvergleichs wirde das gesamte stringgrid (in einer schleife) nach einem bestimmten string durchsucht. an der steklle bleibt er dann "stehen".

Delphi-Quellcode:
procedure TFormHaupt.BitBtnSucheClick(Sender: TObject);
var suchtext:string;
    r,c:integer;
begin

 suchtext:=editsuche.Text;
 if suchtext='' then else
 begin
  For r:=0 to StringGrid1.RowCount+1 do
  For c:=0 to StringGrid1.ColCount+1 do
    If (StringGrid1.Cells[c,r]=suchtext) then
      begin
          ShowMessage('Eintrag in Zeile '+InttoStr(r+1)+' gefunden!');  break;
      end; end;
end;
nun soll die gesamte zeile markiert werden, in der er steht. (statt dem showmessage)
wie mache ich das?


Gruß, dopeline :dancer:

overmoon 3. Okt 2003 09:34

Re: Durch Befehl eine bestimmte Zeile im StringGrid markiere
 
Das Markieren einer Zeile geht z.B. folgendermaßen:

Delphi-Quellcode:
procedure TFormMain.WaehleZeile(Zeile: Integer);
var newSel: TGridRect;
begin
    //Einstellug, dass man mehrere Felder anwählen kann:
    StringGrid.Options := StringGrid.Options + [goRangeSelect];
    //Definition des selektierten Bereiches
    newSel.Left  := StringGrid.FixedCols; // oder 0; Will man die Fixed auch auswählen ?
    newSel.Right := StringGrid.ColCount-1; // Ende der Zeile
    newSel.Top   := Zeile;
    newSel.Bottom := newSel.Top;
    StringGrid.Selection := newSel;
end;

procedure TFormMain.BitBtnAuswahlClick(Sender: TObject);
begin
     WaehleZeile(2);
end;
overmoon

Killian 3. Okt 2003 09:37

Re: Durch Befehl eine bestimmte Zeile im StringGrid markiere
 
Tach!
Also ich glaube dein eines break ist falsch. das springt er nur aus einer for-Schleife. Naja, wenn er hängt, dann schreibs mal so :

Delphi-Quellcode:
procedure TFormHaupt.BitBtnSucheClick(Sender: TObject);
var
   suchtext:string;
* *r,c:integer;
begin
  { gewöhn dir eine vernünftgie formatierung und kommentierung an, sonst
    würde ich an deiner stelle es gleich lassen mit proggen }
  suchtext := editsuche.Text;

  if suchtext <> '' then
  begin
*   For r := 0 to StringGrid1.RowCount - 1 do
    begin { wird eiegentlich nicht benötigt, ist für mich aber übersichtlicher } 
  *   For c := 0 to StringGrid1.ColCount - 1 do
      begin
        Application.Processmessages;
*   *   If (StringGrid1.Cells[c, r] = suchtext) then
  * * *   begin
*   * * *   * ShowMessage('Eintrag in Zeile '+InttoStr(r+1)+' gefunden!');* *break;
  * * *   end;
      end;
    end;  
  end;
end;
Da sollte er zu mindest nicht hängen bleiben. So und danns chau doch einfach mal in der Hilfe nach. Wer lesen kann, ist klar im Vorteil. Ich geb dir noch nen tip: Selection.

Viel spass noch.

Gruss Killian

overmoon 3. Okt 2003 09:49

Re: Durch Befehl eine bestimmte Zeile im StringGrid markiere
 
Bzw., wenn du über eine andere Option arbeiten möchtest:

Delphi-Quellcode:
procedure TFormMain.WaehleZeile(Zeile: Integer);
var newSel: TGridRect;
begin
    //Einstellung, dass man immer eine ganze Zeile auswählt:
    StringGrid.Options := StringGrid.Options + [goRowSelect];
    //Definition des selektierten Bereiches
    newSel.Left  := StringGrid.FixedCols;
    newSel.Right := StringGrid.ColCount-1;
    newSel.Top   := Zeile;
    newSel.Bottom := Zeile;
    StringGrid.Selection := newSel;
end;

procedure TFormMain.BitBtnAuswahlClick(Sender: TObject);
begin
     WaehleZeile(2);
end;
Achja:
Und oben stimmt die Begrenzung der For-Schleife nicht:

Anstatt:

Delphi-Quellcode:
For r:=0 to StringGrid1.RowCount+1 do
  For c:=0 to StringGrid1.ColCount+1 do
Muss es heißen:

Delphi-Quellcode:
For r:=0 to StringGrid1.RowCount-1 do
  For c:=0 to StringGrid1.ColCount-1 do
Außerdem solltest du anstatt

Delphi-Quellcode:
break;
lieber
Delphi-Quellcode:
exit;
schreiben, da er mit break; nur aus dem aktuellen Block heruasspringt, also aus der inneren For-Schleife. Mit Exit wird die gesamte Prozedur verlassen.

overmoon
:dancer: :dancer2: :dancer:

dopeline 3. Okt 2003 10:45

Re: Durch Befehl eine bestimmte Zeile im StringGrid markiere
 
Wow! Danke! das geht ja super! werde von nun an auf meine formatierung achten. versprochen! :)

wie muss ich den ablauf ändern, wenn ich "weiter" suchen will? am besten, wenn man nochmal auf suchen klickt. zur not gehts aber auch mit nem weiteren menü-eintrag.


Gruß, dopeline

dopeline 3. Okt 2003 11:30

Re: Durch Befehl eine bestimmte Zeile im StringGrid markiere
 
mir ist noch ein kleines problem aufgefallen: wenn sich der zu suchenden eintrag außerhalb des sichtbereiches befindet (also, wenn man erst runterscrollen muss), wird er zwar markiert, aber er springt nicht automatisch dort hin. kann man die prozedur "WaehleZeile" vielleich noch um nen befehl erweitert, der dafür sort, dass er springt? wenn ja, mit welchem? hab es mit setfocus versucht, klappt aber irgendwie nicht... :oops:


Gruß, dopeline


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz