Autor Téma: Vyhledání v Table podle části slova  (Přečteno 303 krát)

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Vyhledání v Table podle části slova
« kdy: 18-07-2019, 13:49:27 »
Ahoj, mohl bych poprosit o nasměrování ?

Potřebuji přes Edit vyhledávat v Table, ale i jen části slov.

Například

Table :
Kód: Delphi [Vybrat]
  1. Les
  2. Prales

A když zadám les do Editu, tak aby mě to vyfiltrovalo všechny slova, který obsahují les bez rozdílu velkých malých písmen

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 256
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Vyhledání v Table podle části slova
« Odpověď #1 kdy: 18-07-2019, 13:52:42 »
Table.Locate('Sloupec', 'les', [loCaseInsensitive, loPartialKey]);
nil

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #2 kdy: 18-07-2019, 14:50:24 »
to najde první slovo, lze to i filtrovat ? Aby se zapnul filtr a zobrazili řádky jen co mají tento text ?

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 256
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Vyhledání v Table podle části slova
« Odpověď #3 kdy: 18-07-2019, 15:28:51 »
Kód: Delphi [Vybrat]
  1. Table.FilterOptions := [foCaseInsensitive];
  2. Table.Filter := 'Sloupec=*les*';
  3. Table.Filtered := True;
  4.  
nebo použít metodu OnFilterRecord (opět musí být nastavena property Table.Filtered na True):
Kód: Delphi [Vybrat]
  1. ...
  2. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  3. begin
  4.   Accept := Pos('les', AnsiLowerCase(DataSet.FieldByName('Sloupec').AsString)) > 0;
  5. end;
  6.  
nil

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #4 kdy: 22-07-2019, 15:04:36 »
a jak pouzit kdyz potrebuji pouzit vic filtru.... na ten TForm1.Table1FilterRecord

treba filtr 1)
Kód: Delphi [Vybrat]
  1. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   Accept := Pos('les', AnsiLowerCase(DataSet.FieldByName('sloupec').AsString)) > 0;
  4. end;
druhy :
Kód: Delphi [Vybrat]
  1. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   Accept := Pos('pan', AnsiLowerCase(DataSet.FieldByName('hodnota').AsString)) > 0;
  4. end;
atd...

jak je muzu potom rozlisovat a vypisovat ruznym tlacitkum (buttonum)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 514
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Vyhledání v Table podle části slova
« Odpověď #5 kdy: 22-07-2019, 15:17:22 »
a jak pouzit kdyz potrebuji pouzit vic filtru.... na ten TForm1.Table1FilterRecord
atd...
..
jak je muzu potom rozlisovat a vypisovat ruznym tlacitkum (buttonum)
Kazdy Button (nielen Button), ma property Tag (Integer). Ten môže užívateľ ľubovoľne využívať.
Kód: Delphi [Vybrat]
  1. Case btnTag of
  2.   1  : Accept:=fnCislo1;
  3.   ..
  4.   100: Accept:= fnCislo100;
  5.   end;//Case btnTag of
Kde btnTag môže byť globálna premenná, ktorú každý button aktuálne naplní podľa svojho Tagu.
Ako jedno z možných riešení.
Neprehliadni Accept v zobrazenom kóde.
Alebo použiť pre rôzne možnosti iba jeden button a k nemu 100 radioButtonov (ako prepínače)
Dalo by sa vymyslieť aj desiatky iných možností.
Len som myslel, že tu sa neriešia totálne základy programovania.
Okrem, toho treba používať aj zdravý sedliacky rozum. Bez toho to v žiadnom prípade nepôjde.
To už niekde naznačil aj Stano.
« Poslední změna: 22-07-2019, 15:41:35 od miroB »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #6 kdy: 22-07-2019, 15:22:50 »
ale tohle chapu, ale nějak nemůžu pochopit jednu věc a to, jak rozlišit TForm1.Table1FilterRecord aby na jednom tlačitku použil tento filtr a na druhym tlačitku druhý filtr

