0

このC++Direct3D関数をDelphiに変換しようとしていますが、問題が発生しています。

HRESULT GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32)
{
    if( FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, NULL)) )
        return E_FAIL;

    WORD colour16 =    ((WORD)((colour32>>28)&0xF)<<12)
            |(WORD)(((colour32>>20)&0xF)<<8)
            |(WORD)(((colour32>>12)&0xF)<<4)
            |(WORD)(((colour32>>4)&0xF)<<0);

    D3DLOCKED_RECT d3dlr;  
    (*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0);
    WORD *pDst16 = (WORD*)d3dlr.pBits;

    for(int xy=0; xy < 8*8; xy++)
        *pDst16++ = colour16;

    (*ppD3Dtex)->UnlockRect(0);

    return S_OK;
}

これは、エラーのあるDelphi変換関数です。

function GenerateTexture(pD3Ddev: IDirect3DDevice9; ppD3Dtex: IDirect3DTexture9; colour32: dword):HRESULT;
var
 colour16: word;
 d3dlr: D3DLOCKED_RECT;
 pDst16: pword;
 xy: integer;
begin
 if failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then result := E_FAIL;

 colour16 := (word(((colour32 shr 28)and $F) shl 12)
             or word((((colour32 shr 20)and $F) shl 8))
             or word((((colour32 shr 12)and $F) shl 4))
             or word((((colour32 shr 4)and $F) shl 0)));

  ppD3Dtex.LockRect(0, d3dlr, 0, 0);
  pDst16 := PWORD(d3dlr.pBits);
  xy:=0;
  while xy<(8*8) do begin
   Inc(pDst16^);
   pDst16^ := color16; //THIS IS THE LINE WITH ERROR: '('Expected but ';' found.
   inc(xy);
  end;
  ppD3Dtex.UnlockRect(0);

  Result := S_OK;
end;

何か間違ったものを変換していると思いますが、何がわかりません...

誰か助けてもらえますか?ありがとう

4

3 に答える 3

2

変数は、color16ではなくcolour16と呼ばれます。

また、より高い位置に別のエラーがあります。Cでは、returnは関数をすぐに終了しますが、Delphiの場合はそうではないため、失敗した場合の呼び出しでは次のようなものが必要になります。

if failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then
begin
  result := E_FAIL;
  Exit;
end;
于 2012-04-12T16:27:44.997 に答える
1

私が気付いた小さなことの1つは、Inc(pDst16 ^)が割り当ての下にあるはずです。これは、c++バージョンがプリインクリメントではなくポストインクリメント表記を使用しているためです。

于 2012-04-13T07:12:48.733 に答える
0
function GenerateTexture(pD3Ddev: IDirect3DDevice9; ppD3Dtex: IDirect3DTexture9; colour32: dword):HRESULT;
var
    colour16: word;
    d3dlr: D3DLOCKED_RECT;
    pDst16: pword;
    xy: integer;
begin
     if Failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then
     begin
        result := E_FAIL;
        Exit;
    end;
    colour16 := (word(((colour32 shr 28)and $F) shl 12)
        or word((((colour32 shr 20)and $F) shl 8))
        or word((((colour32 shr 12)and $F) shl 4))
        or word((((colour32 shr 4)and $F) shl 0)));

    ppD3Dtex.LockRect(0, d3dlr, nil, 0);
    pDst16 := PWORD(d3dlr.pBits);
    xy:=0;
    while xy<(8*8) do begin
        Inc(pDst16^);
        pDst16^ := colour16;
        Inc(xy);
    end;
    ppD3Dtex.UnlockRect(0);
    Result := S_OK;
end;
于 2013-01-20T21:49:13.107 に答える