wwselfld.pas

来自「infopower 4000 for delphi 2006」· PAS 代码 · 共 1,421 行 · 第 1/3 页

PAS
1,421
字号
unit Wwselfld;
{
//
// Dialog to support wwDBGrid field property selection
//
// Copyright (c) 1995-2001 by Woll2Woll Software
//
// 7/31/97 - DisplayLabel property only used for useTfields=true
}

interface

{$i wwIfDef.pas}

uses WinTypes, WinProcs, Classes, Graphics, Forms, Controls, Buttons,
  StdCtrls, db, wwTable, wwaddlk, sysutils, dialogs,
  TabNotBk, Tabs, ExtCtrls, DBTables, wwDBLook, wwcommon, wwstr,
  wwdbcomb, wwdbgrid, wwQuery, wwQBE, Wwdbdlg, wwidlg, wwprpfld, wwdatainspector,
  {$ifdef wwDelphi6Up}
  designintf,
  {$else}
  dsgnintf,
  {$endif}

  {$ifdef win32}
  wwriched,
  {$endif}
  wwtypes, Mask, wwdbedit, Wwdotdot, wwdbigrd, ipdsgn, wwedtpic;

type
   TwwSelectedPropertyType = (sptNone, sptDataSetType, sptRecordViewType, sptObjectViewType);

TSelFieldsForm = class(TForm)
    OKBtn: TBitBtn;
    CancelBtn: TBitBtn;
    HelpBtn: TBitBtn;
    GroupBox1: TGroupBox;
    DstList: TListBox;
    AddFieldsButton: TButton;
    RemoveFieldsButton: TButton;
    SelectedFieldCaption: TGroupBox;
    FieldNotebook: TNotebook;
    DisplayWidthLabel: TLabel;
    Label2: TLabel;
    DisplayWidth: TEdit;
    DisplayTitle: TEdit;
    Label3: TLabel;
    ControlTypeEdit: TComboBox;
    ControlTypeNotebook: TNotebook;
    Label10: TLabel;
    Label11: TLabel;
    BitmapScalingCombo: TComboBox;
    RasterCombo: TComboBox;
    Label6: TLabel;
    Label7: TLabel;
    CheckOnValue: TEdit;
    CheckOffValue: TEdit;
    Label9: TLabel;
    PictureMaskLabel: TLabel;
    DesignMaskButton: TButton;
    Bevel1: TBevel;
    Label4: TLabel;
    Label5: TLabel;
    LookupFieldCaption: TLabel;
    LookupTableCaption: TLabel;
    FieldTabSet: TTabSet;
    AutoFillCheckbox: TCheckBox;
    PictureDescription: TMemo;
    Button4: TButton;
    EditLookupButton: TButton;
    Panel1: TPanel;
    UsePictureMask: TCheckBox;
    UseTFieldCheckbox: TCheckBox;
    DBRichEditComboList: TwwDBComboBox;
    Label1: TLabel;
    InsertNewLineButton: TBitBtn;
    ReadOnlyCB: TCheckBox;
    ShrinkToFit: TCheckBox;
    PictureMaskEdit: TwwDBComboDlg;
    DBLookupComboList: TwwDBComboBox;
    ControlAlwaysPaints: TCheckBox;
    RTFControlAlwaysPaints: TCheckBox;
    GroupName: TEdit;
    GroupNameLabel: TLabel;
    function InDestList(Value: string): Boolean;
    procedure ExcludeItems;
    procedure DstListClick(Sender: TObject);
    procedure EditLookupButtonClick(Sender: TObject);
    procedure ClearLinkButtonClick(Sender: TObject);
    procedure SelectDest(index: integer);
    procedure FormActivate(Sender: TObject);
    procedure DisplayWidthChange(Sender: TObject);
    procedure DisplayTitleChange(Sender: TObject);
    procedure FieldTabSetClick(Sender: TObject);
    procedure OKBtnClick(Sender: TObject);
    procedure ControlTypeEditChange(Sender: TObject);
    procedure ExcludeBtnClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SortAvailCheckboxClick(Sender: TObject);
    procedure HelpBtnClick(Sender: TObject);
    procedure DesignMaskButtonClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure PictureMaskEditInitDialog(Dialog: TwwLookupDlg);
    procedure PictureMaskEditChange(Sender: TObject);
    procedure PictureMaskEditCloseUp(Sender: TObject;
      LookupTable: TDataSet; FillTable: TDataset; modified: Boolean);
    procedure RemoveFieldsButtonClick(Sender: TObject);
    procedure AddFieldsButtonClick(Sender: TObject);
    procedure DstListDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure DstListDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure DstListMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormShow(Sender: TObject);
    procedure ScrollTimerOnTimer(Sender: TObject);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure UseTFieldCheckboxClick(Sender: TObject);
    procedure InsertNewLineButtonClick(Sender: TObject);
    procedure ReadOnlyCBClick(Sender: TObject);
    procedure PictureMaskEditCustomDlg(Sender: TObject);
    procedure DBLookupComboListDropDown(Sender: TObject);
    procedure DBLookupComboListCloseUp(Sender: TwwDBComboBox;
      Select: Boolean);
    procedure GroupNameChange(Sender: TObject);
  private
    gridTable: TDataSet;
    curField: TField;
    dragFromRow: integer;
    initialized: boolean;
    SrcListItems: TStrings;
    ScrollTimer: TTimer;
    GoForwards, GoBackwards: Boolean;
    useTFields: boolean;
    GSelected: TStrings;
    InSelectDest: boolean;
    Component: TComponent;
    controlType: TStrings;
    propertyType: TwwSelectedPropertyType;
    OrigColor: TColor;

    procedure refreshSourceList;
