Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera

[es] :: C/C++ programiranje :: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera

[ Pregleda: 2970 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.sbb.rs.



+2 Profil

icon C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera15.04.2014. u 14:26 - pre 121 meseci
Potrebna mi je pomoc oko c++ buildera,
Treba da preko tastature pronadjem odredjeno ime u gridu. Ja sam odradio za jedno slovo, ali mi je potrebno za 3,4 slova ili celu rec..Ovo sam za jednu rec radio preko Locate..
Moj kod za pretrazivanje samo za jedno slovo, radim sa TADOTable, DBG:
Code:


String str1 = String(Key);

TLocateOptions SearchOptions;
SearchOptions.Clear();
SearchOptions << loPartialKey;
bool LocateSuccess=Form1->tabelaA->Locate("IME",str1,SearchOptions );


 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera15.04.2014. u 15:39 - pre 121 meseci
Zašto ne koristiš neko polje TEdit tipa, i njegov sadržaj prosleđuješ Locate metodi, kad god se desi OnChange edit polja?

Ako je bitno da se polje TEdit ne vidi, kao u nekim modernijim filterima, onda nešto ovako, netestirano (imas i BACKSPACE i ESCAPE):
Code:

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
        static String Trazi;

        switch ( Key )
        {
                case VK_ESCAPE:
                        Trazi = "";
                        break;
                case VK_BACK:
                        if ( Trazi.Length() > 0 )
                                Trazi.SetLength(Trazi.Length()-1);
                        break;
                default:
                        Trazi = Trazi + Key;
        }
        // Ispis na glavnoj formi, da se vidi sta se prosledjuje... Ovo kasnije ukloni.
        Caption = Trazi;

        // ... Locate
}


Mada, kod pretraga ovog tipa, nije baš optimalno da se upit ispaljuje za svaki OnChange. Tada možeš podesiti neki Tajmer, tako da Upit odreaguje kada nije bilo uzastopnih pritiska tastera, u nekom mini intervalu:
Code:

// ...
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   // tajmer interval za ovaj event je recimo 0.5 sec
   Timer1->Enabled = false;

   // ovde izvrsenje upita, a ja umesto toga samo ispisujem string, da se vidi sta se prosledjuje
   Caption = "Query: " + Edit1->Text;
   Sleep(200); // <--- kao neko vreme izvrsenja
}
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
   // resetuje se tajmer
   Timer1->Enabled = false;
   Timer1->Enabled = true;
}
 
Odgovor na temu

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.sbb.rs.



+2 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera15.04.2014. u 19:12 - pre 121 meseci
Hvala vam puno na odgovoru, ovo radi, ali imam jos jedno pitanje. Nakon uspesno pronadjene vrednost, kada zelim da trazim neku novu vrednost(naziv ), on mi na staru vrednost nadovezuje ovu novu sto kucam, ako moze tu mala pomoc..
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera15.04.2014. u 21:01 - pre 121 meseci
Potrebno je da na odgovarajući način "resetuješ" string za pretragu. U prvom primeru, predviđeno je da se to postigne tasterom ESCAPE:
Code:

Trazi = "";


Ne znam koju si varijantu od gore navedenih odabrao, ali to se može postići na puno različitih načina. Na primer, možeš uvek postaviti i poseban taster NOVA PRETRAGA, koja izvršava gore navedeni kod.

Uvek je korisno da postaviš i kod koji već imaš, tako da se nadovežemo.

 
Odgovor na temu

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera15.04.2014. u 21:38 - pre 121 meseci
Reset stringa se ne postize pritiskom na ESC, ja sam u svom primeru izmenio da to bude dugme F3, medjutim ne resetuje se. Idealna varijanta bi bila da se nakon scrolla na gridu resetuje vrednost, naravno nakon pronadjene vrednosti, medjutim od VK postoji samo scroll lock, ne znam da li to moze da se postigne preko VK? Pokusavao sam i u okviru AfterScroll-a a definisem reset, ali ga ne resetuje...


Code:

