www.pudn.com > sybase_dblib4.zip > sybnavigator.pas


unit sybnavigator; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  ExtCtrls,dsgnintf,sybdatabase,buttons; 
 
type 
  SybObjectname = string[30]; 
 
type 
  Tsybobjectproperty = class(TStringProperty) 
  public 
    procedure GetValues(TheProc: TGetStrProc); override; 
    function getattributes:Tpropertyattributes; override; 
  end; 
 
type 
  TSybNavigator = class(TPanel) 
  private 
    { Private declarations } 
    FShowHint    :boolean; 
    FHintsList   :TStrings; 
    FDbname      :SybObjectname; 
    FDesignActive:boolean; 
    FDbProc      :integer; 
    fparent      :tcomponent; 
{    ftablename   :SybObjectname;} 
    fdataset     :SybObjectname; 
    FAutoDbProc  :boolean; 
{    procedure Settablename(Value :SybObjectname);} 
    procedure Setdataset(Value :SybObjectname); 
    procedure SetDbProc(Value :integer); 
    procedure SetAutoDbProc(Value :boolean); 
    procedure SetDbName(Value :SybObjectname); 
    procedure SetDesignActive(Value :boolean); 
    procedure setshowhint(value:boolean); 
    procedure sethintslist(value:tstrings); 
    procedure firstclick(Sender:TObject); 
    procedure nextclick(Sender:TObject); 
    procedure priorclick(Sender:TObject); 
    procedure lastclick(Sender:TObject); 
  protected 
    { Protected declarations } 
  public 
    { Public declarations } 
    btnfirst, 
    btnprior, 
    btnnext, 
    btnlast, 
    btninsert, 
    btndelete, 
    btnedit, 
    btnpost, 
    btncancel, 
    btnrefresh :tspeedbutton; 
    constructor create(AOwner :TComponent); override; 
    destructor destroy; override; 
    procedure loaded; override; 
    procedure get_dbproc; 
    procedure setname(const NewName:Tcomponentname); override; 
  published 
    { Published declarations } 
    property DbName :SybObjectname read FDbName write setDbname; 
    property DesignActive:boolean read fdesignactive write setdesignactive stored false; 
    property DbProc:integer read FDbproc write SetDbProc default 0; 
    property AutoDbProc:boolean read FAutoDbProc write SetAutoDbProc default true; 
    property ShowHint:boolean read fshowhint write setshowhint default false; 
    property HintsList:TStrings read FHintsList write sethintslist; 
{    property TableName :SybObjectname read FTableName write settablename;} 
    property DataSet :SybObjectname read FDataSet write setdataset; 
  end; 
 
procedure Register; 
 
implementation 
uses sybtable, 
     sybquery, 
     sybase_components; 
 
{$R NAVIGATOR} 
 
procedure Register; 
begin 
  RegisterPropertyEditor(TypeInfo(SybObjectname),TSybNavigator,'',Tsybobjectproperty); 
  RegisterComponents('Sybase DBLIB', [TSybNavigator]); 
end; 
 
procedure Tsybobjectproperty.GetValues(TheProc: TGetStrProc); 
var 
  dbname    :SybObjectname; 
  thisform  :tform; 
  adatabase :tsybdatabase; 
  tnav      :tsybnavigator; 
  i         :integer; 
begin 
  tnav:=tsybnavigator(getcomponent(0)); 
  thisform:=tform(tnav.owner); 
  if getname = 'DbName' then 
  begin 
    if databaseslist <> nil then 
      for i:=0 to (sybase_components.databaseslist.count-1) do 
      begin 
        adatabase:=databaseslist[i]; 
        theproc(adatabase.name); 
      end; 
  end; 
  if getname = 'DataSet' then 
  begin 
    for i := 0 to thisform.ComponentCount - 1 do 
    begin 
      with thisform.Components[i] do { as TControl) do} 
      begin 
        if thisform.Components[i] is TSybTable then 
         theproc(thisform.Components[i].name); 
        if thisform.Components[i] is TSybQuery then 
         theproc(thisform.Components[i].name); 
      end; 
    end; 
  end; 
 
end; 
 
function Tsybobjectproperty.getattributes:Tpropertyattributes; 
begin 
  Result := [paValueList,paAutoUpdate,paMultiSelect]; 
