Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suchfilter für Strings mit Combobox(en) realisieren (https://www.delphipraxis.net/27204-suchfilter-fuer-strings-mit-combobox-en-realisieren.html)

Christoph 5. Aug 2004 20:10


Suchfilter für Strings mit Combobox(en) realisieren
 
Hallo!

Ich habe folgendes Problem:

In eine Listbox lade ich Strings aus einem csv-file, die verschiedene Informationen beinhalten.

Mit drei Comboboxen möchte ich einen (bzw. mehrere) Filter anlegen, nach denen die Strings in der Listbox abgesucht werden. Ziel ist dann die Wiederbefüllung der Listbox mit den dem Filter entsprechenden Strings.

Der Filterwert in der Combobox 1 ist fix.
Die Werte in der Combobox 2 und 3 sind abhängig von den in Combobox 1 gewählten Werten.

Beispiel a:
Wert Combobox 1: 'Name'
Wert Combobox 2: enthält dann '=' oder 'enthält'
Wert Combobox 3: 'Meier' oder einen frei einzugebenden Wert, zB. 'Mei'

Beispiel b:
Wert Combobox 1: 'Alter'
Wert Combobox 2: enthält dann '=' oder '<' oder '>'
Wert Combobox 3: '0' '1' '2' ... usw.

Beim ButtonOnClick soll dann dieser Filter (zB. 'Name' '=' 'Meier') in einem Memo-Feld sichtbar sein, damit der User weiß, was er für einen Filter gewählt hat.
Das Memo-Feld hat den weiteren Zweck auch weitere Filter anzuzeigen, wenn ich als zweiten Filter zB. noch angeben möchte: 'Alter' '<' '14'.

Ergebnis sollen dann alle die Strings sein, bei denen der Name = 'Meier' ist, und wo das Alter < 14 ist.


Die Abhängigkeit der Comboboxen voneinander funktioniert.
Aber wie bekomme ich es hin, dass der Filter sozusagen 'zwischengespeichert' wird (es wäre auch kein Problem jeden Filter nacheinander anzuwählen, also das Ergebnis sozusagen auszudünnen)?

Schwierigkeiten macht mir auch das Abgreifen der Combobox-Werte, denn je nach gewähltem Wert in Combobox 1 ändert sich ja der Wert in Combobox 2. Dh. der ItemIndex ist je nach Auswahl nicht identisch (zB. mal '<', mal 'enthält').

Es geht leider auch nicht, alles mit einer case oder if-Abfrage abzufangen, denn in Combobox gibt es bereits 20 feste Werte, und alle Eventualitäten zu programmieren wäre sinnfrei.

Versteht jemand das Problem und noch besser, hat jemand einen Vorschlag?

Vielen Dank im Voraus,
Christoph

Christoph 18. Aug 2004 16:18

Re: Suchfilter für Strings mit Combobox(en) realisieren
 
Hallo,

hat denn wirklich keiner eine Idee?

Mittlerweile denke ich, dass folgende Methode die richtige wäre:
Alle Daten in ein Array schreiben und dieses dann nach und nach (je nach gesetztem Filter) ausdünnen.

Das würde bedeuten, das Array immer wieder durchzugehen, und die 'Nicht-Treffer' zu löschen. Nach dem letzten Durchlauf müsste dann das Array aus den Werten bestehen, die den Filtern entsprechen.

Leider habe ich nichts brauchbares im web gefunden, um ein Array auf diese Weise auszudünnen.

Der Tipp von www.delphi-source.de:

Delphi-Quellcode:
type TIntArray: array of integer;

function DeleteArrayElement(var arr: TIntArray; const index: integer);
var i: integer;
begin
  if index<high(arr) then begin
    for i:=index to high(arr)-1 do
      // eins nach vorne kopieren
      arr[i]:=arr[i+1];
  end;
  // Länge kürzen (bei dyn. Arrays)
  SetLength(arr, length(arr)-1);
end;
funzt nicht - die Funktion hat auch gar keinen Rückgabewert.

Mein Array ist ein dynamisches Array of Record - kann mir jemand helfen, die Funktion umzubauen?

Danke und Grüße,
Christoph

Die Muhkuh 18. Aug 2004 16:28

Re: Suchfilter für Strings mit Combobox(en) realisieren
 
Hi,


Zitat:

funzt nicht - die Funktion hat auch gar keinen Rückgabewert.
Das ist auch kein Wunder. Normalerweiße sieht eine Funktion so aus:

Delphi-Quellcode:
function <Name>(<Parameter>): <Rückgabewert>;
begin
  //machwas
Result := <Rückgabewert>;
end;

matthiasl 18. Aug 2004 16:54

Re: Suchfilter für Strings mit Combobox(en) realisieren
 
Hi Christoph,

ich finde, du machst dir das Leben auch echt schwer. Entweder ist deine Beschreibung nur verwirrend, oder dein gewählter Lösungsansatz ist verwirrend.

Hat deine CSV-Datei eine feste Struktur/Felder? Dann wäre es eine wirklich sinnvolle Alternative, die ganzen Filtermöglichkeiten hardkodiert einzubauen. D.h. Es gibt keine voneinander abhängigen Comboboxen, es gibt keine Schwierigkeiten mit der Anzeige der Filtereinstellungen und es ist wesentlich leichter zu programmieren und zu beschreiben.

...Matthias

Christoph 18. Aug 2004 21:00

Re: Suchfilter für Strings mit Combobox(en) realisieren
 
Hallo,

das Problem mit den Comboboxen habe ich gelöst. Offen ist nur noch die Frage mit dem Ausdünnen des Arrays.

Ich versuche mal, das Problem etwas genauer zu erklären.

Ich schreibe ein Verwaltungsprogramm für ein Kartenspiel (Starwars). Es gibt viele verschiedene Sorten von Karten.
ZB. einen Charakter. Der sieht in meinem csv-file so aus (stark gekürzt):

Luke Skywalker;Character;Power:3 Ability:4;Pilot;Son of Anakin Skywalker. Student of Obi-Wan Kenobi.

Also Name, Art, bestimmte Werte, Pilot oder nicht, bestimmter Text.
Jeder Charakter hat bestimmte Werte. Daneben gibt es noch mehrere verschiedene Sorten Karten, die in den Feldern des csv-files andere Werte stehen haben (es stehen also nicht immer die gleichen Arten von Werten in den Feldern - das hardkodieren ist daher wohl nicht möglich).

Insgesamt sind es knapp 2800 Karten, die ich in ein Array of Record einlese. Damit kann ich dann zB. mittels Card[i].Name auf den Namen des Characters zugreifen. Genauso auf Card[i].Power usw.

Ich habe alle 2800 Karten in einer Listbox aufgelistet. Nun möchte ich diese Karten nach bestimmten Kriterien filtern.

Beispiel: Alle Karten, die ein Charakter sind.

Ich gehe das Array of Record durch und speichere alle Treffer in ein temporäres Array.
Das funktioniert einwandfrei.

Jetzt wirds aber erst interessant:
Die so gefundene Treffermenge soll wiederum auf ein bestimmtes Kriterium gefiltert werden. ZB. alle Charakter, die Power = 3 haben.

Jetzt soll das vorhandene temporäre Array weiter nach diesem Kriterium ausgedünnt werden. Es sollen alle Karten entfernt werden, deren Power-Wert nicht 3 ist.

Ein weiteres temporäres Array hilft nicht weiter, denn ich könnte ja auch zuerst nach Power = 3 filtern und danach nach Charakter. Es muss also bei diesem einen temporären Array bleiben. Mittlerweile bin ich bei 18 verschiedenen Kriterien.

Wie kann ich aus diesem Array bestimmte Einträge herausschmeissen?

Ist die Frage nun verständlicher?

Danke und Gruß,
Christoph

Christoph 20. Aug 2004 16:02

Re: Suchfilter für Strings mit Combobox(en) realisieren
 
Hallo,

habe eine Lösung gefunden:

Delphi-Quellcode:
    while a < High(ArrayTemp)+1 do
    begin
      if ArrayTemp[a].Grouping <> 'Dark Side' then
      begin
        for i:=a to high(ArrayTemp)-1 do
        begin
          ArrayTemp[i]:=ArrayTemp[i+1];
        end;
        SetLength(ArrayTemp, length(ArrayTemp)-1);
        dec(a);
      end;
    inc(a);
    end;
Vielen Dank!

Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 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