2015-01-28 4 views
2

델파이에서 TForm에서 파생 된 기본 폼 클래스를 generic으로 정의 할 수 있는지 궁금합니다. 내가하고있는 응용 프로그램은 다양한 하드웨어 장치 (직렬 포트, USB, 이더넷 등을 통해)와 상호 작용하며 각 장치가 해당 장치에 특정한 속성을 포함하는 속성 양식을 표시 할 수 있기를 원합니다. 폼 디자이너에 액세스하려고 할 때Delphi - TForm 및 Generics

지금까지 나는 다음과 같은 코드를 가지고 ...

// DEVICE MODEL... 

// Interface defining a device 
IDevice = interface 
    procedure ShowPropertyForm; 
    // ... Other procedures and functions 
end; 

// Abstract base device class 
TDevice = class(IDevice) 
    protected 
     // Override this function to show their property form 
     procedure DoShowPropertyForm; virtual; abstract; 

    public 
     // Calls Self.DoShowPropertyForm; 
     procedure ShowPropertyForm; 
end; 

TSerialDevice = class(TDevice) 
    protected 
     // Creates and shows the TSerialDeviceForm below 
     procedure DoShowPropertyForm; override; 
end; 

// Represents a device capable of providing positioning information 
TGpsDevice = class(TSerialDevice) 
    protected 
     // Creates and shows the TGpsDeviceForm below 
     procedure DoShowPropertyForm; override; 
end; 

// FORM MODEL... 

// Represents a base form, with skinning functionality, etc 
TBaseForm = class(TForm) 

end; 

// Base device properties form, allows the form to access a strongly-typed 
// version of the IDevice 
TDeviceForm<T : IDevice> = class(TBaseForm) 

    private 
     FDevice : T; 

    public 
     // Accessor for the associated IDevice 
     property Device : T read FDevice write FDevice; 
end; 

// Property form for a TSerialDevice, has controls for controlling port name 
// baud rate, stop/start bits, etc 
TSerialDeviceForm = class(TDeviceForm<TSerialDevice>) 

end; 

// Property form for a TGpsDevice, has controls in addition to what is 
// provided by the TSerialDeviceForm 
TGpsDeviceForm = class(TSerialDeviceForm) 

end; 

문제는 온다. 예를 들어 TBaseForm에는 "OK"및 "Cancel"버튼이 있습니다. TDeviceForm에 추가 기능을 추가하려고하지만 디자이너를 열려고하면 다음 오류가 나타납니다.

폼을 만들 때 오류가 발생했습니다. 루트 클래스를 찾을 수 없습니다 : "". 나는 TGpsDeviceForm 디자이너를 열려고하면

는 마찬가지로, 나는 다음과 같은 오류가 ...

을 만드는 중 오류 형식 : 'TSerialDeviceForm'에 대한 조상을 찾을 수 없습니다.

저는 델파이 폼 디자이너가 제네릭을 다룰 수는 없지만이 문제를 해결할 더 좋은 방법이있을 수 있다고 생각합니다. 상속 DeviceForm에 TDeviceForm :

객체 DeviceForm 다음 DFM 파일에서

는 TBaseForm 이외의 모든 것을, 나는에서 첫 번째 줄을 변경했을 TDeviceForm

그러나이 아무런 차이가없는 것 같습니다.

누구든지 조언을 제공해 줄 수 있습니까? 미리 감사드립니다.

+0

지금까지 내가 아는 한 시각적 형식 상속은 제네릭 형식과 함께 사용할 수 없습니다. –

+0

답변 해 주셔서 감사합니다. 어제 제가 TSerialDeviceForm 및 TGpsDeviceForm과 같은 폼 디자이너에 액세스 할 수 있었던 어제의 시점에 이르렀지만, 이번에는 공을 안 맞았습니다. 순수한 운! – weblar83

+0

일반 매개 변수를 계층 구조의 아래쪽에 배치하면 VFI를 끝내고 나면 정상적으로 작동합니다. –

답변

0

현재 델파이는 DFM 파일에 제네릭이 존재하는 것을 지원하지 않습니다. 그러나 일부 의견에서 설명 한 내용을 고려할 때 문제는 과거와 비슷하다는 것을 이해했습니다.

필자가 수행 한 작업은 시각적 형식 상속과 프레임 사용을 혼합 한 것입니다. 좀 더 구체적으로, 나는 폼의 계층 구조와 프레임의 계층 구조를 생성하고 함께 사용하여 특정 객체와 함께 작업 할 수있는 특정 양식을 갖추어야했습니다. 양식은 주어진 특정 객체에 대해 작업 할 때 그리 많지는 않았지만 프레임은 이러한 종류의 특정 처리를 담당했습니다.

프레임에 올바른 객체 유형이있는 특성이있어서 컴파일러에서 특정 유형의 검사를 받았는데 특히 가장 복잡한 코드에서 유형을 확인했지만 일부 부분에서는 유형을 직접 확인해야했습니다. 제네릭을 사용하지 마십시오.

이 모델이 귀하의 필요에 맞는지도 모릅니다.

+0

의견을 보내 주셔서 감사합니다. 제가 올바르게 이해한다면, 특정 물체를 다루는 기능을 가진 것이 당신의 프레임 이었습니까? 나는 제네릭을 뺀 타입 체크를하지 않는 해결책을 생각해 냈습니다. "대답"이 아니라 여기에 게시하는 방법을 잘 모르겠지만 필요한만큼 충분합니다. – weblar83

+0

올바른, 프레임은 특정 개체에 대한 작업 전용입니다. 프레임 코드 안에는 유형 검사가 컴파일러에 의해 제공됩니다. 외부, 양식 코드에서 형식 검사는 런타임에 있어야하고 결국에는 예외를 생성해야했습니다. – AlexSC