Forum Delphi.cz

Delphi => Obecné => Téma založeno: Kony 18-07-2019, 13:49:27

Název: Vyhledání v Table podle části slova
Přispěvatel: Kony 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
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Morrison 18-07-2019, 13:52:42
Table.Locate('Sloupec', 'les', [loCaseInsensitive, loPartialKey]);
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 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 ?
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Morrison 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.  
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 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)
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: miroB 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.
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 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;
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: miroB 22-07-2019, 15:24:21
Doplnil som svoju predoslu odpoved.
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 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*
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Morrison 22-07-2019, 16:00:02
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.  
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 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 ?
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: miroB 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.
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 23-07-2019, 08:20:58
Díky moc všem, pracuje přesně podle požadavku
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: Kony 22-11-2019, 11:15:20
A pokud nic nevyhledá dá se nastavit třeba showmessage ('Nic si nevyhledal')
a aby se filter hned vypl ?
Název: Re:Vyhledání v Table podle části slova
Přispěvatel: martinnr 25-11-2019, 08:59:28
po "Refresh" v Onclick das este overenie, ci filtrovanie malo nejaky vysledok a podla neho nechas alebo vypnes filter:

...Onclick...
  ...
  Table.Refresh;
  if table.recordcount = 0 then
  begin
    Table.Filtered := False;
    Table.Refresh;
  end;
  ...