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

📄 frxinsp.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    ComboBtn.SetBounds(0, 0, ComboPanel.Width, ComboPanel.Height);
    Dec(ww, 15);
  end;

  Edit1.Text:= GetValue(FItemIndex);
  Edit1.Modified:= False;
  Edit1.SetBounds(FSplitterPos+2, y, ww, FRowHeight-2);
  Edit1.SelectAll;

  if y+FRowHeight > Box.VertScrollBar.Position+Box.ClientHeight then
    Box.VertScrollBar.Position:= y-Box.ClientHeight+FRowHeight;
  if y < Box.VertScrollBar.Position then
    Box.VertScrollBar.Position:= y-1;

  FUpdatingPB:= False;
  PBPaint(nil);
end;

procedure TfrxObjectInspector.DrawOneLine(i:Integer; Selected:Boolean);
var
  R:TRect;
  s:String;
  p:TfrxPropertyItem;
  offs:Integer;

  procedure Line(x, y, dx, dy:Integer);
  begin
    FTempBMP.Canvas.MoveTo(x, y);
    FTempBMP.Canvas.LineTo(x+dx, y+dy);
  end;

  procedure DrawProperty;
  var
    x, y:Integer;
  begin
    x:= offs+GetOffset(i) * 12;
    y:= 1+i * FRowHeight;

    with FTempBMP.Canvas do
    begin
      Pen.Color:= clGray;
      Brush.Color:= clWhite;

      if offs = 1 then
      begin
        Rectangle(x+1, y+2, x+10, y+11);
        Line(x+3, y+6, 5, 0);
        if s[1] = '+' then
          Line(x+5, y+4, 0, 5);

        s:= Copy(s, 2, 255);
        Inc(x, 12);
      end;

      Brush.Style:= bsClear;
      if (s = 'Name') and (GetOffset(i) = 0) then
        Font.Style:= [fsBold];
      TextRect(R, x, y, s);
    end;
  end;

begin
  if Count > 0 then
  with FTempBMP.Canvas do
  begin
    Pen.Color:= clBtnShadow;
    Font.Assign(Self.Font);
    R:= Rect(0, i * FRowHeight, FSplitterPos, i * FRowHeight+FRowHeight-1);

    p:= GetItem(i);
    s:= GetName(i);
    if p.SubProperty<>nil then
    begin
      offs:= 1;
      if p.Expanded then
        s:= '-'+s else
        s:= '+'+s;
    end
    else
      offs:= 13;

    p.Editor.ItemHeight:= FRowHeight;

    if Selected then
    begin
      Pen.Color:= clBtnFace;
      Line(0, FRowHeight+-1+i * FRowHeight, PB.Width, 0);
      Brush.Color:= clBtnFace;
      FillRect(R);
      DrawProperty;
    end
    else
    begin
      Pen.Color:= clBtnFace;
      Line(0, FRowHeight+-1+i * FRowHeight, PB.Width, 0);
      Pen.Color:= clBtnFace;
      Line(FSplitterPos-1, 0+i * FRowHeight, 0, FRowHeight);
      DrawProperty;
      Font.Color:= clNavy;
      if paOwnerDraw in p.Editor.GetAttributes then
        p.Editor.OnDrawItem(FTempBMP.Canvas,
          Rect(FSplitterPos+2, 1+i * FRowHeight, Width, 1+(i+1) * FRowHeight))
      else
        TextOut(FSplitterPos+2, 1+i * FRowHeight, GetValue(i));
    end;
  end;
end;

{ Form events }

procedure TfrxObjectInspector.FormCreate(Sender:TObject);
begin
  frxResources.LocalizeForm(Self);
end;

procedure TfrxObjectInspector.FormShow(Sender:TObject);
begin
  AdjustControls;
end;

procedure TfrxObjectInspector.FormResize(Sender:TObject);
begin
  Tab.Width:= ClientWidth+10;
  Tab.Height:= ClientHeight-Tab.Top+2;
  BackPanel.Width:= ClientWidth;
  BackPanel.Height:= Tab.ClientHeight-26;
  ObjectsCB.Width:= ClientWidth;

  FPanel.Height:= Count * FRowHeight;
  FPanel.Width:= Box.ClientWidth;
  AdjustControls;
