Фильтр DBGrid или Table Builder 6
В этой форме я использую Table1
(три колонки "ZEMLJA", "KATEGORIJA" и "NAZIV") с DataSource1
подключен к базе данных Paradox 7. Также DBGrid1
подключен к DataSource1
, Вот еще три поля ввода (Edit1
, Edit2
а также Edit3
).
В заголовочный файл я положил:
public: // User declarations
__fastcall TForm4(TComponent* Owner);
void Filtriraj(AnsiString szZemljaAsterix, AnsiString szKategorijaAsterix, AnsiString szNazivAsterix, AnsiString szNoviAsterix);
Мой файл cpp выглядит так:
#include <vcl.h>
#pragma hdrstop
#include “Unit4.h”
//—————————————————————————
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm4 *Form4;
//—————————————————————————
__fastcall TForm4::TForm4(TComponent* Owner): TForm(Owner)
{
}
//—————————————————————————
void TForm4::Filtriraj(AnsiString szZemljaAsterix, AnsiString szKategorijaAsterix, AnsiString szNazivAsterix, AnsiString szNoviAsterix)
{
AnsiString szUslov=””;
if( !Edit3->Text.IsEmpty() )
{
szUslov = “ZEMLJA = ‘” + Edit3->Text + szZemljaAsterix + “‘”;
}
if( (!Edit4->Text.IsEmpty()) && (!Edit3->Text.IsEmpty()) )
{
szUslov = szUslov + “and KATEGORIJA = ‘” + Edit4->Text + szKategorijaAsterix + “‘”;
}
else if( (!Edit4->Text.IsEmpty()) && (Edit3->Text.IsEmpty()) )
{
szUslov = “KATEGORIJA = ‘” + Edit4->Text + szKategorijaAsterix +”‘”;
}
if( !Edit5->Text.IsEmpty() )
{
if(szUslov!=””)
szUslov = szUslov + “and NAZIV = ‘” + Edit5->Text + szNazivAsterix + “‘”;
else
szUslov = szUslov + “NAZIV = ‘” + Edit5->Text + szNazivAsterix + “‘”;
}
Table3->Filter = szUslov;
Table3->Filtered = true;
}
//—————————————————————————
void __fastcall TForm4::Edit3Change(TObject *Sender)
{
Filtriraj(“*”,””,””,””);
}
//—————————————————————————
void __fastcall TForm4::Edit4Change(TObject *Sender)
{
Filtriraj(“”,”*”,””,””);
}
//—————————————————————————
void __fastcall TForm4::Edit5Change(TObject *Sender)
{
Filtriraj(“”,””,”*”,””);
}
//—————————————————————————
void __fastcall TForm4::Edit3KeyPress(TObject *Sender, char &Key)
{
if( Key==13 )
{
Edit4->SetFocus();
if(Edit3->Text==””)
Edit3->Text =””;
else
Edit3->Text = Edit3->Text + “*”;
Filtriraj(“”,””,””,””);
}
}
//—————————————————————————
void __fastcall TForm4::Edit4KeyPress(TObject *Sender, char &Key)
{
if( Key==13 )
{
Edit5->SetFocus();
if(Edit4->Text==””)
Edit4->Text =””;
else
Edit4->Text = Edit4->Text + “*”;
Filtriraj(“”,””,””,””);
}
}
//—————————————————————————
void __fastcall TForm4::Edit5KeyPress(TObject *Sender, char &Key)
{
if( Key==13 )
{
DBGrid1->SetFocus();
if(Edit5->Text==””)
Edit5->Text =””;
else
Edit5->Text = Edit5->Text + “*”;
Filtriraj(“”,””,””,””);
}
}
//—————————————————————————
Этот код прекрасно работает, каждый фильтр редактирования окна DBGrid
правильно, а также, если я хочу поместить только часть слова, которая хочет, она отлично работает, но этот фильтр работает с самого начала ячейки в DBGrid
,
Я хочу сделать фильтр, который найдет слово везде в клетке. Например, у меня есть много строк, что означает много ячеек, в одной ячейке написано "Я ПОЙДУ В ШКОЛУ", когда я набираю в окне редактирования ШКОЛА, оно должно найти мне слово ШКОЛА в моей ячейке и показать мне, что каким-то образом не имеет значения, как (выбор строки или фильтр, мне все равно).
Если кто-то знает более простой способ решить эту проблему.
2 ответа
AnsiString query;
Query1->Close();
Query1->UnPrepare();
Query1->SQL->Clear();
query="SELECT NAZIV FROM \"C:\\Users\\work\\Desktop\\New folder\\publiks.DB\" Publiks WHERE NAZIV LIKE'%" +Edit1->Text+ "%' ORDER BY NAZIV";
Query1->SQL->Add(query);
Query1->Prepare();
Query1->Open();
Я решил для одного Editbox и столбца из таблицы, используя Query, он работает, что означает поддержку парадокса LIKE
Попробуйте что-то вроде этого:
public: // User declarations
__fastcall TForm4(TComponent* Owner);
void Filtriraj();
#include <vcl.h>
#pragma hdrstop
#include “Unit4.h”
#include <StrUtils.hpp>
//-------------------------
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm4 *Form4;
//-------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------
String AddWildcardsAndQuotes(String S)
{
if( !S.IsEmpty() )
{
if( !AnsiStartsText("*", S) )
S = ("*" + S);
if( !AnsiEndsText("*", S) )
S += "*";
}
return QuotedStr(S);
}
//-------------------------
void TForm4::Filtriraj()
{
String szUslov;
if( Edit3->GetTextLen() > 0 )
{
szUslov = ("ZEMLJA = " + AddWildcardsAndQuotes(Edit3->Text));
}
if( Edit4->GetTextLen() > 0 )
{
if( !szUslov.IsEmpty() )
SzUslov += " and ";
szUslov += ("KATEGORIJA = " + AddWildcardsAndQuotes(Edit4->Text));
}
if( Edit5->GetTextLen() > 0 )
{
if( !szUslov.IsEmpty() )
szUslov += " and ";
szUslov += ("NAZIV = " + AddWildcardsAndQuotes(Edit5->Text));
}
Table3->Filter = szUslov;
Table3->Filtered = !szUslov.IsEmpty();
}
//-------------------------
// common OnChange handler assigned to Edit3, Edit4, and Edit5
void __fastcall TForm4::EditChange(TObject *Sender)
{
Filtriraj();
}
//-------------------------
// common OnKeyPress handler assigned to Edit3, Edit4, and Edit5
void __fastcall TForm4::EditKeyPress(TObject *Sender, char &Key)
{
if( Key == VK_RETURN )
{
Key = 0;
// make sure each control's TabStop is true and its TabOrder
// is logical, eg: Edit4->TabOrder is Edit3->TabOrder+1,
// Edit5->TabOrder is Edit4->TabOrder+1, and
// DBGrid1->TabOrder is Edit5-TabOrder+1
//
this->SelectNext(static_cast<TEdit*>(Sender), true, true);
Filtriraj();
}
}
//-------------------------
Обновление: альтернативно:
String AddWildcardsAndQuotes(String S)
{
if( !S.IsEmpty() )
{
S = StringReplace(S, "*", "%", TReplaceFlags() << rfReplaceAll);
S = StringReplace(S, "?", "_", TReplaceFlags() << rfReplaceAll);
if( !AnsiStartsText("%", S) )
S = ("%" + S);
if( !AnsiEndsText("%", S) )
S += "%";
}
return QuotedStr(S);
}
//-------------------------
void TForm4::Filtriraj()
{
String szUslov;
if( Edit3->GetTextLen() > 0 )
{
szUslov = ("ZEMLJA LIKE " + AddWildcardsAndQuotes(Edit3->Text));
}
if( Edit4->GetTextLen() > 0 )
{
if( !szUslov.IsEmpty() )
SzUslov += " and ";
szUslov += ("KATEGORIJA LIKE " + AddWildcardsAndQuotes(Edit4->Text));
}
if( Edit5->GetTextLen() > 0 )
{
if( !szUslov.IsEmpty() )
szUslov += " and ";
szUslov += ("NAZIV LIKE " + AddWildcardsAndQuotes(Edit5->Text));
}
Table3->Filter = szUslov;
Table3->Filtered = !szUslov.IsEmpty();
}