Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Such function in FileListBox Funktioniert nicht richtig (https://www.delphipraxis.net/153901-such-function-filelistbox-funktioniert-nicht-richtig.html)

Wurstuk 19. Aug 2010 17:41

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:
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;
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^^

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:

DeddyH 19. Aug 2010 17:44

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;

Wurstuk 19. Aug 2010 21:21

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:
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;
Ich weiß nur nicht ob das so ganz richtig ist. ;)

Freu mich über jede Hilfe :D

DeddyH 20. Aug 2010 08:59

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:

Wurstuk 20. Aug 2010 12:10

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:
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;
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.

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...

DeddyH 20. Aug 2010 16:23

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:
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;
[edit] Obwohl: ich sehe gerade, Deine Variante müsste auch funktionieren, wenn Du nach dem DeleteSelected i nicht erhöhst. [/edit]

p80286 20. Aug 2010 17:20

AW: Such function in FileListBox Funktioniert nicht richtig
 
könnte man das Löschen nicht auch so erledigen?
Delphi-Quellcode:
begin
  //markieren und löschen
  FileListBox1.Items.Delete(i);
end;
Gruß
K-H

DeddyH 20. Aug 2010 17:24

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.

Wurstuk 20. Aug 2010 19:52

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!

DP-Maintenance 21. Aug 2010 01:03

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