2013-05-02 16 views
5

Czy jest coś takiego w tytule? Staram się robić to w ramach konwersji an API structure i biegać w czymś nie spotkałem wcześniej:Deklaracje w przód dla typów rekordów

PFNReaderTranslatedDispatch = function(var msg: TMsg): BOOL; stdcall; 
PFNReaderScroll = function(var prmi: TReaderModeInfo; dx, dy: integer): BOOL; stdcall; 
TReaderModeInfo = record 
    cbSize: DWord; 
    hWnd: THandle; 
    fFlags: DWord; 
    prc: PRect; 
    pfnScroll: PFNReaderScroll; 
    fFlags2: PFNReaderTranslatedDispatch; 
    lParam: DWord; 
end; 
PReaderModeInfo = ^TReaderModeInfo; 

Ci, którzy znają Delphi ujrzy oczywisty problem. Jak byś to obejrzał?

Odpowiedz

9

Myślę, że to najprostsze rozwiązanie:

PFNReaderTranslatedDispatch = function(var msg: TMsg): BOOL; stdcall; 
PReaderModeInfo = ^TReaderModeInfo; 
PFNReaderScroll = function(prmi: PReaderModeInfo; dx, dy: integer): BOOL; stdcall; 
TReaderModeInfo = record 
    cbSize: DWord; 
    hWnd: THandle; 
    fFlags: DWord; 
    prc: PRect; 
    pfnScroll: PFNReaderScroll; 
    fFlags2: PFNReaderTranslatedDispatch; 
    lParam: DWord; 
end; 

Rzeczywiście, można wyraźnie reaplce parametr var przez (przez wartość parametru wskaźnika). I nie ma problemu z deklarowaniem PReaderModeInfo przed TReaderModeInfo.

+0

Dzięki! Teraz przejdź do wdrożenia! – Glenn1234

+0

To jedyny sposób, szukałem rozwiązania jeszcze raz w tym dokładnym scenariuszu. I dotyczy to tylko jeśli zamierzasz używać wersji wskaźnika. –

+0

Po prostu należy pamiętać, że powinno być możliwe, aby 'prmi' był niepoprawnym parametrem' var', jeśli ważne jest wywoływanie funkcji bez jawnego wskaźnika. Oczywiście tracisz bezpieczeństwo typu, dlatego nie zrobiłbym tego sam, ale inni mogą, więc upewnijcie się, że jest tu mowa. – hvd