⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sybcombobox.pas

📁 sybase大全
💻 PAS
字号:
unit sybcombobox;

interface

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

type
  SybObjectname = string[30];
  string30      = string[30];

type
  Tsybobjectproperty = class(TStringProperty)
  public
    procedure GetValues(TheProc: TGetStrProc); override;
    function getattributes:Tpropertyattributes; override;
  end;

type
  Tstringsproperty = class(TPropertyEditor)
  public
    function getvalue:string; override;
    procedure setvalue(const value :string); override;
    procedure edit;override;
    function getattributes:Tpropertyattributes; override;
  end;

type
  TSybComboBox = class(TComboBox)
  private
    { Private declarations }
    FSql         :ansistring;
    FTablename   :SybObjectname;
    Ffieldname   :SybObjectname;
    FDbname      :SybObjectname;
    FDesignActive:boolean;
    FRowsReturned:boolean;
    FAutoDbProc  :boolean;
    FAutoSize    :boolean;
    FDbProc      :integer;
    fcomp_type   :string30;
    procedure SetAutoDbProc(Value :boolean);
    procedure SetAutoSize(Value :boolean);
    procedure SetDbProc(Value :integer);
    procedure SetSql(Value :ansistring);
    procedure Settablename(Value :SybObjectname);
    procedure Setfieldname(Value :SybObjectname);
    procedure SetDbName(Value :SybObjectname);
    procedure SetDesignActive(Value :boolean);
    procedure SetRowsReturned(Value :boolean);
    function getvalue:string;
    procedure setvalue(value:string);
  protected
    { Protected declarations }
    procedure get_dbproc;
  public
    { Public declarations }
    SqlCommand:array[0..4096] of char;
    Login,Retcode,retcode2,nocols,col:integer;
    dbprocc:integer;
    tablenm,fieldnm:SybObjectname;
    property comp_type:string30 read fcomp_type;
    constructor create(AOwner:TComponent); override;
    destructor destroy; override;
    procedure addsql(Value :ansistring);
    procedure clearsql;
    function sqlexec:integer;
    procedure setname(const NewName:Tcomponentname); override;
    procedure LoadSqlFromFile(FileName :string);
  published
    { Published declarations }
    property DbName :SybObjectname read FDbName write setDbname;
    property Sql :ansistring read FSql write SetSql;
    property TableName :SybObjectname read FTableName write settablename;
    property FieldName :SybObjectname read FFieldName write setfieldname;
    property AutoDbProc:boolean read FAutoDbProc write SetAutoDbProc default true;
    property AutoSize:boolean read FAutoSize write SetAutoSize default false;
    property DesignActive:boolean read fdesignactive write setdesignactive stored false;
    property RowsReturned:boolean read fRowsReturned write setRowsReturned default false;
    property DbProc:integer read FDbproc write SetDbProc default 0;
    property Value:string read getvalue write setvalue;
  end;

procedure Register;

implementation
uses sybase32,
     objectlistdlg,
     ansistringedit,
     sybase_components,
     sybdatabase;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(SybObjectname),Tsybcombobox,'',Tsybobjectproperty);
  RegisterPropertyEditor(TypeInfo(AnsiString),TSybComboBox,'Sql',TstringsProperty);
  RegisterComponents('Sybase DBLIB', [Tsybcombobox]);
end;

constructor Tsybcombobox.create(AOwner:TComponent);
begin
  inherited create(AOwner);
  fcomp_type:='combobox';
  text:='';
  Fdesignactive:=false;
  Fautodbproc:=true;
  Fautosize:=false;
  Fdbproc:=0;
  if sybase_components.comboboxList = nil then
  begin
    sybase_components.comboboxlist:=TList.create;
  end;
end;

destructor tsybcombobox.destroy;
begin
  comboboxlist.remove(self);
  inherited destroy;
end;

function TSybcombobox.getvalue:string;
begin
  result:=text;
end;

procedure TSybcombobox.setvalue(value:string);
var i :integer;
begin
  for i:=0 to items.count-1 do
  begin
    if items[i]=value then
    begin
      itemindex:=i;
      exit;
    end;
  end;
  text:=value;
end;

procedure Tsybcombobox.setname(const NewName:Tcomponentname);
var oldname :Tcomponentname;
begin
  oldname:=name;
  inherited setname(NewName);
  if comboboxlist.indexof(self) = -1 then
    comboboxlist.add(self)
  else
  begin
    comboboxlist.items[comboboxlist.indexof(self)]:=self;
  end;
end;

procedure TSybcombobox.SetAutoDbPRoc(Value :boolean);
begin
  FAutoDbProc:=value;
end;

procedure TSybcombobox.SetAutoSize(Value :boolean);
begin
  FAutoSize:=value;
end;

procedure tsybcombobox.SetDbProc(Value :integer);
begin
  FDbproc:=Value;
  Dbprocc:=Value;
end;

procedure Tsybcombobox.SetSql(Value :ansistring);
begin
  FSql:=Value;
end;

procedure Tsybcombobox.SetRowsReturned(Value:boolean);
begin
  FRowsReturned:=value;