//    procedure AddEditControls(curForm: TComponent);

    procedure getLookupFields(curField: Tfield;
      var databasename, tableName, fieldName, index: wwSmallString;
      var indexFields: string;
      var joins: string;
      var useExtension: char;
      var foundIndex: integer);

    procedure getControlInfo(curField: Tfield;
            var controlName: wwSmallString; { formerly String }
            controlData: TStrings);

    procedure setControlInfo(curField: TField;
            controlName: String;
            controlData: TStrings);

    procedure saveControlInfo;
    procedure SavePictureMasks;
//    procedure UpdateSelected(FieldName: string; val: string;
//      SelectedProperty: TwwUpdateSelected);
public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

end;

function wwSelectTableFields(
   AComponent: TComponent;
   dataSet: TDataSet;
   var fields: TStrings;
   var AuseTFields: boolean;
   ADesigner:
        {$ifdef wwDelphi6Up}
        IDesigner;
        {$else}
          {$ifdef wwDelphi4Up}
          IFormDesigner;
          {$else}
          TFormDesigner;
          {$endif}
        {$endif}
//   {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
   APropertyType: TwwSelectedPropertyType): boolean;

implementation

{$R *.DFM}

uses wwprppic, wwlocate, typinfo;
{type SmallString = String[64];}

const LINKS_TABSETNAME = '&Links';

//var callingDesigner: {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
destructor TSelFieldsForm.Destroy;
begin
   SrcListItems.Free;
   ScrollTimer.enabled:= False;
   ScrollTimer.Free;
   inherited Destroy;
end;

constructor TSelFieldsForm.Create(AOwner: TComponent);
begin
   initialized:= False;
   inherited Create(AOwner);
   curField:= Nil;
   SrcListItems:= TStringList.create;
   ScrollTimer:= TTimer.create(self);
   ScrollTimer.onTimer:= ScrollTimerOnTimer;
   ScrollTimer.interval:= 50;

end;

procedure TSelFieldsForm.ScrollTimerOnTimer(Sender: TObject);
begin
   if GoForwards then DstList.TopIndex:= DstList.TopIndex + 1
   else if GoBackwards then DstList.TopIndex:= DstList.TopIndex - 1;
end;

Function wwSupportsInfoPower(ctrl: TComponent): boolean;
var PropInfo: PPropInfo;
begin
   if Ctrl.InheritsFrom(TWinControl) then
   begin
      PropInfo:= Typinfo.GetPropInfo(ctrl.ClassInfo,'InfoPower');
      result:= PropInfo<>Nil;
      if not result then
         if (Typinfo.GetPropInfo(ctrl.ClassInfo,'DataSource')<>nil) and
            ((Typinfo.GetPropInfo(ctrl.ClassInfo,'DataField')<>nil) or
             wwIsClass(ctrl.ClassType, 'TwwDataInspector')) then
            result:=True;
   end
   else result:= False;
end;


function wwSelectTableFields(
   AComponent: TComponent;
   dataSet: TDataSet;
   var fields: TStrings;
   var AUseTFields: boolean;
   ADesigner: //{$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
        {$ifdef wwDelphi6Up}
        IDesigner;
        {$else}
          {$ifdef wwDelphi4Up}
          IFormDesigner;
          {$else}
          TFormDesigner;
          {$endif}
        {$endif}
   APropertyType: TwwSelectedPropertyType): boolean;
var i: integer;
   parts : TStrings;
   thisIndex: integer;
{   curField: TField;}
//   selString: string;
//   tempcomponent: TComponent;
   origSelected: TStrings;
   tempForm: TSelFieldsForm;
   {$ifdef wwDelphi5Up}
   OwnerComponent: TComponent;
   {$endif}

   procedure AddEditControls(curForm: TComponent);
   var i: integer;
       tempComponent: TComponent;
   begin
      for i:= 0 to curForm.ComponentCount-1 do begin
         tempcomponent:= curForm.components[i];
         if (tempcomponent is TwwDBCustomEdit) or (tempcomponent is TwwDBCustomLookupCombo) then
             tempForm.DBLookupComboList.items.add(tempComponent.name)
         else if (tempcomponent is TwwCustomRichEdit) then
             tempForm.DBRichEditComboList.items.add(tempcomponent.name)
         else if wwSupportsInfoPower(tempcomponent) then
             tempForm.DBLookupComboList.items.add(tempcomponent.name)
         {$ifdef wwDelphi5Up}
         else if (tempComponent is TFrame) then begin
             AddEditControls(tempComponent);
         end
         {$endif}
      end;
   end;


begin
   parts := TStringList.create;
//   callingDesigner:= designer;
   result:= False;
   origSelected:= nil;

   tempForm:= TSelFieldsForm.create(Application);
   with tempForm do
{   with TSelFieldsForm.create(Application) do}
   try
      if not wwDataSet(dataSet) then begin
         MessageDlg('Data source must reference an InfoPower compatible TDataSet.', mtError,
                        [mbok], 0);
         exit;
      end;

      Component:= AComponent;
      gridTable:= dataSet;
      ControlType:= nil; { Delphi 5}
      if wwGetControlInfoInDataSet(Component) then
         controlType:= wwGetControlType(gridTable);
      if ControlType=nil then
         controlType:= wwGetControlType(Component);

      useTFields:= AUseTFields;
      GSelected:= Fields;
      OrigSelected:= TStringList.create;
      OrigSelected.assign(GSelected);

      // Don't error out if talble inactive
      if (not gridTable.active) and (gridtable.fieldcount=0) then begin
         MessageDlg('Cannot edit field properties.  Dataset must be active or have persistent fields.',
                    mtError, [mbok], 0);
         exit;
      end;

      gridTable.designer.Free;  { reset dataset designer }

      { Initialize list of data-sources }
      DBLookupComboList.items.clear;
      DBRichEditComboList.items.clear;
