【问题标题】:Dynamically create Tpagecontrol instances动态创建 Tpagecontrol 实例
【发布时间】:2017-12-20 18:34:34
【问题描述】:

我已经搜索和搜索,但没有找到示例。我想动态创建PageControl 实例,每个实例都有自己的偏移TTabsheets。我没有收到来自 Delphi IDE 的投诉,但我确实收到了:

模块FormApplication.exe写入地址00000000的访问冲突

我有什么遗漏吗?

procedure TForm1.FormCreate(Sender: TObject);
type
  ABC_Status_Object = record
    ABC_PageControl_instance: TPageControl;
    quickStat_instance: TTabsheet;
    detailStat_instance: TTabsheet;
    abc_light: TShape;
  end;

var
  ABC_Status: array of ABC_Status_Object;
  I: Integer;
  Frac, Icnt: Extended;

begin
  inifile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  loadGlobalConfig;

  Frac := 100/NUM/100;
  for I := 0 to NUM do
  begin
    {// Create the Tabs: }
    ABC_Status[I].ABC_PageControl_instance := TPageControl.Create(self);
    ABC_Status[I].ABC_PageControl_instance.Parent := self;
    ABC_Status[I].quickStat_instance := TTabsheet.Create(ABC_Status[I].ABC_PageControl_instance);
    ABC_Status[I].detailStat_instance := TTabsheet.Create(ABC_Status[I].ABC_PageControl_instance);
    ABC_Status[I].quickStat_instance.PageControl := ABC_Status[I].ABC_PageControl_instance;
    ABC_Status[I].detailStat_instance.PageControl := ABC_Status[I].ABC_PageControl_instance;

    {// Set the attributes of each instance of PageControl, including the tabs: }
    ABC_Status[I].ABC_PageControl_instance.Visible := TRUE;
    ABC_Status[I].ABC_PageControl_instance.Top := 0;
    if(NUM = 1) then
      ABC_Status[I].ABC_PageControl_instance.Width := ClientWidth;

    if(NUM > 1) AND (NUM < 4) then
    begin
      Icnt := 100/(I+1)/100;

      ABC_Status[I].ABC_PageControl_instance.Width := Trunc(ClientWidth*Frac);
      ABC_Status[I].ABC_PageControl_instance.Left := 30;
    end;
    ABC_Status[I].quickStat_instance.Caption := 'Quick Status';
    ABC_Status[I].quickStat_instance.Visible := TRUE;
    ABC_Status[I].detailStat_instance.Caption := 'Details';
    ABC_Status[I].detailStat_instance.Visible := TRUE;
  end;

end;

【问题讨论】:

    标签: delphi delphi-xe7 tpagecontrol


    【解决方案1】:

    您没有分配数组。在访问数组之前需要添加以下内容:

    SetLength(ABC_Status, NUM+1);
    

    +1 是因为您使用了相当非标准的循环边界。

    还有100/100 = 1 等表达式100/NUM/100 似乎很奇怪。你也可以写1/NUM

    您对非标准Extended 类型的使用似乎也很奇怪。我认为没有太大必要。

    可能还有更多错误,但我在这里停下来。

    【讨论】:

    • 太棒了!我认为这将是一些愚蠢的事情,我应该知道比错过分配数组长度更好。我也同意 100/NUM/100 我会解决这个问题。
    • 调试器没有查明访问数组的第一行代码吗?
    猜你喜欢
    • 2020-05-11
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多