| Autor |
Beitrag |
Hack Gott
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: So 20.01.08 23:08
Also, ähhm... da hier einige recht merkwürdige Dinge passiert sind, hier nochmals mein erster Eintrag (so in etwa zumindestens):
Also ich habe eine Suchfunktion (besser gesagt einen Filter). Dieser durchsucht Listbox1 nach edit1.text und schreibt treffer in display (listbox).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| uses Masks;
procedure Search; var i, int : integer; tmpstring : string; begin if Form12.edit1.Text = '' then begin Form12.Display.Items := Form12.Listbox1.Items; exit; end; Form12.tmp.Clear; Form12.Display.Clear; ParseDelimited(Form12.tmp.Items, trim(Form12.edit1.Text), ' '); tmpstring := '*'; for int := 0 to Form12.tmp.Count - 1 do begin tmpstring := tmpstring+Form12.tmp.Items.Strings[int]+'*'; end; for i := 0 to Form12.ListBox1.Count - 1 do begin if MatchesMask(AnsiUpperCase(Form12.ListBox1.Items.Strings[i]), AnsiUpperCase(tmpstring)) = true then begin Form12.Display.Items.Add(Form12.listbox1.Items.Strings[i]); end; end; end; |
In tmp.Items werden die eingegebenen Wörter getrennt und dann mit einem * wieder zusammengefügt. Soweit so gut, klappt völlig ohne Fehler. Aber jetzt will ich, dass ich die Suchbegriffe in beliebiger Reihenfolge anordnen. Also z.b. einen Eintrag "Delphi Forum" auch bei Eingabe von "Forum Delphi" finden (oder bei Eingaben mit 3 wörtern alle Kombinationen, usw...)
Ist das mit MatchesMask überhaupt realisierbar? oder sollte/kann ich etwas anderes dafür benutzen?
Arne
So, und jetzt kommt die Antwort von Narses, die misteriöser Weise auch ich geschrieben habe...
| Zitat: | Moin!
Zu deinem eigentlichen Problem fällt mir zwar grad nix ein, aber das hier ist mit ziemlicher Sicherheit ein Fehler:
Delphi-Quelltext 1: 2: 3: 4:
| if Form5.edit1.Text = '' then begin Form5.Display.Items := Form5.Listbox1.Items; exit; end; | und sollte wohl eher so lauten:
Delphi-Quelltext 1: 2: 3: 4:
| if Form5.edit1.Text = '' then begin Form5.Display.Items.Assign(Form5.Listbox1.Items); exit; end; |
cu
Narses |
_________________ "Je mehr Käse, desto mehr Löcher; Je mehr Löcher, desto weniger Käse. Daraus folgt: Je mehr Käse desto weniger Käse!"
Zuletzt bearbeitet von Hack Gott am Mo 21.01.08 21:54, insgesamt 1-mal bearbeitet
|
|
Hack Gott 
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: Mo 21.01.08 17:56
komisch, was das Forum da macht...
naja, auf jeden Fall: Das mit dem Assign klappt denk ich mal genauso wie meine Lösung, ich übernehme ja einfach nur den kompletten Inhalt (die Strings). Das klappt ja auch soweit super, ich will jetzt nur die Suchbegriffe auch beliebig durchmischen können/dürfen.
_________________ "Je mehr Käse, desto mehr Löcher; Je mehr Löcher, desto weniger Käse. Daraus folgt: Je mehr Käse desto weniger Käse!"
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.01.08 23:08
Moin!
Immernoch nicht zu deinem eigentlichen Problem, aber trotzdem wichtig:
Hack Gott hat folgendes geschrieben: | | Das mit dem Assign klappt denk ich mal genauso wie meine Lösung, ich übernehme ja einfach nur den kompletten Inhalt (die Strings). |
Nein, es ist durchaus nicht egal, die Objektreferenz zu kopieren ist einfach falsch.
Hack Gott hat folgendes geschrieben: | | Das klappt ja auch soweit super, |
Nein, das sieht nur so aus.  In Wirklichkeit hast du da ein Speicherloch produziert, weil du das Objekt "abgehängt" hast, statt den Inhalt (=die Strings) zu kopieren!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 24.01.08 16:49
Hack Gott hat folgendes geschrieben: | | Ist das mit MatchesMask überhaupt realisierbar? oder sollte/kann ich etwas anderes dafür benutzen? |
So einfach zumindest nicht. Was ich machen würde (ungefähr):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| for i := 0 to Form12.ListBox1.Count - 1 do begin for i:= 0 to tmp.count-1 do begin ok:= pos(tmp[i],Form12.listbox1.Items.Strings[i])>0; if not ok then break; end; if ok then begin Form12.Display.Items.Add(Form12.listbox1.Items.Strings[i]); end; end; |
Müsste so ungefähr passen. Wobei ich grade sehe, dass tmp eine ListBox ist, und kein TStringList-Objekt. naja, musste dann halt anpassen.
Narses hat folgendes geschrieben: | Nein, das sieht nur so aus. In Wirklichkeit hast du da ein Speicherloch produziert, weil du das Objekt "abgehängt" hast, statt den Inhalt (=die Strings) zu kopieren!  |
Juhuu, ich kann mal Narses korrigieren *freu*
So schlau waren die dann bei Borland doch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TCustomListBox.SetItems(Value: TStrings); begin if Style in [lbVirtual, lbVirtualOwnerDraw] then case Style of lbVirtual: Style := lbStandard; lbVirtualOwnerDraw: Style := lbOwnerDrawFixed; end; Items.Assign(Value); end; |
Ergo ist es in dem Fall egal. Direkt Assign aufzurufen hat aber den Vorteil, dass es 'ordentlicher' aussieht.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 24.01.08 23:07
Moin!
Martok hat folgendes geschrieben: | | Juhuu, ich kann mal Narses korrigieren *freu* |
*Keks geb*
Martok hat folgendes geschrieben: | So schlau waren die dann bei Borland doch:
[...]
Ergo ist es in dem Fall egal. Direkt Assign aufzurufen hat aber den Vorteil, dass es 'ordentlicher' aussieht. |
Es ist in diesem Fall zwar faktisch egal (zugegeben: ich habe erst gar nicht in den Source geschaut  ), weil die Borland-Entwickler damit gerechnet haben, dass man damit gut Speicherlöcher produzieren kann, aber es ist trotzdem einfach nur falsch (im Sinne von einem vernünftigen Programmierstil). Es führt letztlich dazu, dass man sich angewöhnt, Objektreferenzen einfach zu überschreiben...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 25.01.08 07:20
Hi Narses,
Die Items-Eigenschaft ist (in diesem Fall) keine Objektreferenz, sondern eben eine Eigenschaft. Wenn die Entwickler der Komponente einen Setter dazugepackt habem dann kann man diese Eigenschaft eben auch überschreiben.
Das ist ja gerade der Vorteil von OOP. Natürlich sollte es dann keine öffentlichen Felder geben, damit man eben getrost so eine Eigenschaft setzen kann. Leider erlaubt Delphi das: Sowas sollte verboten sein:
Delphi-Quelltext 1: 2: 3: 4: 5:
| Type TFoobar = Class Public Items : TStrings; End; |
Ein Entwickler, der TFoobar verwenden will, kann ohne Quellcode oder ordenlicher Doku den Unterschied zwischen dem Hirnriss oben und der sauberen OOP-Implementierung nicht erkennen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| Type TCoolFoobar = Class Public Property Items : TStrings Read GetItems Write SetItems; End; |
Insofern stimme ich Dir (bei Delphi) voll und ganz zu, das es eben sauberer ist, ausnahmslos mit Assign zu arbeiten, wenn man Irgendwas, das nach Objektreferenz aussieht zuweisen will.
_________________ Na denn, dann. Bis dann, denn.
|
|
|