end;

procedure TfrxObjectInspector.FormEndDock(Sender, Target:TObject; X, Y:Integer);
begin
  FormResize(nil);
end;

procedure TfrxObjectInspector.TabChange(Sender:TObject);
begin
  if Tab.TabIndex = 0 then
    FList:= FPropertyList else
{$IFNDEF FR_VER_BASIC}
    FList:= FEventList;
{$ELSE}
    Tab.TabIndex:= 0;
{$ENDIF}
  FItemIndex:=-1;
  FormResize(nil);
end;

procedure TfrxObjectInspector.N11Click(Sender:TObject);
begin
  if Edit1.Visible then
    Edit1.CutToClipboard;
end;

procedure TfrxObjectInspector.N21Click(Sender:TObject);
begin
  if Edit1.Visible then
    Edit1.PasteFromClipboard;
end;

procedure TfrxObjectInspector.N31Click(Sender:TObject);
begin
  if Edit1.Visible then
    Edit1.CopyToClipboard;
end;

procedure TfrxObjectInspector.FormDeactivate(Sender:TObject);
begin
  if FDisableUpdate then Exit;
  SetItemIndex(FItemIndex);
end;

{ PB events }

procedure TfrxObjectInspector.PBPaint(Sender:TObject);
var
  i:Integer;
  r:TRect;
begin
  if FUpdatingPB then Exit;

  r:= PB.BoundsRect;
  FTempBMP.Width:= PB.Width;
  FTempBMP.Height:= PB.Height;
  with FTempBMP.Canvas do
  begin
    Brush.Color:= Box.Color;
    FillRect(r);
  end;

  if not FDisableUpdate then
  begin
    for i:= 0 to Count-1 do
      if i<>ItemIndex then
        DrawOneLine(i, False);
    if FItemIndex<>-1 then
      DrawOneLine(ItemIndex, True);
  end;

  PB.Canvas.Draw(0, 0, FTempBMP);
end;

