2017-12-20 2 views
1

나는 검색했지만 검색했지만 예제가 없습니다. 동적으로 각각 PageControl 인스턴스를 만들고 싶습니다. TTabsheets. 그러나 나는 내가 어떻게해야합니까, 델파이 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

디버거가 배열에 액세스 한 첫 번째 코드 줄을 찾아 내지 못 했습니까? –

관련 문제