gpt4 book ai didi

Delphi 获取具有滚动条的组件的实际全高/宽度

转载 作者:行者123 更新时间:2023-12-03 15:58:00 42 4
gpt4 key购买 nike

这个问题类似于 how-to-find-the-actual-width-of-grid-component-with-scrollbar-in-delphi

但我无法获取 CalcDrawInfo(DrawInfo);使用 StringGrid

例如,如果您添加 StringGrid 并在 FormCreate 中随机设置 RowCount 和 ColCount 值
你能得到这个组件的实际大小,这样如果你设置宽度和高度,滚动条就会消失,如果你的屏幕足够大,你可以看到所有的 StringGrid

我猜测在 StringGrid 的情况下,您可以通过循环遍历列获取信息并将它们相加来计算宽度和高度。
我只是想知道是否有可能劫持滚动条的某些内容计算它的位置,以便它知道要绘制组件的哪一部分,
或一些可以返回组件完整范围的 Draw 函数

如果可能的话,您可以双击字符串网格来计算下面示例中的实际高度和宽度

<小时/>

启动新的 Delphi VCL 表单应用程序
复制以下内容并粘贴到主表单中

object strngrd1: TStringGrid
Left = 0
Top = 0
Width = 200
Height = 150
ColCount = 12
RowCount = 13
TabOrder = 0
OnDblClick = strngrd1DblClick
end

连接 FormCreate 和 StringGrid DblClick 事件

procedure TfrmMain.FormCreate(Sender: TObject);
var i, iMax : Integer;
begin
strngrd1.RowCount := Random(100);
strngrd1.ColCount := Random(100);
iMax := strngrd1.RowCount;
if strngrd1.ColCount > iMax then
iMax := strngrd1.ColCount;

for I := 0 to iMax -1 do begin
if i < strngrd1.RowCount then
strngrd1.Rows[i].Text := i.ToString;
if i < strngrd1.ColCount then
strngrd1.Cols[i].Text := i.ToString;
end;
end;

procedure TfrmMain.strngrd1DblClick(Sender: TObject);
var iActualWidth, iActualHeight : Integer;
sActualWidth, sActualHeight : String;
begin
iActualWidth := 0;
iActualHeight := 0;
sActualWidth := '??';
sActualHeight := '??';

if iActualHeight > 0 then
sActualHeight := iActualHeight.ToString;
if iActualWidth > 0 then
sActualWidth := iActualWidth.ToString;

ShowMessage(strngrd1.ClassType.ClassName + #13#10 +
'Current Width = ' + strngrd1.Width.ToString + #13#10 +
'Current Height = ' + strngrd1.Height.ToString + #13#10 +
'Client Width = ' + strngrd1.ClientWidth.ToString + #13#10 +
'Client Height = ' + strngrd1.ClientHeight.ToString + #13#10 +
'Actual Width = ' + sActualWidth + #13#10 +
'Actual Height = ' + sActualHeight + #13#10 );
end;

双击返回组件的实际范围,这样如果重置宽度和高度,滚动条将不再可见

最佳答案

不幸的是,您需要的方法 (CalcDrawInfoXY) 在 TCustomGrid 中被声明为 private。然而,复制它很简单:

声明一个 hack 类来公开 CalcFixedInfo,引入您自己的方法来复制 CalcDrawInfoXY

TGridHack = class(TCustomGrid)
procedure GetDrawInfoXY(var DrawInfo: TGridDrawInfo; UseWidth, UseHeight: Integer);
end;

并实现为(来自 Vcl.Grids)

procedure TGridHack.GetDrawInfoXY(var DrawInfo: TGridDrawInfo; 
UseWidth, UseHeight: Integer);
procedure CalcAxis(var AxisInfo: TGridAxisDrawInfo; UseExtent: Integer);
var
I: Integer;
begin
with AxisInfo do
begin
GridExtent := UseExtent;
GridBoundary := FixedBoundary;
FullVisBoundary := FixedBoundary;
LastFullVisibleCell := FirstGridCell;
for I := FirstGridCell to GridCellCount - 1 do
begin
Inc(GridBoundary, AxisInfo.GetExtent(I) + EffectiveLineWidth);
if GridBoundary > GridExtent + EffectiveLineWidth then
begin
GridBoundary := GridExtent;
Break;
end;
LastFullVisibleCell := I;
FullVisBoundary := GridBoundary;
end;
end;
end;
begin
CalcFixedInfo(DrawInfo);
CalcAxis(DrawInfo.Horz, UseWidth);
CalcAxis(DrawInfo.Vert, UseHeight);
end;

这允许您获取假想 Canvas 尺寸的TGridDrawInfo。使用适当大的想象 Canvas ,您可以获得网格的完整范围:

procedure TForm1.strngrd1DblClick(Sender: TObject);
var iActualWidth, iActualHeight : Integer;
sActualWidth, sActualHeight : String;
DrawInfo : TGridDrawInfo;
begin
TGridHack(strngrd1).GetDrawInfoXY(DrawInfo, MaxInt - 1, MaxInt - 1);
iActualWidth := DrawInfo.Horz.GridBoundary;
iActualHeight := DrawInfo.Vert.GridBoundary;
sActualWidth := iActualWidth.ToString;
sActualHeight := iActualHeight.ToString;


ShowMessage(strngrd1.ClassType.ClassName + #13#10 +
'Current Width = ' + strngrd1.Width.ToString + #13#10 +
'Current Height = ' + strngrd1.Height.ToString + #13#10 +
'Client Width = ' + strngrd1.ClientWidth.ToString + #13#10 +
'Client Height = ' + strngrd1.ClientHeight.ToString + #13#10 +
'Actual Width = ' + sActualWidth + #13#10 +
'Actual Height = ' + sActualHeight + #13#10 );
end;

这里我使用了MaxInt - 1,它应该足够大以容纳几乎所有正常的东西。 MaxInt 不能用作参数,如果这样做,DrawInfo 将返回 MaxInt 作为网格大小。这本质上是按照您在问题中建议的方式进行操作,即迭代行和列以测量网格的总大小。

关于Delphi 获取具有滚动条的组件的实际全高/宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899040/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com