Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17
  1. #11
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    64
    Salve Nettuno,
    Grazie del tuo posto, davvero chiaro e didatticamente efficiente.
    Ora devo solo mettere in ordine gli insegnamenti, non sarà facile considerato le mie modeste conoscenze del Dephi.
    Spero di cavarmela e in caso di difficoltà oserò ancora chiederti lumi.
    Ancora grazie e cordiali saluti.
    Ultima modifica di JuanJuan; 29-12-2019 a 21:31

  2. #12
    Quote Originariamente inviata da JuanJuan Visualizza il messaggio
    Salve Nettuno,
    Grazie del tuo posto, davvero chiaro e didatticamente efficiente.
    Ora devo solo mettere in ordine gli insegnamenti, non sarà facile considerato le mie modeste conoscenze del Dephi.
    Spero di cavarmela e in caso di difficoltà oserò ancora chiederti lumi.
    Ancora grazie e cordiali saluti.
    1) Delphi non Dephi .
    2) Grazie x i complimenti, ma non credo di essere un buon "maestro", mi arrangio a scrivere qualche riga di codice.
    3) Chiedi pure, se sono in grado di darti una risposta lo farò molto volentieri.
    Saluti

  3. #13
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    64
    Salve Nettuno,
    Con non poco imbarazzo torno ancora a bussare alla tua porta.
    Ho letto con attenzione le tue indicazioni, ho fatto varie prove, ho girato gran parte del web, ma non so riuscito nell'intento.
    Ho capito il meccanismo teorico del filtraggio con OnFilerTrcord, ma non riesco a metterlo in pratica.
    Uso solo un TTable e un TDataSource, occorreno altri componenti ? UpperCase(DataSet.FieldByName('AUTORE').AsString)) > 0; mi segnala errore,
    mi dice di che DataSet non è definito.
    Allora per cortesia, mi puoi dire step by step come costruire il filtro ?
    e dove mettere le procedure ?
    Con grande riconoscenza ti saluto cordialmente

  4. #14
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    64
    “Scopiazzando” qua e là ho fattoquesta


    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;


    Non da errori
    può funzionare ?
    e se funziona come farla farla partire?

  5. #15
    Quote Originariamente inviata da JuanJuan Visualizza il messaggio
    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

    Quote Originariamente inviata da JuanJuan Visualizza il messaggio
    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

  6. #16
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    64
    Esposizione chiara e lineare.
    Per capire bene il meccanismo, sto costruendo passo passo la procedura, impiegherò un po di tempo e ti farò sapere i risultati.
    Ti ingrazio con stima e ti saluto.

  7. #17
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    64
    Dopo un po di studio ho capito bene il meccanismo OnFilterRecord, ampliando le mie conoscenze delphi.
    Dopo prove e riprove ho preferito questa procedura avviabile con un button
    procedure TForm1.eceautoreClick(Sender: TObject);
    begin
    Table1.Close;
    Table1.Open;
    Table1.Filtered :=false;
    Table1.Filter:='Autore = '+QuotedStr(Edit1.Text+'*');
    Table1.FilterOptions:=[foCaseInsensitive];
    Table1.Filtered :=True;
    end;
    filtra bene maiuscole e minuscole.
    Ancora grazie e coriali saluti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.