void __fastcall TForm5::dbgBgKeyPress(TObject *Sender, System::WideChar &Key)
{
                if(isalnum(Key))
        {
      //     String str = String(Key);
            Timer1->Enabled = false;
            static String trazi;
            Edit1->Text = trazi;

                switch ( Key )
        {
                case VK_F3:
                        trazi = "";
                        break;
                case VK_BACK:
                        if ( trazi.Length() > 0 )
                                trazi.SetLength(trazi.Length()-1);
                        break;
                default:
                        trazi = trazi + Key;
        }

         TLocateOptions SearchOptions;
        SearchOptions.Clear();
        SearchOptions << loPartialKey;
        bool LocateSuccess = Form1->tbl->Locate("NAZIV", trazi, SearchOptions);
}
}

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 07:20 - pre 121 meseci
Nismo se razumeli. Nije dobra ideja da hvataš događaj pritiska tastera UNUTAR grida sa podacima. Zašto? Zato što grid sa podacima služi i za unos podataka.

Bolje je da TEdit, koji služi za unos teksta za pretragu, staviš negde pored grida, i hvataš njegov događaj OnChange() radi zadavanja teksta pretrage, i događaj OnKeyDown() da definišemo ponašanje tastera ESCAPE -brzo brisanje teksta pretrage:
Code:

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
        // OVDE TVOJ KOD ZA PRETRAGU:
        TLocateOptions SearchOptions;
        SearchOptions.Clear();
        SearchOptions << loPartialKey;
        bool LocateSuccess = Form1->tbl->Locate("NAZIV", Edit1->Text, SearchOptions);
}

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
        if ( Key == VK_ESCAPE )
                Edit1->Text = "";
}


U tom slučaju ne treba ti ništa od onih prethodnih akrobacija.

Ako ipak želiš rešenje bez TEdit-a, javi pa da razradimo.

 
Odgovor na temu

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.sbb.rs.



+2 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 08:48 - pre 121 meseci
Ne hvatam dogadjaj unutar Grida. Stavio sam TEdit i sada mi sve radi. Imao sam problem sinoc oko KeyPress on ne prepoznaje tastere, pa sam se posle setio da je KeyDown radi sa tasterima. Mada se sada ponovo vracam na pocetak, ipak je bilo bolje drugo resenje rad sa Timerom.
Code:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   // tajmer interval za ovaj event je recimo 0.5 sec
   Timer1->Enabled = false;

   // ovde izvrsenje upita, a ja umesto toga samo ispisujem string, da se vidi sta se prosledjuje
   Caption = "Query: " + Edit1->Text;
   Sleep(200); // <--- kao neko vreme izvrsenja
}
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
   // resetuje se tajmer
   Timer1->Enabled = false;
   Timer1->Enabled = true;
}



Kako da meni tajmer bude argument za Reset?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 10:03 - pre 121 meseci
Citat:
Dejan tf: Ne hvatam dogadjaj unutar Grida. Stavio sam TEdit i sada mi sve radi. Imao sam problem sinoc oko KeyPress on ne prepoznaje tastere, pa sam se posle setio da je KeyDown radi sa tasterima.

Ako ti u ovakvim slu;ajevima, iz nekog razloga ne radi KeyPress/KeyDown, podesi na GLAVNOJ FORMI KOJA SADRŽI KONTROLE (Form1), osobinu KeyPreview = true, zatim probaj ponovo da li događaji sada reaguju.
Citat:
Kako da meni tajmer bude argument za Reset?

Možda sa drugim tajmerom, mada najbolje je sa ESCAPE.
 
Odgovor na temu

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.sbb.rs.



+2 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 13:14 - pre 121 meseci
Ja bih hteo da se taj string 'trazi' za pretragu resetuje nakon nekog intervala timer-a, ako je to moguce? Dakle, meni funkcionise reset na dugme kada ga definisem, ali ono sto meni treba jeste da kada korisnik otkuca karaktere, nakon neke dve sekunde da se ta vrednost resetuje(trazi = "") i da se omoguci ponovna pretraga bez pritiska na odredjeno dugme, da li je to moguce odraditi? Dole je primer kako izgleda moj kod: (dodao sam i komponentu Timer na formu, u okviru koje mogu da definisem interval i komponentu za koju se vezuje Timer, i sad treba da povezem Timer i vrednost stringa 'trazi', kako se to radi?)

Code:

