2013-05-02 14 views
5

タイトルのようなものはありますか?レコードタイプの前方宣言

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; 

デルファイを知っている人は明らかに問題が表示されます。私は前に私が遭遇していないan API structureを変換する部分でこれをやろうとしている、と何かに実行しています。これを回避するにはどうしますか?

答えて

9

私はこれが最も簡単な解決策だと思う。確かに

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; 

、あなたは明らかに(バイ値)ポインタパラメータによってvarパラメータをreaplceすることができます。 TReaderModeInfoの前にPReaderModeInfoと宣言することは問題ありません。

+0

ありがとうございます!今すぐ実装に行く! – Glenn1234

+0

これが唯一の方法ですが、私はこの正確なシナリオでも解決策を一度探しました。ポインタバージョンを使用する場合にのみ適用されます。 –

+0

明示的なポインタなしで関数を呼び出すことが重要な場合は、 'prmi'を型なしの' var'パラメータにすることも可能です。あなたはもちろん型の安全性を失うので、私はそれを自分でやってはいけませんが、他の人はそうかもしれないので、ここで言及していることを確かめてください。 – hvd