Une combobox qui s'affine au fur et à mesure que l'on entre des caractères

Description

Ce composant n'est pas de moi mais trouvé en Freeware sur le Net à l'adresse : "http://perso.easynet.fr/~fdeport/telechargement.htm". Je n'ai pas trouvé le nom de la personne ayant écrit ce source mais il répond exactement à mon besoin et est très util.

Ce composant est une ComboBox ameliorée. Avec la combo Delphi lorqu'on entre un caractère dans la zone de saisie le composant affiche le premier item commençant par ce caractère. Ici la recherche s'affine au fur et à mesure qu'on entre des caractères. Cette combo est complètement compatible avec celle de Borland

Source / Exemple :


unit ComboBoxRechInc;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TRmethode = (affNormal, affIncrement);

  TIncComboBox = class(TComboBox)
  private
    { Déclarations privées }
    FFonct: TRmethode;
    nMatchingLine: integer;
    Procedure Change; override;
    function FindMatchingLineWithText(s: string): integer;
    function GetSelectedText: string;
  protected
    { Déclarations protégées }
  public
    { Déclarations publiques }
    Constructor Create(Owner: TComponent); Override;
  published
    { Déclarations publiées }
    Property Affichage: TrMethode Read FFonct Write FFonct;
  end;

procedure Register;

implementation

const
  NO_MATCHING_LINE = -1;

Constructor TIncComboBox.Create(Owner: TComponent);
begin
  Inherited create(Owner);
  FFonct := affIncrement;
end;

{Evènement: Modification dans l'edit du combo}
procedure TIncComboBox.Change;
var
 iSelStart:integer;
begin
  If FFonct = affIncrement then begin
    nMatchingLine := NO_MATCHING_LINE;
    if self.text <> '' then begin
      if FindMatchingLineWithText(self.text) <> NO_MATCHING_LINE then begin
        {Si une chaîne matche on complète et on inverse la partie non saisie}
        if length(self.text) <> length(GetSelectedText) then begin
          iSelStart      := length(self.text);
          self.text      := GetSelectedText;
          self.selStart  := iSelStart;
          self.selLength := length(self.text)-iSelStart;
        end;
      end;
    end;
  end;  

  inherited Change;
end;

{Se positionner sur la bonne ligne en fonction du texte}
function TIncComboBox.FindMatchingLineWithText(s: string): integer;
begin
  nMatchingLine := NO_MATCHING_LINE;
  for Result := 0 to self.items.count - 1 do begin
    if upperCase(copy(self.items[Result],1,length(s))) <> upperCase(s) then
      continue;
    nMatchingLine := Result;
    break;
  end;
  Result := nMatchingLine;
end;

{Récupérer le texte de la ligne courante}
function TIncComboBox.GetSelectedText: string;
begin
  Result := self.items[nMatchingLine];
end;

procedure Register;
begin
  RegisterComponents('Fd Components', [TIncComboBox]);
end;

end.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.