AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Suchfilter für Strings mit Combobox(en) realisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfilter für Strings mit Combobox(en) realisieren

Ein Thema von Christoph · begonnen am 5. Aug 2004 · letzter Beitrag vom 20. Aug 2004
Antwort Antwort
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#1

Suchfilter für Strings mit Combobox(en) realisieren

  Alt 5. Aug 2004, 21:10
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#2

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

  Alt 18. Aug 2004, 17:18
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 18. Aug 2004, 17:28
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;
  Mit Zitat antworten Zitat
Benutzerbild von matthiasl
matthiasl

Registriert seit: 30. Okt 2003
Ort: Nienburg
14 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 18. Aug 2004, 17:54
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
Wenn null besonders groß ist, ist es fast ein bischen eins...
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#5

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

  Alt 18. Aug 2004, 22:00
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#6

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

  Alt 20. Aug 2004, 17:02
Hallo,

habe eine Lösung gefunden:

Delphi-Quellcode:
    while a < High(ArrayTemp)+1 do
    begin
      if ArrayTemp[a].Grouping <> 'Dark Sidethen
      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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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