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

📄 qbuilder.pas

📁 TxQuery is an SQL engine implemented in a TDataSet descendant component, that can parse SQL syntax,
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{*******************************************************}
{                                                       }
{       Delphi Visual Component Library                 }
{       Open QBuilder Dialog component                  }
{                                                       }
{       Copyright (c) 1996-99 Sergey Orlik              }
{                                                       }
{     Written by:                                       }
{       Sergey Orlik and Alfonso Moreno                 }
{       product manager                                 }
{       Russia, C.I.S. and Baltic States (former USSR)  }
{       Inprise Moscow office                           }
{       Internet:  sorlik@inprise.ru                    }
{       www.geocities.com/SiliconValley/Way/9006/       }
{                                                       }
{*******************************************************}

{$HINTS OFF}

{$R QBButton.res}
unit QBuilder;

{$I xq_flag.inc}
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, ExtCtrls, StdCtrls, ComCtrls, ToolWin, Menus, CheckLst, Grids,
  DB, DBGrids, SyntaxHi, xqmiscel;

type
  TOQBbutton = (bOpenDialog, bSaveDialog, bRunQuery);
  TOQBbuttons = set of TOQBbutton;

  TOQBEngine = class;

  TOQBuilderDialog = class(TComponent)
  private
    FOQBForm : TForm;
    FSQL : TStrings;
    FOQBEngine: TOQBEngine;
    FShowButtons: TOQBbuttons;
    procedure SetOQBEngine(const Value: TOQBEngine);
    procedure SetShowButtons(const Value: TOQBbuttons);
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Execute: Boolean; virtual;
    property SQL: TStrings read FSQL;
  published
    property OQBEngine: TOQBEngine read FOQBEngine write SetOQBEngine;
    property ShowButtons: TOQBbuttons read FShowButtons write SetShowButtons
      default [bOpenDialog, bSaveDialog, bRunQuery];
    property OQBForm : TForm read FOQBForm;
  end;

  TOQBEngine = class(TComponent)
  private
    FDatabaseName: string;
    FUserName: string;
    FPassword: string;
    FTableList : TStringList;
    FAliasList : TStringList;
    FFieldList : TStringList;
    FSQL: TStringList;
    FSQLcolumns: TStringList;
    FSQLcolumns_table: TStringList;
    FSQLcolumns_func: TStringList;
    FSQLfrom: TStringList;
    FSQLwhere: TStringList;
    FSQLgroupby: TStringList;
    FSQLorderby: TStringList;
    FUseTableAliases: boolean;
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    procedure SetDatabaseName(const Value: string); virtual;
    procedure SetUserName(const Value: string); virtual;
    procedure SetPassword(const Value: string); virtual;
    procedure SetQuerySQL(Value: string); virtual; abstract;
    procedure GenerateAliases;
    procedure ReadTableList; virtual; abstract;
    procedure ReadFieldList(ATableName: string); virtual; abstract;
  public
    FOQBDialog : TOQBuilderDialog;
    TableName : string;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function  SelectDatabase: boolean; virtual; abstract;
    function  GenerateSQL : string; virtual; // is not abstract !!!
    procedure ClearQuerySQL; virtual; abstract;
    function  ResultQuery : TDataSet; virtual; abstract;
    procedure OpenResultQuery; virtual; abstract;
    procedure CloseResultQuery; virtual; abstract;
    procedure SaveResultQueryData; virtual; abstract;
    property  TableList : TStringList read FTableList;
    property  AliasList : TStringList read FAliasList;
    property  FieldList : TStringList read FFieldList;
    property  SQL : TStringList read FSQL;
    property  SQLcolumns : TStringList read FSQLcolumns;
    property  SQLcolumns_table : TStringList read FSQLcolumns_table;
    property  SQLcolumns_func : TStringList read FSQLcolumns_func;
    property  SQLfrom : TStringList read FSQLfrom;
    property  SQLwhere : TStringList read FSQLwhere;
    property  SQLgroupby : TStringList read FSQLgroupby;
    property  SQLorderby : TStringList read FSQLorderby;

    property UseTableAliases : boolean read FUseTableAliases write FUseTableAliases default true;
  end;

