可以使用FindComponent在运行时创建的PageControl上查找标尺

时间:2011-09-30 14:13:26

标签: delphi

实际上我使用的是ImageEN TRulerBox和TAdvOfficePager(TMS)而不是TPageControl;但是,除了属性名称之外,TAdvOfficePager的功能与TPageControl的功能相同。

在运行时将两个ImageEN TRulerBox和一个TImageENView添加到TAdvOfficePage。标尺方向由TRulerBox的RulerDir属性设置。可以使用FindComponent查找HorzontalRulerBox和VerticalRulerBox吗?

控件是在运行时创建的,如下所示:

procedure TFormMain.AddPage;
var
  AdvOfficePage: TAdvOfficePage;
  PixelPanel: TPanel;
begin
  AdvOfficePage := TAdvOfficePage.Create( Self );
  AdvOfficePage.Parent := AdvOfficePager1;
  AdvOfficePager1.AddAdvPage( AdvOfficePage );
  AdvOfficePage.AdvOfficePager := AdvOfficePager1;
  AdvOfficePage.Caption := 'ImageEnView ' + IntToStr( AdvOfficePager1.AdvPageCount );
  AdvOfficePage.TabHint := 'ImageEnView ' + IntToStr( AdvOfficePager1.AdvPageCount );
  TopPanel := TPanel.Create( Self );
  TopPanel.Parent := AdvOfficePage;
  TopPanel.Height := 34;
  TopPanel.Align := alTop;
  TopPanel.Color := $00fcebdc;
  TopPanel.BorderStyle := bsNone;
  TopPanel.BevelOuter := bvNone;
  PixelPanel := TPanel.Create( TopPanel );
  PixelPanel.Parent := TopPanel;
  PixelPanel.Height := 40;
  PixelPanel.Width := 34;
  PixelPanel.Caption := 'Pix';
  PixelPanel.Align := alLeft;
  PixelPanel.Color := $00fdf3eb;
  PixelPanel.ParentBackground := False;
  PixelPanel.BorderStyle := bsNone;
  PixelPanel.BevelOuter := bvNone;
  HorzontalRulerBox := TRulerBox.Create( TopPanel );
  HorzontalRulerBox.Name := 'HorzontalRulerBox' + IntToStr( AdvOfficePager1.AdvPageCount );
  HorzontalRulerBox.Parent := TopPanel;
  HorzontalRulerBox.Align := alClient;
  HorzontalRulerBox.BackGround := $00fdf3eb;
  HorzontalRulerBox.RulerColor := $00fdf3eb;
  HorzontalRulerBox.GripBaseDim := 1;
  HorzontalRulerBox.RulerDir := rdHorizontal;
  LeftPanel := TPanel.Create( Self );
  LeftPanel.Parent := AdvOfficePage;
  LeftPanel.Width := 30;
  LeftPanel.Align := alLeft;
  LeftPanel.Color := $00fdf3eb;
  LeftPanel.BorderStyle := bsNone;
  LeftPanel.BevelOuter := bvNone;
  VerticalRulerBox := TRulerBox.Create( LeftPanel );
  VerticalRulerBox.Name := 'VerticalRulerBox' + IntToStr( AdvOfficePager1.AdvPageCount );
  VerticalRulerBox.Parent := LeftPanel;
  VerticalRulerBox.Align := alClient;
  VerticalRulerBox.BackGround := $00fdf3eb;
  VerticalRulerBox.GripBaseDim := 1;
  VerticalRulerBox.RulerDir := rdVertical;
  VerticalRulerBox.BackGround := $00fdf3eb;
  VerticalRulerBox.RulerColor := $00fdf3eb;
  ImageENView := TImageEnView.Create( Self );
  ImageENView.Parent := AdvOfficePage;
  ImageENView.Left := 0;
  ImageENView.Top := 0;
  ImageENView.Align := alClient;
  ImageENView.Center := True;
  ImageENView.Visible := True;
  ImageENView.BorderStyle := bsNone;
  ImageENView.MouseInteract := [ miSelect ];
  AdvOfficePager1.ActivePage := AdvOfficePage;
end;

如果无法使用FindComponent,如何在运行时获取两个标尺中的每个标尺的句柄?我希望我已正确地提出这个问题,所提供的信息很清楚。

我尝试了这个,但它返回nil:

function TFormMain.GetHorzontalRuler: TRulerBox;
// find horzontal TRulerBox component on a TPanel on a TAdvOfficePage
var
  rb: TRulerBox;
begin
  rb := AdvOfficePager1.ActivePage.FindComponent( 'HorzontalRulerBox' + IntToStr( AdvOfficePager1.ActivePageIndex ) )
    as TRulerBox;
  if Assigned( rb ) then
    Result := rb
  else
    Result := nil;
end;

新: - 这有效

function TFormMain.GetHorzRuler: TRulerBox;
var
  tp: TPanel;
  rb: TRulerBox;
begin
  Result := nil;
  tp := FindComponent( 'TopPanel' + IntToStr( AdvOfficePager1.ActivePageIndex + 1 ) ) as TPanel;
  if Assigned( tp ) then
  begin
    rb := TRulerBox( tp.FindComponent( 'HorzontalRulerBox' + IntToStr( AdvOfficePager1.ActivePageIndex + 1 ) ) );
    if Assigned( rb ) then
      Result := rb;
  end
  else
    Result := nil;
end;

function TFormMain.GetVertRuler: TRulerBox;
var
  tp: TPanel;
  rb: TRulerBox;
begin
  Result := nil;
  tp := FindComponent( 'LeftPanel' + IntToStr( AdvOfficePager1.ActivePageIndex + 1 ) ) as TPanel;
  if Assigned( tp ) then
  begin
    rb := TRulerBox( tp.FindComponent( 'VerticalRulerBox' + IntToStr( AdvOfficePager1.ActivePageIndex + 1 ) ) );
    if Assigned( rb ) then
      Result := rb;
  end
  else
    Result := nil;
end;

全部谢谢

2 个答案:

答案 0 :(得分:2)

您让TopPanel成为HorzontalRulerBox的所有者(顺便说一下,它是HorIzontal :)),因此您需要使用FindComponent进行搜索,但您必须首先搜索{ {1}} TFormMain,并在代码中为TopPanel添加一个名称。

TopPanel

答案 1 :(得分:1)

所有者组件必须使用<{1}} 功能
所有者可能与父母不同,所以要小心。

在您的示例中,所有者组件可能是表单,也可能是OfficePager 尝试用自己替换FindComponent(以引用表单)或AdvOfficePager1.ActivePage - 我不使用这些组件,所以我不确定。