2013-05-02 10 views
5

Gibt es so etwas wie im Titel? Ich versuche, dies teilweise zu tun an API structure umzuwandeln, und führen Sie in etwas, das ich vorher nicht begegnet sind:Forward Deklarationen für Satzarten

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; 

Diejenigen, die offensichtliche Problem, die Delphi wissen zu sehen. Wie würdest du das umgehen?

Antwort

9

Ich denke, dies ist die einfachste Lösung:

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; 

der Tat kann man deutlich reaplce einen var Parameter durch einen (von-Wert) Zeigerparameter. Und es gibt kein Problem, PReaderModeInfo vor TReaderModeInfo zu deklarieren.

+0

Danke! Jetzt um zu implementieren! – Glenn1234

+0

Dies ist der einzige Weg, ich suchte auch einmal nach einer Lösung für dieses genaue Szenario. Und es gilt nur, wenn Sie die Zeigerversion verwenden möchten. –

+0

Nur eine Anmerkung, es sollte möglich sein, 'prmi' zu einem nicht typisierten' var' Parameter zu machen, wenn es wichtig ist, die Funktion ohne einen expliziten Zeiger aufzurufen. Du verlierst natürlich die Typensicherheit, weshalb ich es nicht selbst tun würde, aber andere könnten es tun, also stell sicher, dass es hier erwähnt wird. – hvd