procedure TfrxObjectInspector.PBMouseDown(Sender:TObject;
  Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
var
  p:TfrxPropertyItem;
  n, x1:Integer;
begin
  FDisableDblClick:= False;
  if Count = 0 then Exit;
  if PB.Cursor = crHSplit then
    FDown:= True
  else
  begin
    n:= Y div FRowHeight;

    if (X > FSplitterPos) and (X < FSplitterPos+15) and
       (n >= 0) and (n < Count) then
    begin
      p:= GetItem(n);
      if p.Editor.ClassName = 'TfrxBooleanProperty' then
      begin
        p.Editor.Edit;
        DoModify;
        PBPaint(nil);
        Exit;
      end;
    end;

    ItemIndex:= n;
    Edit1.SetFocus;
    FTickCount:= GetTickCount;

    p:= GetItem(ItemIndex);
    x1:= GetOffset(ItemIndex) * 12;
    if (X > x1) and (X < x1+13) and (p.SubProperty<>nil) then
    begin
      p.Expanded:= not p.Expanded;
      FormResize(nil);
      FDisableDblClick:= True;
    end;
  end;
end;

procedure TfrxObjectInspector.PBMouseUp(Sender:TObject;
  Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
begin
  FDown:= False;
end;

procedure TfrxObjectInspector.PBMouseMove(Sender:TObject;
  Shift:TShiftState; X, Y:Integer);
var
  n, OffsetX, MaxWidth:Integer;
  s:String;
  HideHint:Boolean;

  procedure ShowHint(const s:String; x, y:Integer);
  var
    HintRect:TRect;
    p:TPoint;
  begin
    p:= PB.ClientToScreen(Point(x-2, y-2));
    HintRect:= FHintWindow.CalcHintRect(1000, s, nil);
    OffsetRect(HintRect, p.X, p.Y);
    FHintWindow.ActivateHint(HintRect, s);
    HideHint:= False;
  end;

begin
  HideHint:= True;

  if not FDown then
  begin
    if (X > FSplitterPos-4) and (X < FSplitterPos+2) then
      PB.Cursor:= crHSplit
    else
    begin
      PB.Cursor:= crDefault;

      { hint window }
      n:= Y div FRowHeight;
      if (X > 12) and (n >= 0) and (n < Count) then
      begin
        if X <= FSplitterPos-4 then
        begin
          OffsetX:= (GetOffset(n)+1) * 12;
          s:= GetName(n);
          MaxWidth:= FSplitterPos-OffsetX;
        end
        else
        begin
          OffsetX:= FSplitterPos+1;
          s:= GetValue(n);
          MaxWidth:= PB.ClientWidth-FSplitterPos;
          if n = ItemIndex then
            MaxWidth:= 1000;
        end;

        if PB.Canvas.TextWidth(s) > MaxWidth then
          ShowHint(s, OffsetX, n * FRowHeight);
      end;
    end;
  end
  else
  begin
    if (x > 30) and (x < PB.ClientWidth-30) then
      FSplitterPos:= X;
    AdjustControls;
  end;

  if HideHint then
    FHintWindow.ReleaseHandle;
end;

procedure TfrxObjectInspector.PBDblClick(Sender:TObject);
var
  p:TfrxPropertyItem;
begin
  if (Count = 0) or FDisableDblClick then Exit;

  p:= GetItem(ItemIndex);
  if p.SubProperty<>nil then
  begin
    p.Expanded:= not p.Expanded;
    FormResize(nil);
  end;
end;

{ Edit1 events }

procedure TfrxObjectInspector.Edit1MouseDown(Sender:TObject;
  Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
begin
  if GetTickCount-FTickCount < GetDoubleClickTime then
    EditBtnClick(nil);
end;

procedure TfrxObjectInspector.Edit1KeyDown(Sender:TObject; var Key:Word;
  Shift:TShiftState);
var
  i:Integer;
begin
  if Count = 0 then Exit;
  if Key = vk_Escape then
  begin
    Edit1.Perform(EM_UNDO, 0, 0);
    Edit1.Modified:= False;
  end;
  if Key = vk_Up then
  begin
    if ItemIndex > 0 then
      ItemIndex:= ItemIndex-1;
    Key:= 0;
  end
  else if Key = vk_Down then
  begin
    if ItemIndex < Count-1 then
      ItemIndex:= ItemIndex+1;
    Key:= 0;
  end
  else if Key = vk_Prior then
  begin
    i:= Box.Height div FRowHeight;
    i:= ItemIndex-i;
    if i < 0 then
      i:= 0;
    ItemIndex:= i;
    Key:= 0;
  end
  else if Key = vk_Next then
  begin
    i:= Box.Height div FRowHeight;
    i:= ItemIndex+i;
    ItemIndex:= i;
    Key:= 0;
  end;
end;

procedure TfrxObjectInspector.Edit1KeyPress(Sender:TObject; var Key:Char);
begin
  if Key = #13 then
  begin
    if paDialog in GetType(ItemIndex) then
      EditBtnClick(nil)
    else
    begin
      if Edit1.Modified then
        SetValue(ItemIndex, Edit1.Text);
      Edit1.Modified:= False;
    end;
    Edit1.SelectAll;
    Key:= #0;
  end;
end;

{ EditBtn and ComboBtn events }

procedure TfrxObjectInspector.EditBtnClick(Sender:TObject);
begin
  if GetItem(ItemIndex).Editor.Edit then
  begin
    ItemIndex:= FItemIndex;
    DoModify;
  end;
end;

procedure TfrxObjectInspector.ComboBtnMouseDown(Sender:TObject;
  Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
begin
  FPopupLBVisible:= GetTickCount-frxPopupFormCloseTime < 100;
end;

procedure TfrxObjectInspector.ComboBtnClick(Sender:TObject);
var
  i, wItems, nItems:Integer;
  p:TPoint;
begin
  if FPopupLBVisible then
    Edit1.SetFocus
  else
  begin
    FPopupForm:= TfrxPopupForm.Create(Self);
    FPopupLB:= TListBox.Create(FPopupForm);
    with FPopupLB do
    begin
      Parent:= FPopupForm;
      Ctl3D:= False;
      Align:= alClient;
      if paOwnerDraw in GetItem(FItemIndex).Editor.GetAttributes then
        Style:= lbOwnerDrawFixed;
      ItemHeight:= FRowHeight;
      OnClick:= LBClick;
      OnDrawItem:= GetItem(FItemIndex).Editor.OnDrawLBItem;
      GetItem(FItemIndex).Editor.GetValues;
      Items.Assign(GetItem(FItemIndex).Editor.Values);

      if Items.Count > 0 then
      begin
        ItemIndex:= Items.IndexOf(GetValue(FItemIndex));
        wItems:= 0;
        for i:= 0 to Items.Count-1 do
        begin
          if Canvas.TextWidth(Items[i]) > wItems then
            wItems:= Canvas.TextWidth(Items[i]);
        end;

        Inc(wItems, 8);
        if paOwnerDraw in GetItem(FItemIndex).Editor.GetAttributes then
          Inc(wItems, GetItem(FItemIndex).Editor.GetExtraLBSize);
        nItems:= Items.Count;
        if nItems > 8 then
        begin
          nItems:= 8;
          Inc(wItems, GetSystemMetrics(SM_CXVSCROLL));
        end;

        p:= Edit1.ClientToScreen(Point(0, Edit1.Height));

        if wItems < PB.Width-FSplitterPos then
          FPopupForm.SetBounds(p.X-3, p.Y,
                             PB.Width-FSplitterPos+1, nItems * ItemHeight+2)
        else
          FPopupForm.SetBounds(p.X+(PB.Width-FSplitterPos-wItems)-2, p.Y,
                             wItems, nItems * ItemHeight+2);
        FDisableUpdate:= True;
        FPopupForm.Show;
        FDisableUpdate:= False;
      end;
    end;
  end;
end;

procedure TfrxObjectInspector.LBClick(Sender:TObject);
begin
  Edit1.Text:= FPopupLB.Items[FPopupLB.ItemIndex];
  FPopupForm.Hide;
  Edit1.SetFocus;
  Edit1.SelectAll;
  SetValue(ItemIndex, Edit1.Text);
end;

{ ObjectsCB events }

procedure TfrxObjectInspector.ObjectsCBClick(Sender:TObject);
begin
  if FUpdatingObjectsCB then Exit;

  FSelectedObjects.Clear;
  if ObjectsCB.ItemIndex<>-1 then
    FSelectedObjects.Add(ObjectsCB.Items.Objects[ObjectsCB.ItemIndex]);
  SetSelectedObjects(FSelectedObjects);
  Edit1.SetFocus;
  if Assigned(FOnSelectionChanged) then
    FOnSelectionChanged(Self);
end;

procedure TfrxObjectInspector.ObjectsCBDrawItem(Control:TWinControl;
  Index:Integer; Rect:TRect; State:TOwnerDrawState);
begin
  if FDisableUpdate then exit;
  with ObjectsCB.Canvas do
  begin
    FillRect(Rect);
    if Index<>-1 then
      TextOut(Rect.Left+2, Rect.Top+1, ObjectsCB.Items[Index]);
  end;
end;

{ Mouse wheel }

procedure TfrxObjectInspector.FormMouseWheelDown(Sender:TObject;
  Shift:TShiftState; MousePos:TPoint; var Handled:Boolean);
begin
  with Box.VertScrollBar do
    Position:= Position+FRowHeight;
end;

procedure TfrxObjectInspector.FormMouseWheelUp(Sender:TObject;
  Shift:TShiftState; MousePos:TPoint; var Handled:Boolean);
begin
  with Box.VertScrollBar do
    Position:= Position-FRowHeight;
end;

procedure TfrxObjectInspector.CMMouseLeave(var Msg:TMessage);
begin
  FHintWindow.ReleaseHandle;
  inherited;
end;

end.

⌨️ 快捷键说明

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