na jednom tlačitku potrebuji pouzit

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1FilterRecord(DataSet: TDataSet;
  2.   var Accept: Boolean);
  3. var
  4.   Value: Integer;
  5. begin
  6.   Value:=ZTable1['sklad_znojmo'];
  7.   Accept:=Value<2;
  8. end;

a na druhým tlačitku :
Kód: Delphi [Vybrat]
  1. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   Accept := Pos('les', AnsiLowerCase(DataSet.FieldByName('Sloupec').AsString)) > 0;
  4. end;

Offline miroB

  • Guru
  • *****
  • Příspěvků: 514
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Vyhledání v Table podle části slova
« Odpověď #7 kdy: 22-07-2019, 15:24:21 »
Doplnil som svoju predoslu odpoved.

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #8 kdy: 22-07-2019, 15:41:28 »
zkouším to takto

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button10Click(Sender: TObject);
  2. begin
  3.   ZTable1.Filtered:=False;
  4.   ZTable1.Filter := ' nazev ' + QuotedStr('*' + Edit5.Text + '*');
  5.   ZTable1.Filtered:=True;

Aby mi to vyfiltrovalo cokoliv co bude mít v sobě *neco*

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 256
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Vyhledání v Table podle části slova
« Odpověď #9 kdy: 22-07-2019, 16:00:02 »
Excellent
Rated 1 time
Filtrovat přes property Filter a pomocí události OnFilterRecord zároveň nejde. Ale když už máš OnFilterRecord, tak nevidím důvod, proč používat značně primitvní a omezené filtrování přes property Filter.
Výběr různých možností filtrování se v UI obvykle neřeší pomocí tlačítek, ale například RadioButtonů. Takže řekněme, že máš RadioGroup komponentu a v ní nadefinované nějaké možnosti. Pak by to v události OnFilterRecord vypadalo asi nějak takhle:
Kód: Delphi [Vybrat]
  1.   case RadioGroup.ItemIndex of
  2.     0: Accept := Pos('les', AnsiLowerCase(ZTable1.FieldByName('Sloupec').AsString)) > 0;
  3.     1: Accept := ZTable1.FieldByName('sklad_znojmo').AsInteger > 2
  4.     2: Accept := Pos(Edit5.Text, AnsiLowerCase(ZTable1.FieldByName('Nazev').AsString)) > 0;
  5.     ...
  6.   end;
  7.  

A pro RadioGroup jen zavoláš v událost OnClick:
Kód: Delphi [Vybrat]
  1.   ZTable1.Refresh;
  2.  
nil

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #10 kdy: 22-07-2019, 16:03:29 »
a tady tohle

Kód: Delphi [Vybrat]
  1.   case RadioGroup.ItemIndex of
  2.     0: Accept := Pos('les', AnsiLowerCase(ZTable1.FieldByName('Sloupec').AsString)) > 0;
  3.     1: Accept := ZTable1.FieldByName('sklad_znojmo').AsInteger > 2
  4.     2: Accept := Pos(Edit5.Text, AnsiLowerCase(ZTable1.FieldByName('Nazev').AsString)) > 0;
  5.     ...
  6.   end;

dam kam ?

Offline miroB

  • Guru
  • *****
  • Příspěvků: 514
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Vyhledání v Table podle části slova
« Odpověď #11 kdy: 22-07-2019, 18:02:10 »
a tady tohle

Kód: Delphi [Vybrat]
  1.   case RadioGroup.ItemIndex of
  2.     0: Accept := Pos('les', AnsiLowerCase(ZTable1.FieldByName('Sloupec').AsString)) > 0;
  3.     1: Accept := ZTable1.FieldByName('sklad_znojmo').AsInteger > 2
  4.     2: Accept := Pos(Edit5.Text, AnsiLowerCase(ZTable1.FieldByName('Nazev').AsString)) > 0;
  5.     ...
  6.   end;
dam kam ?
Pozri svoj vlastný kód vyššie. Hľadaj Accept.

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 269
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Vyhledání v Table podle části slova
« Odpověď #12 kdy: 23-07-2019, 08:20:58 »
Díky moc všem, pracuje přesně podle požadavku