//      if (callingDesigner<>Nil) and (callingDesigner.form=nil) then
//         showmessage('calling designer form is nil');

      if ADesigner<>Nil then
      begin
         {$ifdef wwDelphi5Up}
         ownerComponent:= wwGetOwnerFrameOrForm(Component);
         if OwnerComponent is TCustomFrame then
           AddEditControls(OwnerComponent)
         else
         {$endif}
         {$ifdef wwDelphi6Up}
           AddEditControls(ADesigner.Root)
         {$else}
           AddEditControls(ADesigner.Form)
         {$endif}
      end
      else begin
         AddEditControls(GetParentForm(TControl(Component)));
         showmessage('calling designer is nil');
      end;

      { 5/2/97 - Included controls on same form as dataset }
{      if (callingDesigner.Form<>gridtable.owner) then begin
         for i:= 0 to gridtable.owner.ComponentCount-1 do begin
            component:= gridtable.owner.components[i];
            if (component is TwwDBCustomEdit) or (component is TwwDBCustomLookupCombo) then
                DBLookupComboList.items.add('DataSetForm.' + Component.Name)
         end
      end;
}
      gridTable.disableControls;
      Screen.cursor:= crHourGlass;

      gridTable.getFieldNames(SrcListItems);

         { Fill selected fields grid }
         for i:= 0 to fields.count-1 do begin
            strBreakApart(fields[i], #9, parts);
            curField:= gridTable.FindField(parts[0]);
            if curField<>Nil then begin
               { added in case no grid is used to show fields - i.e. LookupDialog}
               if AUseTFields then begin
                  curField:= gridTable.fieldByName(parts[0]);
                  curField.displayWidth:= strtoint(parts[1]);
                  curField.displayLabel:= parts[2];
               end;

               DstList.items.add(parts[0]);

               thisIndex:= SrcListItems.indexOf(parts[0]);
               if thisIndex>=0 then SrcListItems.delete(thisIndex);
            end
            else if (wwNewLineString=parts[0]) then begin
               DstList.items.add(parts[0]);
            end
         end;

      gridTable.enableControls;
      Screen.cursor:= crDefault;

      tempform.propertyType:= APropertyType;
      if ApropertyType=sptRecordViewType then
      begin
         useTFieldCheckbox.checked:= False;
         useTFieldCheckbox.enabled:= False;
      end
      else begin
         if ApropertyType= sptDataSetType then
            useTFieldCheckbox.enabled:= False;
         InsertNewLineButton.visible:= False;
         AddFieldsButton.left:= DstList.left;
         AddFieldsbutton.width:= DstList.width div 2;
         RemoveFieldsbutton.width:= DstList.width div 2;
         RemoveFieldsButton.left:= DstList.Left + DstList.Width - RemoveFieldsButton.Width;
      end;

      Result := ShowModal = IDOK;

      if Result then begin
         AUseTFields:= UseTFields;
      end
      else begin
         GSelected.assign(OrigSelected);
      end;

      if Result and useTFields then begin
         gridTable.disableControls;

         if AUseTFields then begin
//            fields.clear;
            for i:= 0 to SrcListItems.count-1 do begin
               curField:= gridTable.fieldByName(SrcListItems[i]);
               curField.visible:= False;
            end;
         end;

         for i:= 0 to DstList.items.count-1 do begin
            curField:= gridTable.findField(DstList.items[i]);
            if curField=nil then begin  {5/12/97}
//               if useTFields then fields.add(DstList.items[i]);
               continue;
            end;

            if AUseTFields then begin
//               selString:= curField.fieldName + #9 +
//                    inttostr(curField.displayWidth) + #9 +
//                    curField.displayLabel;
//               fields.add(selString);
               curField.index:= i;
               curField.visible:= True;
            end
         end;
         gridTable.enableControls;

      end;

   finally
      Free;
      parts.Free;
      origSelected.Free;
   end;
end;

procedure TSelFieldsForm.SelectDest(index: integer);
var lkDatabase, lkTable, lkField, lkIndex: wwSmallString;
    lkIndexFields: string;
    lkJoins: string;
    lkFoundIndex: integer;
    lkUseExtension: char;
    controlData: TStrings;
    controlName: wwSmallString;
    i: integer;
    tempMask: string;
    tempAutoFill, tempUsePictureMask: boolean;
    apos, aindex: integer;
    foundControl: boolean;
begin
  InSelectDest:= True;
  try
   editLookupButton.enabled:= False;
   if DstList.items.count=0 then index:= -1;

⌨️ 快捷键说明

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