end; 
 
constructor TSybNavigator.create(AOwner :TComponent); 
var i       :integer; 
    resname :string; 
begin 
  inherited create(AOwner); 
 
  if navigatorlist = nil then 
  begin 
    navigatorlist:=TList.create; 
  end; 
 
  caption:=''; 
  height:=25; 
  width:=250; 
  fparent:=aowner; 
  Fdesignactive:=false; 
  Fdbproc:=0; 
  Fautodbproc:=true; 
  fshowhint:=false; 
 
{  if tablelist <> nil then 
  begin 
    for i:=0 to tablelist.count-1 do 
      if tsybtable(tablelist[i]).name = tablename then 
      begin 
        table:=tsybtable(tablelist[i]); 
        break; 
      end; 
    end 
    else 
      table:=tsybtable.create(nil);} 
 
  btnfirst:=tspeedbutton.create(self); 
  btnfirst.caption:=''; 
  btnfirst.name:='btn_first'; 
  btnfirst.height:=25; 
  btnfirst.width:=25; 
  btnfirst.left:=0; 
  btnfirst.parent:=self; 
  btnfirst.glyph.Handle := LoadBitmap(HInstance,'SYBN_FIRST'); 
  btnfirst.onclick:=firstclick; 
 
  btnprior:=tspeedbutton.create(self); 
  btnprior.caption:=''; 
  btnprior.name:='btn_prior'; 
  btnprior.height:=25; 
  btnprior.width:=25; 
  btnprior.left:=25; 
  btnprior.parent:=self; 
  btnprior.glyph.Handle := LoadBitmap(HInstance,'SYBN_PRIOR'); 
  btnprior.onclick:=priorclick; 
 
  btnnext:=tspeedbutton.create(self); 
  btnnext.caption:=''; 
  btnnext.name:='btn_next'; 
  btnnext.height:=25; 
  btnnext.width:=25; 
  btnnext.left:=50; 
  btnnext.parent:=self; 
  btnnext.glyph.Handle := LoadBitmap(HInstance,'SYBN_NEXT'); 
  btnnext.onclick:=nextclick; 
 
  btnlast:=tspeedbutton.create(self); 
  btnlast.caption:=''; 
  btnlast.name:='btn_last'; 
  btnlast.height:=25; 
  btnlast.width:=25; 
  btnlast.left:=75; 
  btnlast.parent:=self; 
  btnlast.glyph.Handle := LoadBitmap(HInstance,'SYBN_LAST'); 
  btnlast.onclick:=lastclick; 
 
  btninsert:=tspeedbutton.create(self); 
  btninsert.caption:=''; 
  btninsert.name:='btn_insert'; 
  btninsert.height:=25; 
  btninsert.width:=25; 
  btninsert.left:=100; 
  btninsert.parent:=self; 
  btninsert.glyph.Handle := LoadBitmap(HInstance,'SYBN_INSERT'); 
 
  btndelete:=tspeedbutton.create(self); 
  btndelete.caption:=''; 
  btndelete.name:='btn_delete'; 
  btndelete.height:=25; 
  btndelete.width:=25; 
  btndelete.left:=125; 
  btndelete.parent:=self; 
  btndelete.glyph.Handle := LoadBitmap(HInstance,'SYBN_DELETE'); 
 
  btnedit:=tspeedbutton.create(self); 
  btnedit.caption:=''; 
  btnedit.name:='btn_edit'; 
  btnedit.height:=25; 
  btnedit.width:=25; 
  btnedit.left:=150; 
  btnedit.parent:=self; 
  btnedit.glyph.Handle := LoadBitmap(HInstance,'SYBN_EDIT'); 
 
  btnpost:=tspeedbutton.create(self); 
  btnpost.caption:=''; 
  btnpost.name:='btn_post'; 
  btnpost.height:=25; 
  btnpost.width:=25; 
  btnpost.left:=175; 
  btnpost.parent:=self; 
  btnpost.glyph.Handle := LoadBitmap(HInstance,'SYBN_POST'); 
 
  btncancel:=tspeedbutton.create(self); 
  btncancel.caption:=''; 
  btncancel.name:='btn_cancel'; 
  btncancel.height:=25; 
  btncancel.width:=25; 
  btncancel.left:=200; 
  btncancel.parent:=self; 
  btncancel.glyph.Handle := LoadBitmap(HInstance,'SYBN_CANCEL'); 
 
  btnrefresh:=tspeedbutton.create(self); 
  btnrefresh.caption:=''; 
  btnrefresh.name:='btn_refresh'; 
  btnrefresh.height:=25; 
  btnrefresh.width:=25; 
  btnrefresh.left:=225; 
  btnrefresh.parent:=self; 
  btnrefresh.glyph.Handle := LoadBitmap(HInstance,'SYBN_REFRESH'); 
 
  for i:=0 to 9 do 
    tspeedbutton(components[i]).enabled:=false; 
 
  btninsert.enabled:=true; 
 
  fhintslist:=tstringlist.create; 
  fhintslist.add('First record'); 
  fhintslist.add('Prior record'); 
  fhintslist.add('Next record'); 
  fhintslist.add('Last record'); 
  fhintslist.add('Insert record'); 
  fhintslist.add('Delete record'); 
  fhintslist.add('Edit'); 
  fhintslist.add('Post edit'); 
  fhintslist.add('Cancel update'); 
  fhintslist.add('Refresh data'); 
 
