Autor Beitrag
Hack Gott
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 409

Windows Vista
Delphi 2005 Personal, Delphi 7
BeitragVerfasst: 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).

ausblenden 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: :shock:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if Form5.edit1.Text = '' then begin  //Kein Suchbegriff eingegeben
  Form5.Display.Items := Form5.Listbox1.Items;
  exit;
  end;
und sollte wohl eher so lauten: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if Form5.edit1.Text = '' then begin  //Kein Suchbegriff eingegeben
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 409

Windows Vista
Delphi 2005 Personal, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 22.01.08 23:08 
Moin!

Immernoch nicht zu deinem eigentlichen Problem, aber trotzdem wichtig: ;)
user profile iconHack 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. ;)

user profile iconHack 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! :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 24.01.08 16:49 
user profile iconHack 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):
ausblenden 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.


user profile iconNarses 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! :idea:

Juhuu, ich kann mal Narses korrigieren *freu*
So schlau waren die dann bei Borland doch:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 24.01.08 23:07 
Moin!

user profile iconMartok hat folgendes geschrieben:
Juhuu, ich kann mal Narses korrigieren *freu*
*Keks geb* ;)

user profile iconMartok 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 :nixweiss:), 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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.