2017-12-20 10 views
1

私は検索して検索しましたが、例は見つかりませんでした。 PageControlインスタンスを動的に作成し、それぞれ独自のセットオフTTabsheetsを設定したいとします。しかし私は私が得るか、DelphiのIDEからの苦情を取得していない:アドレス00000000動的にTpagecontrolインスタンスを作成する

のモジュールFormApplication.exe書き込みで

アクセス違反は、私が行方不明です何かはありますか?

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; 

答えて

5

あなたは配列を割り当てませんでした。あなたは配列にアクセスする前に以下を追加する必要があります。

SetLength(ABC_Status, NUM+1); 

+1があるために使用し、むしろ非標準のループ境界です。

100/100 = 1したがって、式100/NUM/100は奇妙に見えます。あなたは1/NUMと書くこともできます。

標準以外のExtendedタイプをご使用の場合も奇妙に見えます。私はそれが必要ではない。

おそらくもっと多くのエラーがありますが、私はここで停止しています。

+0

恐ろしい!私はそれが配列の長さを割り当てるのを逃すよりもよく分かっていたはずの何かであると思った。また、私は100/NUM/100に同意します。 –

+1

デバッガは配列にアクセスしたコードの最初の行を特定しませんでしたか? –

関連する問題