Originariamente inviata da
JuanJuan
procedureTForm1.LibriFilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
Cerca: string;
begin
Cerca:=UpperCase(DataSet.FieldByName('Autore').AsS tring +
DataSet.FieldByName('SubTitle').AsString +
DataSet.FieldByName('Autore').AsString);
Accept := Pos(UpperCase(Edit1.Text),UpperCase(DataSet.FieldB yName('AUTORE').AsString)) = 1;
end;
Facciamo un passo alla volta, hai dichiarato una variabile privata della procedura ma non la usi, quando compili con delphi hai dei messaggi di "Hint" e "Warning", guardali sono molto di aiuto.
La tua procedura sintatticamente è corretta, delphi non ti blocca, da quello che leggo tu hai creato uno stringone nella variabile "Cerca" mettendo insieme 3 campi della tabella (autore, subtitle, autore) e poi lo fai filtrare solo per "inizia con.." quello che trova in edit1.text sulla colonna "autore", un bel casino .
Facciamo ordine, io sono vecchietto e ho bisogno di schemi su cui appoggiarmi ....
Domande:
1) In quali campi della tabella vuoi applicare il filtro?
2) Che tipo di filtri hai bisogno?
Risposte:
1) a- Autore
b- Titolo
2) a- Inizia con..
b- Contiene
Bene abbiamo fissato i 2 obbiettivi da raggiungere, il "come" l'abbiamo visto nei post precedenti, tramite la funzione "POS" possiamo applicare tutto quello che ci serve, adesso dobbiamo pensare a come costruire l'interfaccia, ovviamente non useremo qualcosa di complicato come dividere la parte visuale dalla gestione dati, ma facciamo tutto "terraterra".
Ci serve:
1) Un campo TEdit dove immettere l'input di ricerca
2) 2 TCheckBox dove selezionare Autore o Titolo (per ora si presuppone che siano ad esclusione)
3) Un TRadioGroup dove selezionare "inizia" o "contiene"
Diamo un nome sensato ai componenti:
1) eCerca per il TEdit
2) cbAutore e cbTitolo per i 2 TCheckBox
3) rgScelta per il TRadioGroup
Ok, iniziamo scrivere un po' di codice
codice:
procedure TForm1.LibriFilterRecord(DataSet: TDataSet; var Accept: Boolean);
var Cerca: string;
nScelta, nCampo: Integer;
sDoveCercare: String;
sField: String; // campo della tabella
begin
// vediamo la scelta per il filtraggio
nScelta := rgScelta.ItemIndex; // 0= inizia 1= contiene
if nScelta := -1 then // nel caso ... default contiene, ma possiamo mettere anche messaggio
nScelta := 1;
// vediamo quale campo è stato scelto
if cbTitolo.checked then
nCampo := 1 // ricerco il titolo
else
nCampo := 2; // Autore default
// costruiamo il nostro filtro
if nCampo = 1 then
sField := 'TITOLO'
else
sField := 'AUTORE';
Cerca := UpperCase(eCerca.Text); // mandiamo in upper il tedit di ricerca
sDoveCercare := UpperCase(DataSet.FieldByName(sFiled).AsString); // abbiamo il campo di ricerca
// adesso dobbiamo vedere se fare inizia o contiene
if nScelta = 0 then // inizia
Accept := Pos(Cerca, sDoveCercare) = 1
else // contiene
Accept := Pos(Cerca, sDoveCercare) > 0;
end;
Bene adesso dobbiano "scatenare" l'evento settando la proprietà "Filtered" della table a "True", per il momento direi che il posto migliore è nell'evento "OnChange" del TEdit di ricerca, dunque:
codice:
procedure TForm1.eCercaChange(Sender: TObject);
begin
if eCerca.Text='' then // se vuoto togliamo il filtro
Libri.Filtered := False
else
begin
// spengo e accendo il filtro per riaggiornare, questo rallenta il tutto, ma non ricordo metodo migliore
Libri.Filtered := False;
Libri.Filtered := True;
end;
end;
Spero di essere stato abbastanza chiaro, come ti ho detto non ho delphi sottomano, dunque il codice non è testato ci potrebbero essere degli errori, ma la logica credo che funzioni.
Un Saluto
Originariamente inviata da
JuanJuan
Non da errori
può funzionare ?
e se funziona come farla farla partire?
Per funzionare... funziona e per attivarlo basta settare la proprietà "filtered" a true