Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - TTable - filter

Chcel by som nastaviť v TTable takýto filter:
1. "case sensitive"
2. možnosť zadania aj textu zo stredu položky
3. kontrola všetkých položiek

Je takáto možnosť? Ja mám teraz nastavený takýto a ďalej sa neviem pohnúť:
1. možnosť zadania len od začiatku položky
2. kontrola všetkých položiek

Tu je "zdroják" filtra:

procedure TCllientsForm.edSearchChange(Sender: TObject);
var
  s: String;
begin
  Table.Filtered := False;
  s := edSearch.Text + '*';
  if s <> '' then
    begin
      Table.Filter := '([0] = ' + QuotedStr(s) +
       ') or ([1] = ' + QuotedStr(s) +
       ') or ([2] = ' + QuotedStr(s) +
       ') or ([3] = ' + QuotedStr(s) +
       ') or ([4] = ' + QuotedStr(s) +
       ') or ([5] = ' + QuotedStr(s) +
       ') or ([6] = ' + QuotedStr(s) + ')';
      Table.Filtered := True;
    end;
end;
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Na zadani filtru podle zacatku obsahu polozky by mela slouzit property FilterOptions: TFilterOption…
Jan Fiala 27.06.2006 09:37
Jan Fiala
Dobre mám "case sensitive", ale stále to nehľadá uprostred položky, iba od začiatku. Čo teraz? V hel…
msx. 27.06.2006 10:00
msx.
Muzes si to resit sam v udalosti OnFilterRecord (aspon tak se to tusim jmenuje)
Jan Fiala 27.06.2006 11:11
Jan Fiala
Uvnitře je použita tato funkce (možno jí nacpat dovnitř). {------------ Pascalské POS optimalizovan…
Rce 28.06.2006 00:11
Rce
Nezkousel jsi pouzit funkci MatchesMask() z unity Masks ?
Jan Fiala 28.06.2006 00:14
Jan Fiala
To moje je podstatně rychlejší.;-):-p
Rce 28.06.2006 00:16
Rce
Mas pravdu, je to asi 4x rychlejsi. Na 100000 porovnani tva pulsekunda oproti 2s funkce MatchesMasks…
Jan Fiala 28.06.2006 00:41
Jan Fiala
Já to právě třeba používám v OnFiltered. Mám ve vyhledávacích oknech (třeba adresářů) takovou funkci…
Rce 28.06.2006 00:47
Rce
Áno, áno, presne to robím aj ja.;-) Edit: Tú procedúru teda len zaradím k udalosti OnFilterRecord?
msx. 28.06.2006 14:55
msx.
Nechceš poslat někam celý program s tou tabulkou, jak to řeším já?
Rce 28.06.2006 23:39
Rce
Ja žew som ťa nahneval som si myslel v prvej chvíli.:-) Môžeš a pozriem saa naň.. Ďakujem. Myslím, ž…
msx. 29.06.2006 14:34
msx.
Proč bych se měl hněvat? ::):-) Zde máš inspiraci: HF.zip
Rce 29.06.2006 22:54
Rce
Veľmi pekne ďakujem.:beer:
msx. 29.06.2006 23:15
msx.
[cyrilic.gif] poslední
Rce 29.06.2006 23:22
Rce

Na zadani filtru podle zacatku obsahu polozky by mela slouzit property FilterOptions:
TFilterOption = (foCaseInsensitive, foNoPartialCompare);
Takze pokud nic nevyplnis, nemel by byt filtr zavisly na velikosti pismen a mel by automaticky brat (i bez hvezdicky) zacatek retezce

Uvnitře je použita tato funkce (možno jí nacpat dovnitř).

{------------ Pascalské POS optimalizované pro hledání 1 znaku  ---------------------}
function PosChar (const c: char; const s: string): LongInt; register; assembler;
{	c	:= Znak co hledáme }
{	s	:= Kde to hledáme  }
{Vrací (v EAX): Pozici v s (index znaku), nenalezne-li se c v s, vrací 0 }
asm
	PUSH	EDI

	MOV	EDI, s;		{ Point EDI to s       }
	CMP	EDI, 0;
	JZ	@Kulovy;	{ Řetěz je NIL, to jest prázdný }

	MOV	AL, c;		{ AL znak co hledáme   }
	MOV	ECX, -4 (EDI);	{ Délka řetězu do ECX }
	MOV	EDX, EDI;	{ Úschova ad. začátku řetězu }

	CLD;			{ SCASB pojede nahoru }
	REPNE	SCASB;
	JNE	@Kulovy;	{ Nenašlo se to }

	MOV	EAX, EDI;	{ EAX kde to skončilo + 1 }
	SUB	EAX, EDX;	{ EAX je pozice v řetězu }
	JMP	@Finish;

@Kulovy:XOR	EAX, EAX;	{ EAX := 0 --> že se našlo prd }

@Finish:POP	EDI;
end;

Já to právě třeba používám v OnFiltered. Mám ve vyhledávacích oknech (třeba adresářů) takovou funkci, že píšeš do políčka a ono to vyhledá text ať je v kterémkoliv sloupečku a kdekoliv. Filtruje to současně za psaní. Třeba víš kus jména firmy, ulici a nevíš přesně jak to v tom adresáři je. Pak se musí tato funkce použít v OnFiltered na všechny sloupce tabulky krát počet řádků. Tam je pak to pak každá instrukce navíc znát (aby to při pasní nezadrhávalo a plynule filtrovalo). Samozřejmě, když to použiješ v programu "jen občas", tak je to putna, jak je to rychlé.
//Edit: BTW tu funkci jsem dělal v době kamenné Delphi, kdy tam ještě nebyla od přírody.8-)

Zpět do poradny Odpovědět na původní otázku Nahoru