![]() |
Such function in FileListBox Funktioniert nicht richtig
Hi ich versuche eine Suchfunktion für eine FileListBox zu schreiben. Nachdem ich ein bisschen im Internet rumm geguckt habe, hab ich mir das hier zusammen geschrieben:
Delphi-Quellcode:
Wenn ich jetzt die unterste Datei aus der FileListBox in der suche eingebe wechselt der button zwar auf Y aber erst nachdem dem ich den ganzen namen eingegeben habe. Ich möchte aber versuchen so eine Dynamische Suche zu schreiben. So dass Wenn ich einen Buchstaben schreibe und er in einem Dateiname drinn ist der Button(nur zu test zwecken) auf Y wechselt. Ich hoffe ihr versteht was ich meine^^
procedure TForm4.edit_sucheChange(Sender: TObject);
var i : integer; begin for i := 0 to FileListBox1.Count - 1 do begin if Pos(FileListBox1.Items[i], edit_suche.Text) > 0 then begin btn_gpOeffnen.Caption := 'Y'; // Nur zu Test Zwecken end else begin btn_gpOeffnen.Caption := 'N'; // Nur zu Test Zwecken end; end; end; Weiß jemand was ich falsch mache und/oder wie es richtig geht? fg edit: Vielleicht könnte mir jemand nebenbei auch noch kurz sagen ob es geht eine datei aus einer FileListBox raus zu nehmen, aber die Datei selbst nicht zu verändern. :stupid: |
AW: Such function in FileListBox Funktioniert nicht richtig
Deine Schleife läuft ja nach einem Treffer trotzdem weiter, deshalb klappt das auch nur mit dem letzten Eintrag.
[edit] Wie ist es so?
Delphi-Quellcode:
procedure TForm4.edit_sucheChange(Sender: TObject);
var i : integer; found: Boolean; begin i := 0; found := false; while (i < FileListBox1.Count) and not found do begin if AnsiContainsText(FileListBox1.Items[i], edit_suche.Text) then found := true; inc(i); end; if found then btn_gpOeffnen.Caption := 'Y' // Nur zu Test Zwecken else btn_gpOeffnen.Caption := 'N'; // Nur zu Test Zwecken end; |
AW: Such function in FileListBox Funktioniert nicht richtig
OK Danke es funktioniert, also indirekt^^ Ich musste AnsiContainsText mit pos ersetzten weil deins irgendwie nicht bekannt war.:|
Mit deiner Methode wird zwar jetzt wenn ich den ganzen Dateiname eingebe auf Y geschaltet, aber ich wollte versuchen das es schon auf Y geht wenn ich den ersten richtigen buchstabe eingebe. Am ende soll dabei z.B sowas raus kommen: Die Datei heißt 'abc.xyz' und ich gebe ein a ein und es werden nur noch alle datein mit einem a an erster stelle angzeigt, dann gebe ich ein b ein usw... Weiß da jemand rat? Geht es vielleicht nicht so wie ich es will weil ich Nicht AnsiContainsText benutze? Damit geht es überigens genau so:
Delphi-Quellcode:
Ich weiß nur nicht ob das so ganz richtig ist. ;)
procedure TForm4.edit_sucheChange(Sender: TObject);
var i : integer; begin for i := 0 to FileListBox1.Count - 1 do begin if Pos(FileListBox1.Items[i], edit_suche.Text) > 0 then begin btn_gpOeffnen.Caption := 'Y'; // Nur zu Test Zwecken exit;//<-------- end else begin btn_gpOeffnen.Caption := 'N'; // Nur zu Test Zwecken end; end; end; Freu mich über jede Hilfe :D |
AW: Such function in FileListBox Funktioniert nicht richtig
Schau Dir die Parameter von Pos() noch einmal genau an, dann wirst Du feststellen, dass Du sie genau verkehrt herum übergibst :zwinker:
|
AW: Such function in FileListBox Funktioniert nicht richtig
So ich Hab gestern Abend noch viel rumm probiert und es sieht jetzt so aus:
Delphi-Quellcode:
Ich hab aber irgendwo einen denkfehler drinn denn eigentlich wenn ich z.B ein W eingebe und es gibt nur eine Datei mit einem W an erster stelle sollte nur noch die Datei mit dem W zusehen sein. Aber es ist ungefähr nur noch die hälfte drinn.... wenn ich dann mehr buchstaben eingebe wird zwar das gesucht ergebnis alleine angezeigt aber ab 4 Buchstaben wird nicht mehr weiter verglichen ein Bsp: Ich hab eine datei die simpsons.txt und eine die simpsons_ver2.txt heißt wenn ich jetzt simpsons eingebe werden zwar nur noch die beiden dateien angezeigt aber auch wenn ich simpsons_ver2.txt eingebe werden trotzdem beide Dateien angezeigt. Ich hab oben nochmal eingetragen wie ich denke das der code funktioniert.
procedure TForm4.edit_sucheChange(Sender: TObject);
var i : integer; begin i := 0; while i <= FileListBox1.Count -1 do begin if length(edit_suche.Text) > 0 then //Wenn das edit feld nicht leer ist... begin if (Pos(edit_suche.Text, FileListBox1.Items[i]) = 1) then //...teste ob der such text ab der ersten stelle im dateinamen vorkommt begin i := i + 1; //wenn ja, tu nichts und wechsel auf die nächste datei end else begin FileListBox1.Selected[i] := true; // Wenn nicht Makiere die datei und lösche sie FileListBox1.DeleteSelected; i := i + 1; // Wechsel auf die nächste Datei end; end else begin i := fileListbox1.count; // While Schleife wird unterbrochen. end; end; end; Danke für den Hinweis das die Parameter vertauscht sind^^ edit: Das mit den 4 buchstaben ist jetzt weg. Habe aber immer noch das Problem das er beispielsweise bei einem w auch noch dateien anzeigt die gar kein w in ihrem namen haben... |
AW: Such function in FileListBox Funktioniert nicht richtig
Wenn Du in einer Schleife löschst, musst Du immer von hinten löschen, da sich der Index verschiebt. Ich habe das mal ein wenig umgeschrieben:
Delphi-Quellcode:
[edit] Obwohl: ich sehe gerade, Deine Variante müsste auch funktionieren, wenn Du nach dem DeleteSelected i nicht erhöhst. [/edit]
procedure TForm4.edit_sucheChange(Sender: TObject);
var i : integer; begin //Wenn das edit feld nicht leer ist.. if length(edit_suche.Text) > 0 then begin //ständiges Neuzeichnen verhindern FileListBox1.Items.BeginUpdate; try //auf letztes Element positionieren i := FileListBox1.Count - 1; while i >= 0 do begin //wenn Dateiname nicht mit dem Edit.Text beginnt if (Pos(edit_suche.Text, FileListBox1.Items[i]) <> 1) then begin //markieren und löschen FileListBox1.Selected[i] := true; FileListBox1.DeleteSelected; end; // Wechsel auf die vorherige Datei i := i - 1; end; finally //Aktualisierte Daten wieder anzeigen FileListBox1.Items.EndUpdate; end; end; end; |
AW: Such function in FileListBox Funktioniert nicht richtig
könnte man das Löschen nicht auch so erledigen?
Delphi-Quellcode:
Gruß
begin
//markieren und löschen FileListBox1.Items.Delete(i); end; K-H |
AW: Such function in FileListBox Funktioniert nicht richtig
Wieso sollte das nicht gehen? Man kann auch erst einmal in der Schleife markieren und anschließend DeleteSelected aufrufen. Vermutlich ist aber das direkte Löschen die schnellste Variante.
|
AW: Such function in FileListBox Funktioniert nicht richtig
Vielen Danke!!! Ihr helft mir echt super :D
Du hattest recht ich habe i nicht mehr erhöht und es klappt :) Jetzt veränder ich noch schnell den teil mit dem löschen und dann funktioniert das ganze :thumb: Vielen Dank nochmal! |
Dieses Thema wurde am "21. Aug 2010, 01:03 Uhr" von "Matze" aus dem Forum "Programmieren allgemein" in das Forum "GUI-Design mit VCL / Qt / Common Controls" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz