adefctrl.pas

来自「delphi编程控件」· PAS 代码 · 共 1,755 行 · 第 1/5 页

PAS
1,755 行
字号
     if (CompareText(FValueCheck, FDataLink.Field.Text) = 0) then
       Result := True;
end;

procedure TDBGridInplaceCheckBox.ChangeCheckState;
begin
  FDataLink.Edit;
  if(FDataLink.Editing) then begin
    if FDataLink.Field.DataType = ftBoolean then
      FDataLink.Field.AsBoolean := Not FDataLink.Field.AsBoolean
    else begin
      if(Checked) then
        FDataLink.Field.Text := FValueCheck
      else FDataLink.Field.Text := FValueUncheck;
    end;   

  end;
end;

procedure TDBGridInplaceCheckBox.DataChange(Sender: TObject);
begin
  Repaint;
end;

procedure TDBGridInplaceCheckBox.UpdateData(Sender: TObject);
begin
  Repaint;
end;

procedure TDBGridInplaceCheckBox.SetDataSource(Value: TDataSource);
begin
  FDataLink.DataSource := Value;
end;

procedure TDBGridInplaceCheckBox.SetDataField(const Value: string);
begin
  FDataLink.FieldName := Value;
end;

procedure TDBGridInplaceCheckBox.KeyPress(var Key: Char);
begin
  inherited KeyPress(Key);
  case Key of
    #8, ' ':
      ChangeCheckState;
    #27:
      FDataLink.Reset;
  end;
end;

procedure TDBGridInplaceCheckBox.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if(Button = mbLeft) then
   ChangeCheckState;
end;

procedure TDBGridInplaceCheckBox.Paint;
Var
  ARect : TRect;
  State : Integer;
begin
  Canvas.Brush.Color := Color;
  ARect := ClientRect;
  Canvas.FillRect(ARect);
  if(Checked) then
    State := DFCS_CHECKED
  else State := 0;
  DrawFrameControl(Canvas.Handle, ARect, DFC_BUTTON, DFCS_BUTTONCHECK Or State);
end;

procedure TDBGridInplaceCheckBox.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
  Msg.Result := DLGC_WANTARROWS;
end;

{TDBGridInplaceCheckBox}
type
TPopupImageListbox = class;

TDBGridInplaceImageCombo = class(TCustomControl)
private
  FDataLink: TFieldDataLink;
  FLookupSource : TDataSource;
  FItems : TStrings;
  FImages : TStrings;
  FValues : TStrings;
  FButtonWidth : Integer;
  FImageList : TImageList;
  FAlignment : TAlignment;
  FImageAlignment : TAutoImageAlign;
  FPopupList : TPopupImageListBox;
  FDataList: TDBLookupListBox;
  FActiveList : TWinControl;
  FIsLookup : Boolean;
  FListVisible : Boolean;
  FKeyField : String;
  FListField : String;
  FPressed : Boolean;
  FTracking : Boolean;
  FListFieldIndex : Integer;
  FDataChanging : Boolean;
  FDropDownRows : Integer;

  procedure DataChange(Sender: TObject);
  function GetField: TField;
  procedure SetDataField(const Value: string);
  procedure SetDataSource(Value: TDataSource);
  procedure SetIsLookUp(Value : Boolean);
  procedure UpdateData(Sender: TObject);
  procedure StopTracking;
  procedure TrackButton(X,Y: Integer);
  procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer); 
  procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
protected
  procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  procedure KeyPress(var Key: Char); 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;
  procedure Paint; override;
  procedure CloseUp(Accept: Boolean);
  procedure DropDown;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;

  property Alignment : TAlignment read FAlignment write FAlignment;
  property ImageAlignment : TAutoImageAlign read FImageAlignment write FImageAlignment;
  property Field: TField read GetField;
  property DataField: string write SetDataField;
  property DataSource: TDataSource write SetDataSource;
  property ImageList : TImageList read FImageList write FImageList;
  property Items : TStrings read FItems;
  property Images : TStrings read FImages;
  property IsLookup : Boolean read FIsLookup write SetIsLookup;
  property KeyField : String read FKeyField write FKeyField;
  property ListField : String read FListField write FListField;  
  property ListFieldIndex : Integer read FListFieldIndex write FListFieldIndex;
  property LookupSource : TDataSource read FLookupSource write FLookupSource;
  property Values : TStrings read FValues;
end;

{TPopupImageListbox }
TPopupImageListbox = class(TAutoImageListbox)
private
  FSearchText: String;
  FSearchTickCount: Longint;
protected
  procedure CreateParams(var Params: TCreateParams); override;
  procedure CreateWnd; override;
  procedure KeyPress(var Key: Char); override;
  procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
  property Strings : TStrings read FStrings;
end;

procedure DrawImageCombo(ACanvas : TCanvas; AImageList : TImageList; AFont : TFont;
              AText : String; ImageIndex : Integer; ARect : TRect; Align : TAlignment;
              AImageAlign : TAutoImageAlign; ASelected, AFocused : Boolean);
const
  AlignFlags : array [TAlignment] of Integer =
    ( DT_LEFT or DT_EXPANDTABS or DT_NOPREFIX  Or DT_EDITCONTROL,
      DT_RIGHT or DT_EXPANDTABS  or DT_NOPREFIX Or DT_EDITCONTROL,
      DT_CENTER or DT_EXPANDTABS or DT_NOPREFIX Or DT_EDITCONTROL);
Var
  r : TRect;
  Image: TBitmap;
  ImageFlag : Boolean;
  Drawflag : Integer;
