STSRCCOM

Top  Previous  Next

{

Komponens  : TSTSearchCombo

Feladata   : Adatforrással kapcsolt kereső kombobox.

            A text mezőbe irt szöveg alapján rákeres az adatbázis index

            szerinti legközelebbi rekordjára.

            Ha Entert nyomsz, akkor a keresési szöveget felveszi a legöredülő

            listába.

Szerző      : Agócs László StellaSOFT

 

Published properties:

 

DataSource      :  A kapcsolt adatforrás

SearchType      :  SearchNone = nincs keresés;

                   SearchExact = pontos egyezésre keres;

                   SearchPartial = részegyezésere is keres folyamatosan;

IniFile         :  A keresések mentésére szolgáló INI file neve

AutoSave        :  True = Az IniFile-ból felolvassa ill. automatikusan oda

                   menti a keresési szempontokat, a Combo Items tartalmát;

                   A SECTION név = a komponens neve

                   Search1..n = 'feltételek...' a SECTION tartalma

}

 

unit StSrcCom;

 

interface

 

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Menus,

Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Inifiles;

 

type

 

TSearchType = (SearchNone, SearchExact, SearchPartial);

 

TSTSearchCombo = class(TComboBox)

private

  FDataSource : TDataSource;

  FSearchType : TSearchType;

  FIniFile: string;

  FAutoSave: boolean;

  SectionName : TComponentName;

{    procedure SetSectionName(Value : TComponentName);}

  procedure SetDataSource(Value : TDataSource);

  procedure SetAutoSave(Value: boolean);

  procedure SetIniFile(Value:string);

protected

  iniF : TIniFile;

  procedure KeyPress(var Key: Char); override;

  procedure Change; override;

public

  constructor Create(AOwner:TComponent);override;

  destructor Destroy;override;

  procedure Search;           {Keresés közvetlenül}

  procedure SaveToINI;

  function LoadFromINI(iFile,Section:string):boolean;

published

{    property Name: TComponentName read SectionName write SetSectionName;}

  property Style; {Must be published before Items}

  property Color;

  property Ctl3D;

  property DragMode;

  property DragCursor;

  property DropDownCount;

  property Enabled;

  property Font;

  property ItemHeight;

  property Items;

  property MaxLength;

  property ParentColor;

  property ParentCtl3D;

  property ParentFont;

  property ParentShowHint;

  property PopupMenu;

  property ShowHint;

  property Sorted;

  property TabOrder;

  property TabStop;

  property Text;

  property Visible;

  Property DataSource : TDataSource read FDataSource write SetDataSource;

  Property SearchType : TSearchType read FSearchType write FSearchType;

  property IniFile: string read FIniFile write SetIniFile;

  property AutoSave: boolean read FAutoSave write SetAutoSave;

  property OnChange;

  property OnClick;

  property OnDblClick;

  property OnDragDrop;

  property OnDragOver;

  property OnDrawItem;

  property OnDropDown;

  property OnEndDrag;

  property OnEnter;

  property OnExit;

  property OnKeyDown;

  property OnKeyPress;

  property OnKeyUp;

  property OnMeasureItem;

end;

 

procedure Register;

 

 

implementation

 

procedure Register;

begin                   RegisterComponents('AL',[TSTSearchCombo]);

end;

 

constructor TSTSearchCombo.Create(AOwner:TComponent);

begin

   inherited Create(AOwner);

   FDataSource := nil;

   FSearchType := searchPartial;

   FIniFile    := '';

   FAutoSave    := True;

   Text := '';

end;

 

destructor TSTSearchCombo.Destroy;

var i: integer;

begin

   If Inif<>Nil then begin

{     If AutoSave then

      If Items.Count>0 then begin

      IniF.EraseSection(SectionName);

      For i:=0 to Items.Count-1 do begin

          IniF.WriteString(SectionName, 'Search'+IntToStr(i), Items[i]);

      end;

      end;}

   IniF.Free;

   end;

   inherited Destroy;

end;

 

{

procedure TSTSearchCombo.SetSectionName(Value : TComponentName);

var szurok: TStringList;

  i: integer;

begin

   SectionName:=Value;

   If (Value<>'') and FAutoSave then begin

         szurok:=TStringlist.Create;

         IniF := TIniFile.Create(IniFile);

         IniF.ReadSection(SectionName , szurok);

         Clear;

         For i:=0 to szurok.Count-1 do begin

             Items.Add(IniF.ReadString(SectionName, szurok[i],'ERROR'));

         end;

         szurok.free;

   end;

end;

}

 

procedure TSTSearchCombo.SetAutoSave(Value: boolean);

begin

   FAutoSave := Value;

   SetIniFile(IniFile);

{     If (IniFile<>'') and FAutoSave and (Inif = Nil) then

         IniF := TIniFile.Create(IniFile)

   else IniF.Free;}

end;

 

procedure TSTSearchCombo.SetDataSource(Value : TDataSource);

begin

   If Value<>FDataSource then begin

      FDataSource := Value;

      Enabled := FDataSource <> Nil;

   end;

end;

 

procedure TSTSearchCombo.Change;

begin

   inherited Change;

   Search;

end;

 

procedure TSTSearchCombo.Search;

var ds: TDataSet;

begin

   If DataSource<>nil then begin

   ds := DataSource.DataSet;

      If Enabled then begin

         If ds is TTable then begin

            Case SearchType of

            searchExact:   (ds as TTable).FindKey([Text]);

            searchPartial: (ds as TTable).FindNearest([Text]);

            end;

         end;

         If ds is TQuery then begin

         end;

         If ds is TStoredProc then begin

         end;

      end;

   end;

end;

 

procedure TSTSearchCombo.KeyPress(var Key: Char);

begin

   inherited KeyPress(Key);

   If Key=#13 then If Items.count>0 then Items.Insert(0,Text)

      else Items.Add(Text);

end;

 

procedure TSTSearchCombo.SaveToINI;

var i: integer;

begin

 If Inif=Nil then IniF := TIniFile.Create(IniFile);

 If Items.Count>0 then begin

    IniF.EraseSection(SectionName);

    For i:=0 to Items.Count-1 do begin

        IniF.WriteString(SectionName, 'Search'+IntToStr(i), Items[i]);

    end;

 end;

end;

 

function TSTSearchCombo.LoadFromINI(iFile,Section:string):boolean;

var ifif: TIniFile;

begin

   Result := False;

   If (IFile<>'') and (Section<>'') then begin

         IfiF := TIniFile.Create(iFile);

         IfiF.ReadSection(Section , Items);

         Result := True;

   end;

   IniF.Free;

end;

 

procedure TSTSearchCombo.SetIniFile(Value:string);

var szurok: TStringList;

  i: integer;

begin

   FIniFile := Value;

   SectionName:=Name;

   If (Value<>'') and FAutoSave then begin

         szurok:=TStringlist.Create;

         IniF := TIniFile.Create(IniFile);

         IniF.ReadSection(SectionName , szurok);

         Clear;

         For i:=0 to szurok.Count-1 do begin

             Items.Add(IniF.ReadString(SectionName, szurok[i],'ERROR'));

         end;

         szurok.free;

   end;

end;

 

end.