end; 
 
destructor TSybNavigator.destroy; 
begin 
  navigatorlist.remove(self); 
  inherited destroy; 
end; 
 
procedure TSybNavigator.setname(const NewName:Tcomponentname); 
begin 
  inherited setname(NewName); 
  if navigatorlist.indexof(self) = -1 then 
    navigatorlist.add(self) 
  else 
  begin 
    navigatorlist.items[navigatorlist.indexof(self)]:=self; 
  end; 
end; 
 
procedure TSybNavigator.loaded; 
begin 
  inherited loaded; 
 
  btnfirst.hint:=fhintslist[0]; 
  btnprior.hint:=fhintslist[1]; 
  btnnext.hint:=fhintslist[2]; 
  btnlast.hint:=fhintslist[3]; 
  btninsert.hint:=fhintslist[4]; 
  btndelete.hint:=fhintslist[5]; 
  btnedit.hint:=fhintslist[6]; 
  btnpost.hint:=fhintslist[7]; 
  btncancel.hint:=fhintslist[8]; 
  btnrefresh.hint:=fhintslist[9]; 
 
end; 
 
procedure TSybNavigator.SetDataSet(Value :SybObjectname); 
begin 
  Fdataset:=value; 
end; 
 
procedure TSybNavigator.setshowhint(value:boolean); 
var i   :integer; 
begin 
  fshowhint:=value; 
  for i:=0 to 9 do 
  begin 
    tspeedbutton(components[i]).showhint:=value; 
    tspeedbutton(components[i]).parentshowhint:=false; 
  end; 
end; 
 
procedure TSybNavigator.sethintslist(value:tstrings); 
begin 
  fhintslist.assign(value); 
end; 
 
procedure TSybNavigator.SetDbname(Value :SybObjectname); 
begin 
  FDbname:=value; 
  get_dbproc; 
end; 
 
procedure TSybNavigator.SetDbProc(Value :integer); 
begin 
  FDbproc:=Value; 
end; 
 
procedure TSybNavigator.Setdesignactive(Value :boolean); 
begin 
  if value then 
  begin 
    get_dbproc; 
  end; 
  Fdesignactive:=Value; 
end; 
 
procedure TSybNavigator.get_dbproc; 
var i         :integer; 
    adatabase :tsybdatabase; 
begin 
  if databaseslist <> nil then 
    for i:=0 to (databaseslist.count-1) do 
    begin 
      adatabase:=databaseslist[i]; 
      if FDbName = adatabase.name then 
      begin 
        setdbproc(adatabase.dbproc); 
        break; 
      end; 
  end; 
end; 
 
procedure TSybNavigator.SetAutoDbPRoc(Value :boolean); 
begin 
  FAutoDbProc:=value; 
end; 
 
procedure TSybNavigator.firstclick(Sender:TObject); 
var table :tsybtable; 
    query :tsybquery; 
    i     :integer; 
begin 
  if tablelist<> nil then 
  begin 
    for i:=0 to tablelist.count-1 do 
    begin 
      if tsybtable(tablelist[i]).name=dataset then 
      begin 
        table:=tsybtable(tablelist[i]); 
        break; 
      end; 
    end; 
  end; 
  if querylist<> nil then 
  begin 
    for i:=0 to querylist.count-1 do 
    begin 
      if tsybquery(querylist[i]).name=dataset then 
      begin 
        query:=tsybquery(querylist[i]); 
        break; 
      end; 
    end; 
  end; 
  if (table <> nil) and (tablelist<>nil) then 
  begin 
    table.firstrow; 
  end; 
  if (query <> nil) and (querylist<>nil) then 
  begin 
    query.firstrow; 
  end; 
end; 
 
procedure TSybNavigator.priorclick(Sender:TObject); 
var table :tsybtable; 
    query :tsybquery; 
    i     :integer; 
begin 
  if (tablelist = nil) and (querylist = nil) then 
    exit; 
 
  if tablelist <> nil then 
    table:=tsybtable.create(nil); 
  if querylist <> nil then 
    query:=tsybquery.create(nil); 
 
  if tablelist<> nil then 
  begin 
    for i:=0 to tablelist.count-1 do 
      if tsybtable(tablelist[i]).name=dataset then 
      begin 
        table:=tsybtable(tablelist[i]); 
        break; 
      end; 
  end; 
  if querylist<> nil then 
  begin 
    for i:=0 to querylist.count-1 do 
      if tsybquery(querylist[i]).name=dataset then 
      begin 
        query:=tsybquery(querylist[i]); 
        break; 
      end; 
  end; 
  if (table <> nil) and (tablelist<>nil) then 
  begin 
    table.prevrow; 
  end; 
  if (query <> nil) and (querylist<>nil) then 
  begin 
    query.prevrow; 
  end; 
end; 
 
procedure TSybNavigator.nextclick(Sender:TObject); 
var table :tsybtable; 
    query :tsybquery; 
    i     :integer; 
begin 
  if (tablelist = nil) and (querylist = nil) then 
    exit; 
 
  if tablelist <> nil then 
  begin 
    table:=tsybtable.create(nil); 
  end; 
  if querylist <> nil then 
  begin 
    query:=tsybquery.create(nil); 
  end; 
 
  if tablelist<> nil then 
  begin 
    for i:=0 to tablelist.count-1 do 
      if tsybtable(tablelist[i]).name=dataset then 
      begin 
        table:=tsybtable(tablelist[i]); 
        break; 
      end; 
  end; 
  if querylist<> nil then 
  begin 
    for i:=0 to querylist.count-1 do 
    begin 
      if tsybquery(querylist[i]).name=fdataset then 
      begin 
        query:=tsybquery(querylist[i]); 
        break; 
      end; 
    end; 
  end; 
  if (table <> nil) and (tablelist<>nil) then 
  begin 
    table.nextrow; 
  end; 
  if (query <> nil) and (querylist<>nil) then 
  begin 
    query.nextrow; 
  end; 
end; 
 
procedure TSybNavigator.lastclick(Sender:TObject); 
var table :tsybtable; 
    query :tsybquery; 
    i     :integer; 
begin 
  if (tablelist = nil) and (querylist = nil) then 
    exit; 
 
  if tablelist <> nil then 
    table:=tsybtable.create(nil); 
  if querylist <> nil then 
    query:=tsybquery.create(nil); 
 
  if tablelist<> nil then 
  begin 
    for i:=0 to tablelist.count-1 do 
      if tsybtable(tablelist[i]).name=dataset then 
      begin 
        table:=tsybtable(tablelist[i]); 
        break; 
      end; 
  end; 
  if querylist<> nil then 
  begin 
    for i:=0 to querylist.count-1 do 
      if tsybquery(querylist[i]).name=dataset then 
      begin 
        query:=tsybquery(querylist[i]); 
        break; 
      end; 
  end; 
  if (table <> nil) and (tablelist<>nil) then 
  begin 
    table.lastrow; 
  end; 
  if (query <> nil) and (querylist<>nil) then 
  begin 
    query.lastrow; 
  end; 
end; 
 
end.