Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wo liegt hier mein Fehler? (FindDialog) (https://www.delphipraxis.net/9805-wo-liegt-hier-mein-fehler-finddialog.html)

dopeline 4. Okt 2003 18:00


Wo liegt hier mein Fehler? (FindDialog)
 
Hallo,

Ich habe ein StringGrid, dass mittels einer Schleife nach einem String durchsucht wird. dazu benutze ich einen FindDialog.

Mit einem Klick im MainMenu wird der FindDialog aufgerufen:
Delphi-Quellcode:
procedure TFormHaupt.suchen1Click(Sender: TObject);
begin
 FindDialog1.Execute;
end;
im OnFind-Ereignis des Dialogs steht folgendes:
Delphi-Quellcode:
procedure TFormHaupt.FindDialog1Find(Sender: TObject);
var suchtext:string;
    r,c:integer; // 'r' steht für row (Zeile) und 'c' steh für col(Spalte)
begin
 suchtext:=FindDialog1.FindText;
 if (suchtext='')or(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
     WaehleZeile(r); //Prozedur, die bewirkt, dass eine bestimmte Zeile markiert wird, aufgerufen wird
     FindDialog1.CloseDialog;
     exit;
    end else
    begin
     FindDialog1.CloseDialog;
     MessageDlg('" '+FindDialog1.FindText+'" wurde nicht gefunden', mtInformation, [mbOK],0);
     exit;
    end;
  end;

end;
und das ist die Prozedur "WaehleZeile":
Delphi-Quellcode:
procedure TFormHaupt.WaehleZeile(Zeile:Integer);
var newSel: TGridRect;

begin
    //Einstellung, dass man immer eine ganze Zeile auswählt:
    StringGrid1.Options := StringGrid1.Options + [goRowSelect];
    //Definition des selektierten Bereiches
    newSel.Left  := StringGrid1.FixedCols;
    newSel.Right := StringGrid1.ColCount-1;
    newSel.Top   := Zeile;
    newSel.Bottom := Zeile;
    StringGrid1.Selection := newSel;
end;
Die wird aufgerufen, wenn der suchstring mit einem string aus dem stringgrid übereinstimmt. und die zeile, in der sich der string befindet wird markiert.

irgendwo ist da der wurm drin. :cry:
ich rufe im laufenden programm den dialog auf, gebe den suchstring ein, (der definitiv in einer zelle des stringgrids steht!), klicke auf "Weitersuchen" und er meldet mir, dass der Eintrag nicht gefunden wurde, obwohl er da ist! :?:

Sieht jemand den Fehler?

Gruß, dopeline

Keldorn 4. Okt 2003 19:29

Re: Wo liegt hier mein Fehler? (FindDialog)
 
Hallo Dein Schleifen/If- aufbau ist falsch.

Zitat:

For r:=0 to StringGrid1.RowCount-1 do
For c:=0 to StringGrid1.ColCount-1 do <<<<----
If (StringGrid1.Cells[c,r]=suchtext) then
begin
WaehleZeile(r); //Prozedur, die bewirkt, dass eine bestimmte Zeile markiert wird, aufgerufen wird
...
end else
begin
FindDialog1.CloseDialog; 2)
...

end;
Sobald in Cells [0, irgeneine Reihe ] nicht dein Suchtext drin steht, springst du zu 2) und beendest die Suche.
Du müßtest ja erstmal alle Zellen durchlaufen, col und row für das weitersuchen merken und das tust du nicht.

Mfg Frank

dopeline 4. Okt 2003 21:14

Re: Wo liegt hier mein Fehler? (FindDialog)
 
Argh! :wall:

natürlich!

Danke Keldorn! es funktioniert!


ich hänge mal gleich noch eine frage hinten ran:

wenn er etwas findet, markiert er es... so weit so gut. aber, wenn der gefundene eintrag außerhalb des sichtbereiches ist, wie kann ich ihm dann sagen, dass er bis dort hin scrollen soll?


Gruß, dopeline

Haegar 4. Okt 2003 21:52

Re: Wo liegt hier mein Fehler? (FindDialog)
 
wenn du weisst in welcher zeile sich der eintrag befindet, kannst du das ganz einfach mit
Delphi-Quellcode:
MeinStringGrid.TopRow:=Zeile;
allerdings noch das problem, sollte sich der eintrag in der letzten zeile oder so befinden, dann is der rest darunter weiss, aber das kann man sicher irgendwie vorher überprüfen, und da was regeln. :roll:

ciao haegar

dopeline 4. Okt 2003 22:13

Re: Wo liegt hier mein Fehler? (FindDialog)
 
gibt es vielleicht statt dem "toprow" eine art "bottomrow"? ich finde zwar keine, aber das muss noch lange nichts heißen :oops:

hat vielleicht jemand eine lösung für das problem, bei dem die gesuchte zeile ganz nach oben gescrollt wird? für mich ist das alles noch ein bischen bahnhhfs-gebiet... :oops:


Gruß, dopeline

Haegar 4. Okt 2003 22:32

Re: Wo liegt hier mein Fehler? (FindDialog)
 
du könntest das durch ne überprüfung beseitigen:
sagen wir mal dein SG (StringGrid) hat 50 zeilen.
davon sind 10 auf einmal sichtbar.
wenn du nun eine markierte zeile sehen willst, musst du nur überprüfen ob der wert der Zeile größer/gleich 41 ist, wenn ja dann is TopRow=41, andernfalls TopRow=Zeile. damit wird gewährleistet, das die 50. zeile im ernstfall ganz unten steht, und das SG sauber abgeschlossen wird, und nicht mit sonem weissen bereich.

einigermaßen verständlich?
wenn nicht melde dich einfach nochmal.

ciao haegar

dopeline 5. Okt 2003 09:49

Re: Wo liegt hier mein Fehler? (FindDialog)
 
Verständlich schon... es scheitert nur leider bei der Umsetzung... :oops: :roll:

Gruß, dopeline

Keldorn 5. Okt 2003 10:05

Re: Wo liegt hier mein Fehler? (FindDialog)
 
Zitat:

Zitat von dopeline
Verständlich schon... es scheitert nur leider bei der Umsetzung... :oops: :roll:

Gruß, dopeline

Klasse, D7-Enterprise und nicht mit der Beschreibung von Haegar klarkommen, die war wirklich gut, es steht alles drin was du brauchst.

noch ein hinweis
Zitat:

davon sind 10 auf einmal sichtbar.
Siehe visiblerowcount-eigenschaft. Diesen wert ziehst du von rowcount ab und hast das gewünschte Anzeigeergebnis

Mfg Frank

dopeline 5. Okt 2003 10:31

Re: Wo liegt hier mein Fehler? (FindDialog)
 
Wie bekomme ich denn raus, wieviele zeilen das grid hat? mit ner schleife? oder gibts da direkt einen befehl der prüft, wieviele zeilen belegt sind?

dopeline

Haegar 5. Okt 2003 10:37

Re: Wo liegt hier mein Fehler? (FindDialog)
 
da gibts die eigenschaft StringGrid.RowCount die gibt an wieviele zeilen dein SG hat, egal ob gefüllt oder nicht.

@keldorn: das mit dem visiblerowcount muss ich wohl übersehen haben ;)

ciao haegar


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.
Seite 1 von 2  1 2      

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