begin
  with ACanvas do  begin
    Font := AFont;
    if(ASelected) then begin
      Brush.Color := clHighLight;
      Font.Color := clWhite;
    end;
    FillRect(ARect);
    InflateRect(ARect, -1, -1);
    ImageFlag := (AImageList <> Nil) And (ImageIndex > -1)
                  And (ImageIndex < AImageList.Count);
    if ImageFlag then begin
      SetRect(r, ARect.Left, ARect.Top,
         ARect.Left + ((ARect.Bottom - ARect.Top) * AImageList.Width) div AImageList.Height, ARect.Bottom);
      Image := TBitmap.Create;
      AImageList.GetBitmap(ImageIndex, Image);
      StretchDraw(r, Image);
      Image.Free;
    end else r := ARect;
    if(AFocused) then
      Windows.DrawFocusRect(Handle, ARect);
    if (AImageList <> Nil) then begin
      InflateRect(ARect, -2, -2);
      if(AImageAlign = aliLeft) then
        ARect.Left := r.Right + 2
      else ARect.Right := r.Left - 2;
    end;
    Inc(ARect.Left);
    Dec(ARect.Right);
    DrawFlag := AlignFlags[Align] Or DT_VCENTER or DT_SINGLELINE;
    DrawText(Handle, PChar(AText), Length(AText), ARect, DrawFlag Or DT_EDITCONTROL);
  end;
end;

procedure TPopupImageListbox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    Style := Style or WS_BORDER;
    ExStyle := WS_EX_TOOLWINDOW;
    WindowClass.Style := CS_SAVEBITS;
  end;
end;

procedure TPopupImageListbox.CreateWnd;
begin
  inherited CreateWnd;
  Windows.SetParent(Handle, 0);
  CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
end;

procedure TPopupImageListbox.Keypress(var Key: Char);
var
  TickCount: Integer;
begin
  case Key of
    #8, #27: FSearchText := '';
    #32..#255:
      begin
        TickCount := GetTickCount;
        if TickCount - FSearchTickCount > 2000 then FSearchText := '';
        FSearchTickCount := TickCount;
        if Length(FSearchText) < 32 then FSearchText := FSearchText + Key;
        SendMessage(Handle, LB_SelectString, WORD(-1), Longint(PChar(FSearchText)));
        Key := #0;
      end;
  end;
  inherited Keypress(Key);
end;

procedure TPopupImageListbox.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  inherited MouseUp(Button, Shift, X, Y);
  TDBGridInplaceImageCombo(Owner).CloseUp((X >= 0) and (Y >= 0) and
      (X < Width) and (Y < Height));
end;

constructor TDBGridInplaceImageCombo.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDataLink := TFieldDataLink.Create;
  FDataLink.Control := Self;
  FDataLink.OnDataChange := DataChange;
  FDataLink.OnUpdateData := UpdateData;
  FLookupSource := TDataSource.Create(self);
  FItems := TStringList.Create;
  FImages := TStringList.Create;
  FValues := TStringList.Create;    
  FButtonWidth := GetSystemMetrics(SM_CXVSCROLL);
  FAlignment := taLeftJustify;
  FActiveList := Nil;
  FIsLookup := False;
  FListFieldIndex := 0;
  FListVisible := False;
  FPressed := False;
  FDataChanging := False;
end;

destructor TDBGridInplaceImageCombo.Destroy;
begin
  FDataLink.Free;
  FLookupSource.Free;
  FItems.Free;
  FImages.Free;
  FValues.Free;
  inherited Destroy;
end;

procedure TDBGridInplaceImageCombo.CloseUp(Accept: Boolean);
Var
  MasterField: TField;
  ListValue: Variant;
begin
  FDataChanging := True;
  if FListVisible then begin
    if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
    if FActiveList = FDataList then
      ListValue := FDataList.KeyValue
    else
      if FPopupList.ItemIndex <> -1 then
        ListValue := Values[FPopupList.ItemIndex];
    SetWindowPos(FActiveList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
        SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
    FListVisible := False;
    if Assigned(FDataList) then
      FDataList.ListSource := Nil;
    if(Field.Lookup) then
      FLookupSource.DataSet := Nil;
    Invalidate;
    if Accept then
      if FActiveList = FDataList then begin
        if(Field.Lookup) then begin
          MasterField := FDataLink.DataSet.FieldByName(Field.KeyFields);
          if MasterField.CanModify then begin
            FDataLink.DataSet.Edit;
            MasterField.Value := ListValue;
          end;
        end else
         if Field.CanModify then begin
          FDataLink.DataSet.Edit;
          Field.Text := ListValue;
        end;
      end else
        if (Not VarIsNull(ListValue))
        And (Field.CanModify) then begin
          FDataLink.DataSet.Edit;
          Field.Text := ListValue;
        end;
  end;
  FDataChanging := False;  
end;

procedure TDBGridInplaceImageCombo.DropDown;
var
  P: TPoint;
  i, Y: Integer;
begin
  if Not FListVisible then begin
    if FActiveList = FDataList then  begin
      FDataList.Width := Width;    
      FDataList.Color := Color;
      FDataList.Font := Font;
      FDataList.RowCount := FDropDownRows;
      if Field.Lookup then
        with Field do begin
          FLookupSource.DataSet := Field.LookupDataSet;
          FDataList.KeyField := Field.LookupKeyFields;
          FDataList.ListField := LookupResultField;
          FDataList.KeyValue := FDataLink.DataSet.FieldByName(Field.KeyFields).Value;
        end
      else begin
        FDataList.KeyField := KeyField;
        FDataList.ListField := ListField;
        FDataList.KeyValue := Field.Value;
      end;
      FDataList.ListSource := FLookupSource;
    end else 

⌨️ 快捷键说明

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