type
  TArr = array [0..0] of integer;
  PArr = ^TArr;

  TOQBLbx = class(TCheckListBox)
  private
    FArrBold : PArr;
    FLoading : boolean;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DrawItem;
    procedure WMLButtonDown(var Message: TWMLButtonDblClk); message WM_LButtonDown;
    procedure WMRButtonDown(var Message: TWMRButtonDblClk); message WM_RButtonDown;
    function  GetCheckW: Integer;
    procedure AllocArrBold;
    procedure SelectItemBold(Item:integer);
    procedure UnSelectItemBold(Item:integer);
    function  GetItemY(Item:integer):integer;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ClickCheck; override;
  end;

  TOQBTable = class(TPanel)
  private
    ScreenDC : HDC;
    OldX,
    OldY,
    OldLeft,
    OldTop   : Integer;
    ClipRgn  : HRGN;
    ClipRect,
    MoveRect : TRect;
    Moving   : Boolean;
    FCloseBtn,
    FUnlinkBtn : TSpeedButton;
    FLbx : TOQBLbx;
    FTableName : string;
    FTableAlias : string;
    PopMenu : TPopupMenu;
    procedure WMRButtonDown(var Message: TWMRButtonDblClk); message WM_RButtonDown;
    function  Activate(const ATableName:string; X,Y:Integer):boolean;
    function  GetRowY(FldN:integer):integer;
    procedure _CloseBtn(Sender: TObject);
    procedure _UnlinkBtn(Sender: TObject);
    procedure _SelectAll(Sender: TObject);
    procedure _UnSelectAll(Sender: TObject);
    procedure _DragOver(Sender, Source: TObject; X, Y: Integer;
                            State: TDragState; var Accept: Boolean);
    procedure _DragDrop(Sender, Source: TObject; X, Y: Integer);
  protected
    procedure SetParent(AParent: TWinControl); override;
    procedure MouseDown(Button:TMouseButton; Shift:TShiftState; X,Y:Integer); override;
    procedure MouseMove(Shift:TShiftState; X,Y:Integer); override;
    procedure MouseUp(Button:TMouseButton; Shift:TShiftState; X,Y:Integer); override;
    property Align;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
  end;

  TOQBLink = class(TShape)
  private
    Tbl1,
    Tbl2 : TOQBTable;
    FldN1,
    FldN2 : integer;
    FldNam1,
    FldNam2 : string;
    FLinkOpt,
    FLinkType : integer;
    LnkX,
    LnkY : byte;
    Rgn  : HRgn;
    PopMenu : TPopupMenu;
    procedure _Click(X,Y:integer);
    procedure CMHitTest(var Message: TCMHitTest); message CM_HitTest;
    function  ControlAtPos(const Pos: TPoint): TControl;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure WndProc(var Message: TMessage); override;
    procedure Paint; override;
  end;

  TOQBArea = class(TScrollBox)
  public
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetOptions(Sender: TObject);
    procedure InsertTable(X,Y: Integer);
    function  InsertLink(_tbl1,_tbl2: TOQBTable; _fldN1,_fldN2: Integer):TOQBLink;
    function  FindTable(TableName:string):TOQBTable;
    function  FindLink(Link:TOQBLink):boolean;
    function  FindOtherLink(Link:TOQBLink;Tbl:TOQBTable;FldN:integer):boolean;
    procedure ReboundLink(Link:TOQBLink);
    procedure ReboundLinks4Table(ATable:TOQBTable);
    procedure Unlink(Sender: TObject);
    procedure UnlinkTable(ATable:TOQBTable);
    procedure _DragOver(Sender, Source: TObject; X, Y: Integer;
                                State: TDragState; var Accept: Boolean);
    procedure _DragDrop(Sender, Source: TObject; X, Y: Integer);
  end;

  { definitions for the field in every column }
  TOQBSortType = (stNone,
                  stAsc,
                  stDesc);

  TOQBFilterAction = ( faIsEqualTo,
                       faIsBetween,
                       faIsGreaterThan,
                       faIsGreaterEqualTo,
                       faIsLessThan,
                       faIsLessEqualTo,
                       faIsLike,
                       faIsNotEqualTo,
                       faIsNotBetween,
                       faIsNotLike );

  TOQBShowAction = ( saShow,
                     saGroup,
                     saHide,
                     saSum,
                     saCount,
                     saAverage,
                     saMinimum,
                     saMaximum );

  TOQBFilterList = class;

  TOQBFilter = class
  private
     FFilterList   : TOQBFilterList;
     FFilterAction : TOQBFilterAction;
     FCustomExpres : String;       { custom expression }
     FData         : array[1..5] of String;
     function GetData(Index: Integer): String;
     procedure SetData(Index: Integer; const Value: String);
  public
     constructor Create(FilterList : TOQBFilterList);
     function FilterVerb: String;
     function IsFilterEmpty(Index: Integer): Boolean;

     property FilterAction: TOQBFilterAction read FFilterAction write FFilterAction;
     property CustomExpres: String read FCustomExpres write FCustomExpres;
     property Data[Index: Integer]: String read GetData write SetData;
  end;

  TOQBFilterList = class
     FItems: TList;
     function GetCount: Integer;
     function GetItem(Index: Integer): TOQBFilter;
  public
     constructor Create;
     destructor Destroy; override;
     function Add: TOQBFilter;
     procedure Clear;
     procedure Delete(Index: Integer);
     property Count: Integer read GetCount;
     property Items[Index: Integer]: TOQBFilter read GetItem; default;
  end;

  TOQBFieldList = class;

  TOQBField = class
  private
     FFieldList  : TOQBFieldList;
     FTable      : String;         { the Table }
     FTableAlias : string;
     FFieldName  : String;         { The FieldName }
     FAlias      : String;         { the Alias }
     FSortType   : TOQBSortType;   { the sort for the column }
     FShowAction : TOQBShowAction; { show actioin for the column }
     FFilters    : TOQBFilterList; { the filters }
  public
     constructor Create(FieldList : TOQBFieldList);
     destructor Destroy; override;
     procedure Assign(Source: TOQBField);
     procedure SaveToStream(Stream: TStream);
     procedure LoadFromStream(Stream: TStream);

     property Table : String read FTable write FTable;
     property TableAlias : String read FTableAlias write FTableAlias;
     property FieldName: String read FFieldName write FFieldName;
     property Alias : String read FAlias write FAlias;
     property SortType : TOQBSortType read FSortType write FSortType;
     property ShowAction : TOQBShowAction read FShowAction write FShowAction;
     property Filters : TOQBFilterList read FFilters write FFilters;
  end;

  TOQBFieldList = class
     FItems: TList;
     function GetCount: Integer;
     function GetItem(Index: Integer): TOQBField;
  public
     constructor Create;
     destructor Destroy; override;
     function Add: TOQBField;
     function Insert(Index: Integer): TOQBField;
     procedure ColumnMoved(FromIndex,ToIndex: Integer);
     procedure Exchange(FromIndex,ToIndex: Integer);
     procedure Clear;
     procedure Delete(Index: Integer);
     procedure SaveToStream(Stream: TStream);
     procedure LoadFromStream(Stream: TStream);

     property Count: Integer read GetCount;
     property Items[Index: Integer]: TOQBField read GetItem; default;
  end;

  TOQBGrid = class(TDrawGrid)
  private
    FFieldList : TOQBFieldList;
    procedure _ColumnMoved(Sender: TObject; FromIndex,ToIndex: Integer);
  protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  public
    CurrCol    : integer;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure CreateParams(var Params: TCreateParams); override;
    function IsEmpty: Boolean;
    procedure WndProc(var Message: TMessage); override;
    function  MaxSW(const s1,s2:string):integer;
    procedure Insert(aCol:integer;const aField,aTable,aTableAlias:string);
    function  FindColumn(const sCol:string):integer;
    function  FindSameColumn(aCol:integer):boolean;
    procedure RemoveColumn(aCol:integer);
    procedure RemoveColumn4Tbl(const Tbl:string);
    procedure ClickCell(X,Y:integer);
    procedure DblClickCell(X,Y:integer);
    procedure ResetWidths;
    //function  SelectCell(ACol, ARow: integer):boolean; override;
    procedure _DragOver(Sender,Source:TObject;X,Y:integer;State:TDragState;var Accept:boolean);
    procedure _DragDrop(Sender,Source:TObject;X,Y:integer);

    property FieldList: TOQBFieldList read FFieldList;
  end;

  TOQBForm = class(TForm)
    mnuTbl: TPopupMenu;
    Remove1: TMenuItem;
    ResDataSource: TDataSource;
    DlgSave: TSaveDialog;
    DlgOpen: TOpenDialog;
    Panel2: TPanel;
    btnNew: TSpeedButton;
    btnOpen: TSpeedButton;
    btnSave: TSpeedButton;
    Bevel1: TBevel;
    btnSQL: TSpeedButton;
    btnResults: TSpeedButton;
    Pages: TPageControl;
    TabColumns: TTabSheet;
    TabSQL: TTabSheet;
    MemoSQL: TRichEdit;
    TabResults: TTabSheet;
    ResDBGrid: TDBGrid;
    Panel3: TPanel;
    QBTables: TListBox;
    HSplitter: TSplitter;
    VSplitter: TSplitter;
    Bevel3: TBevel;
    btnColorSet: TSpeedButton;
    Panel1: TPanel;
    Bevel2: TBevel;
    btnExport: TSpeedButton;
    SaveDialog1: TSaveDialog;
    SyntaxHighlighter1: TSyntaxHighlighter;
    Button1: TButton;
    Button2: TButton;
    procedure mnuRemoveClick(Sender: TObject);
    procedure btnNewClick(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSQLClick(Sender: TObject);
    procedure btnResultsClick(Sender: TObject);
    procedure btnColorSetClick(Sender: TObject);
    procedure btnExportClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  protected
    QBDialog : TOQBuilderDialog;
    QBArea   : TOQBArea;
    QBGrid   : TOQBGrid;

    procedure ClearAll;
    procedure OpenDatabase;
  public
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

uses
  QBLnkFrm, xqconsts, QBEdFrm;

{$R *.DFM}

resourcestring
  sMainCaption = 'Query Builder';
  sNotValidTableParent = 'Parent must be TScrollBox or its descendant.';
  sLinkHint = 'Click here for options';

const

  sRows : array[0..8] of string =
     ( 'Field',
       'Table',
       'Show',
       'Sort',
       'Filter 1',
       'Filter 2',
       'Filter 3',
       'Filter 4',
       'Filter 5' );

  sShow : array[TOQBShowAction] of string =
     ( 'Show',
       'Group',
       'Hide',
       'Sum',
       'Count',
       'Average',
       'Minimum',
       'Maximum');

  sAggregate : array[TOQBShowAction] of string =
     ( '',
       '',
       '',
       'SUM',
       'COUNT',
       'AVG',
       'MIN',
       'MAX');

  sFilterAction : array[TOQBFilterAction] of string =
     ( '=',
       'BETWEEN',
       '>',
       '>=',
       '<',
       '<=',
       'LIKE',
       '<>',
       'BETWEEN',
       'LIKE'
       );

  sFilterActionVerb : array[TOQBFilterAction] of string =
     ( ' Is Equal To ',
       ' Is Between ',
       ' Is Greater Than ',
       ' Is Greater Than Or Equal To ',
       ' Is Less Than ',
       ' Is Less Than Or Equal To ',
       ' Is Like ',
       ' Is Not Equal To ',
       ' Is Not Between ',
       ' is Not Like '
       );

  sSort  : array [TOQBSortType] of string =
    ( '',
      'Asc',
      'Desc' );

  sLinkOpt : array [0..5] of string =
    ('=',

⌨️ 快捷键说明

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