end;

procedure Tsybcombobox.Setdesignactive(Value :boolean);
begin
  if value then
  begin
    get_dbproc;
    if (length(sql) > 1)
      or ((length(ftablename)>0) and (length(ffieldname)>0)) then
    sqlexec;
  end;
  Fdesignactive:=Value;
end;

procedure Tsybcombobox.addsql(Value :ansistring);
begin
  FSql:=FSql + Value;
end;

procedure Tsybcombobox.clearsql;
begin
  FSql:='';
end;

function Tsybcombobox.sqlexec:integer;
var value    :string[255];
    rows     :integer;
    p        :pchar;
    maxwdth  :integer;
begin
  get_dbproc;
  if dbprocc = 0 then
    exit;
  maxwdth:=round(width/font.size);
  clear;
  if length(Fsql) = 0 then
    Fsql:='select ' + FFieldName + ' from ' + FTableName;
  p:=pchar(FSql);
  Retcode := dbcmd(dbProc,p);
  Retcode := Dbsqlexec(dbProcc);
  Retcode := dbresults(dbProcc);

  rows:=dbrows(dbProc);
  if rows = fail then
    setrowsreturned(false)
  else
    setrowsreturned(true);

  Result:=retcode;
  retcode2:=0;
  while (retcode <> No_more_results) and (retcode <> Fail) do
  begin
    if retcode = Succeed then
    begin
      retcode2 := dbnextrow(dbProcc);
      while retcode2 <> No_More_Rows do
      Begin
        if fautosize then
        begin
          if length(strpas(dbvalue(dbProcc,1))) > maxwdth then
            maxwdth:=length(strpas(dbvalue(dbProcc,1)));
        end;
        items.add(strpas(dbvalue(dbProcc,1)));
        retcode2 := dbnextrow(dbProcc);
        result:=retcode2;
      end;
    end;
    Retcode := dbresults(dbprocc);
  end;
  if fautosize then
  begin
    width:=maxwdth * font.size+10;
  end;
  if items.count>0 then
  begin
    itemindex:=0;
  end;
end;

procedure Tsybcombobox.Settablename(Value :SybObjectname);
begin
  Ftablename:=value;
  tablenm:=value;
end;

procedure Tsybcombobox.Setfieldname(Value :SybObjectname);
begin
  Ffieldname:=value;
  fieldnm:=value;
end;

procedure Tsybcombobox.SetDbname(Value :SybObjectname);
begin
  FDbname:=value;
  get_dbproc;
end;

procedure tsybcombobox.LoadSqlFromFile(FileName :string);
begin
  clearsql;
  sql:=sybase_components.LoadFromFile(FileName);
end;

procedure Tsybobjectproperty.GetValues(TheProc: TGetStrProc);
var
  SqlCommand:array[0..4096] of char;
  Login,Retcode,retcode2,i:integer;
  dbname    :SybObjectname;
  s         :string[255];
  proc      :integer;
  tslist    :tsybcombobox;
  adatabase :tsybdatabase;
begin
  tslist:=tsybcombobox(getcomponent(0));
  proc:=tslist.dbproc;

  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
  else
  if proc > 0 then
  begin
    if getname = 'TableName' then
      strpcopy(Sqlcommand,'select name from sysobjects where type in ("U","S") order by name')
    else
    begin
      s:='select sc.name from syscolumns sc,sysobjects so where sc.id=so.id and so.name="'+tslist.tablenm+'"';
      strpcopy(Sqlcommand,s);
    end;
    Retcode := dbcmd(proc,@Sqlcommand);
    Retcode := Dbsqlexec(proc);
    Retcode := dbresults(proc);
    retcode2:=0;
    while (retcode <> No_more_results) and (retcode <> Fail) do
    begin
      if retcode = Succeed then
      begin
        retcode2 := dbnextrow(proc);
        while retcode2 <> No_More_Rows do
        Begin
          theproc(strpas(dbvalue(proc,1)));
          retcode2 := dbnextrow(proc);
        end;
      end;
      Retcode := dbresults(proc);
    end;
  end;
end;

function Tsybobjectproperty.getattributes:Tpropertyattributes;
begin
  Result := [paValueList,paAutoUpdate,paMultiSelect];
end;

procedure Tsybcombobox.get_dbproc;
var i         :integer;
    adatabase :tsybdatabase;
begin
  if not autodbproc then
    exit;
  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;

function Tstringsproperty.getvalue:string;
begin
  result:=getstrvalue;
end;

procedure Tstringsproperty.setvalue(const value:string);
begin
  setstrvalue(value);
end;

procedure Tstringsproperty.edit;
var
  OKBottomDlg: TOKBottomDlg;
begin
  OKBottomDlg:=TOKBottomDlg.create(nil);
  OKBottomDlg.memo.text:=getstrvalue;
  OKBottomDlg.showmodal;
  if OKBottomDlg.modalresult = mrok then
  begin
    setstrvalue(OKBottomDlg.memo.text);
  end;
end;

function Tstringsproperty.getattributes:Tpropertyattributes;
begin
  result:=[padialog];
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -