0

在这种形式中,我使用的是Table1(三列“ZEMLJA”、“KATEGORIJA”和“NAZIV”)并DataSource1连接到 paradox 7 数据库。也DBGrid1连接到DataSource1. 这里还有三个编辑框(Edit1Edit2Edit3

在头文件中我放:

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.

我想制作一个过滤器,它可以在单元格的任何地方找到单词。例如,我有很多行,这意味着很多单元格,在一个单元格中写着“我将在明天去学校”,当我在编辑框 SCHOOL 中输入时,它应该在我的单元格中找到我的单词 SCHOOL 并告诉我在某种程度上无关紧要(行选择器或过滤器我不在乎)。

如果有人知道解决此问题的更简单方法。

4

2 回答 2

0

尝试更多类似的东西:

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();
}
于 2015-01-01T06:47:27.750 回答
0
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();

我使用 Query 解决了 Table 中的一个 Editbox 和列,它可以工作,这是否意味着悖论支持 LIKE

于 2015-01-06T07:14:29.467 回答