void __fastcall TForm5::dbgBgKeyPress(TObject *Sender, System::WideChar &Key)
{
                if(isalnum(Key))
{

            static String trazi;
            Edit1->Text = trazi;

         TLocateOptions SearchOptions;
        SearchOptions.Clear();
        SearchOptions << loPartialKey;
        bool LocateSuccess = Form1->tbl->Locate("NAZIV", trazi, SearchOptions);
     }

void __fastcall TForm5::Timer1Timer(TObject *Sender)
{

}

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 15:40 - pre 121 meseci
Očigledno se ne razumemo. Imam utisak da si pomešao nekoliko mogućih rešenja u jedno, pa sada ima i viškova koda.

SCENARIO:
Korisnik u kontrolu Edit1 kuca neki tekst. Taj tekst služi za pretragu grida. Dok god koisnik kuca, pretraga ce suzavati broj redova. Kad korisnik prestane da kuca duze od dve sekunde, pretraga ce se resetovati, i opet ces imati ceo spisak. Timer 1 je podesen na 500ms, a Timer2 na 2000ms.

EVO KOD:
Code:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    Edit1->Text = "";
}

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    // Resetuje se tajmer, kako ne bi ispaljivao upit dog kod korisnik kuca
    // Interval je podesen na 500 ms
    Timer1->Enabled = false;
    Timer1->Enabled = true;

    // Resetuje se tajmer, kako bi resetovao celu pretragu
    // Interval je podesen na 2000 ms
    Timer2->Enabled = false;
    Timer2->Enabled = true;

}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    // tajmer interval za ovaj event je recimo 500 ms
    Timer1->Enabled = false;

    // OVDE, UMESTO SLEDECE DVE LINIJE, STAVI TVOJ KOD
    Caption = "Tekst za pretragu: " + Edit1->Text;
    Sleep(200); // <--- kao neko vreme izvrsenja, od 200 ms

    // OVO JE TVOJ KOD:
    // TLocateOptions SearchOptions;
    // SearchOptions.Clear();
    // SearchOptions << loPartialKey;
    // bool LocateSuccess=Form1->tabelaA->Locate("IME",Edit1->Text,SearchOptions );
}

void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
    // tajmer interval za ovaj event je recimo 500 ms
    Timer2->Enabled = false;
    Edit1->Text = "";
}


Da li je to ono što želiš? Ako nije to, opiši kako treba da izgleda KORISNIČKI INTERFEJS, koje sve tačno kontrole i koji scenario unosa podataka.

U tvom primeru vidim da imaš i Edit i dbgBgKeyPress. Ne razumem čemu služi dbgBgKeyPress, ako već tekst pretrage kucaš u Edit i koristiš njegov OnChange događaj? Tada ti ne treba nikakav KeyPress. Ako želiš pretragu preko dbgBgKeyPress, onda Edit nema funkciju. Drugim recima, ne treba ti i "Edit1->Text" i "trazi", vec samo jedno, zavisno od toga koje resenje (korisnicki nacn unosa) odaberes.

 
Odgovor na temu

Dejan tf
student, Fakultet tehnickih nauka Cacak

Član broj: 307010
Poruke: 97
*.dynamic.sbb.rs.



+2 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 19:24 - pre 121 meseci
Ovo je sto sam zaleo, kod koji je testiran i radi..VdbgBgKeyPress je naziv za DBGrid. Hvala vam puno sto ste mi pomogli sada su mi neke stvari mnogo jasnije. Ako imate da mi preporucite neku knjigu iz C++ buildera koja je prevedena na srpski ako nema onda bi mi odgovarala i na engleskom..


Code:




_fastcall TForm5::TForm5(TComponent* Owner)
: TForm(Owner)
{
Edit1->Text = "";
void __fastcall TForm5::dbgBgKeyPress(TObject *Sender, System::WideChar &Key)
{

Timer1->Enabled = false;
Timer1->Enabled = true;

            Timer2->Enabled = false;
Timer2->Enabled = true;

Edit1->Text = Edit1->Text + Key;
}

void __fastcall TForm5::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
Sleep(200); 


 TLocateOptions SearchOptions;
SearchOptions.Clear();
SearchOptions << loPartialKey;
bool LocateSuccess = Form1->tbl->Locate("NAZIV", Edit1->Text, SearchOptions);
}


void __fastcall TForm5::Timer2Timer(TObject *Sender)
{
Timer2->Enabled = false;
Edit1->Text = "";
}

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera16.04.2014. u 19:35 - pre 121 meseci
Koliko mi je poznato, knjige na srpskom odavno se ne izdaju. Na engleskom jeziku, bila je izuzetna serija UNLEASHED. Može se pronaći po netu.

Svakako, nije loše upoznati se sa repozitorijumom:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Main_Page

Tu ima praktično sve, uključujući i primere, samo treba da provališ gde je šta.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C++ builder, treba da pronadjem preko tastature odredjeno ime na gridu sa vise od 3 karaktera

[ Pregleda: 2970 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.