2010-10-22 5 views
2

Existe-t-il un moyen d'accéder au texte entré dans une barre de recherche Devart (Core Lab) TCRDBGrid?Comment accéder au texte de recherche dans un composant TCRDBGrid?

J'ai essayé d'implémenter l'événement OnKeyDown mais l'événement ne s'est pas produit lors de l'entrée dans les champs de recherche, uniquement lorsque la grille elle-même a été sélectionnée. Il n'y a pas d'autres événements qui semblent pertinents.

Le texte semble entrer dans un TEdit qui fait partie d'un TCRGridTitleEdit, qui fait partie de TCRDBGrid mais est privé.

Existe-t-il un moyen d'obtenir le texte recherché?

Exemple TCFGBGrid:

+---------+------------+ 
| UserId | UserName | <- Column titles 
+---------+------------+ 
|[987654] | [  ] | <- Search bar (searching for UserId 987654) 
+---------+------------+ 
| 123456 | Wile Cau | <- Data 
+---------+------------+ 
| ... | ...  | <- More data 

Si UserId 987654 n'existe pas, je veux inviter quelque chose comme "Créer un nouvel utilisateur 987654?" et potentiellement créer un nouvel enregistrement avec UserId défini sur 987654.

Répondre

3

TCRDBGrid est distribué avec le code source. Vous pouvez modifier le code source:

déclare le type d'événement:

TOnTextChanged = procedure (Sender: TObject; Text: string) of object; 

ajouter la déclaration d'événement dans la classe TCRGridTitleEdit:

private 
    FOnFilterChanged: TOnTextChanged; 
    FOnSearchChanged: TOnTextChanged; 

public 
    property OnFilterChanged: TOnTextChanged read FOnFilterChanged write FOnFilterChanged; 
    property OnSearchChanged: TOnTextChanged read FOnSearchChanged write FOnSearchChanged; 

appel à cet événement dans la procédure de ProcessEdit:

procedure TCRGridTitleEdit.ProcessEdit; 
begin 
    if (FActiveColumn = nil) or (CRDBGrid = nil) or not FEdit.Modified then 
    Exit; 

    if FAsFilter then 
    with CRDBGrid do begin 
     try 
     TCRColumn(FActiveColumn).GetFilterExpression(FEdit.Text); 
     FFilterExpressions[FActiveColumn.Index] := FEdit.Text; 
     Self.Caption := FFilterExpressions[FActiveColumn.Index]; 
     if Assigned(FOnFilterChanged) then 
      FOnFilterChanged(self, FEdit.Text); 
     except 
     on EConvertError do begin 
      FEdit.SelectAll; 
      raise; 
     end; 
     end; 
    end 
    else 
    try 
     with FActiveColumn.Field do 
     DataSet.Locate(FieldName, {$IFDEF CLR}Variant{$ENDIF}(FEdit.Text), [loCaseInsensitive,loPartialKey]); 
     if Assigned(FOnSearchChanged) then 
     FOnSearchChanged(self, FEdit.Text); 
    except 
     on EConvertError do 
     Exit; 
    end; 
end; 

et ajouter une déclaration d'événement dans la classe TCRDBGrid:

private 
    function GetOnFilterChanged: TOnTextChanged; 
    procedure SetOnFilterChanged(Value: TOnTextChanged); 
    function GetOnSearchChanged: TOnTextChanged; 
    procedure SetOnSearchChanged(Value: TOnTextChanged); 

published 
    property OnFilterChanged: TOnTextChanged read GetOnFilterChanged write SetOnFilterChanged; 
    property OnSearchChanged: TOnTextChanged read GetOnSearchChanged write SetOnSearchChanged; 

mise en œuvre

function TCRDBGrid.GetOnFilterChanged: TOnTextChanged; 
begin 
    Result := CRGridTitleEdit.OnFilterChanged; 
end; 

procedure TCRDBGrid.SetOnFilterChanged(Value: TOnTextChanged); 
begin 
    CRGridTitleEdit.OnFilterChanged := Value; 
end; 

function TCRDBGrid.GetOnSearchChanged: TOnTextChanged; 
begin 
    Result := CRGridTitleEdit.OnSearchChanged; 
end; 

procedure TCRDBGrid.SetOnSearchChanged(Value: TOnTextChanged); 
begin 
    CRGridTitleEdit.OnSearchChanged := Value; 
end; 
+0

merci d'inclure le code dans votre réponse, très apprécié :) – WileCau

Questions connexes