Einzelnen Beitrag anzeigen

ognif

Registriert seit: 28. Jun 2019
3 Beiträge
 
#1

Bitweise Parameter füllen in Delphi

  Alt 28. Jun 2019, 21:44
Hallo zusammen,

eigentlich bin ich C++ Entwickler, wurde jetzt aber in ein Delphi Projekt "verliehen" und soll dort aushelfen.
Ansich klappt das ganz gut, aber ich komme langsam an die Verständnisprobleme zwischen C++ und Delphi.

Es geht hier primär um den C++ Operator |= in Delphi. Ich habe zu dem Thema schon einiges gefunden aber irgendwie klappt nichts was es eigentlich soll, sofern ich es richtig verstehe.

Also als Einleitung:
Ich hbae in Delphi zwei Enumerations:
Code:
TCreateImageTask = (
  citCreate = 1,
  citVerify
);
und
Code:
TImageType = (
  itISO = 1,
  itBin
);
Sehen ja beide ersteinmal gleich aus.
Ich versuche die ganze Zeit, TCreateImageTask in einen Paramater zu bekommen.

Hierzu habe ich als Vorlage genommen:
Code:
function TSampleVCL.GetPossibleImageTypes: TImageTypes;
var W:word;
begin
    CheckActive;
    DLL.GetPossibleImageFormats(@W);
    Result:=[];
    if (W and BS_IMG_ISO)<>0 then Result:=Result+[itISO];
    if (W and BS_IMG_BIN)<>0 then Result:=Result+[itBin];
end;
Dieser Code ist aus einer VCL Komponente. Funktioniert einwandfrei.

Das ganze habe ich jetzt versucht in eine andere Funktion zu bringen:
Code:
function TfrmMain.GetImageTask: TCreateImageTask;
begin
    Result:=[];
    if chkCreate.checked then Result:=Result+[citCreate];
    if chkVerify.checked then Result:=Result+[citVerify];
end;
Hier gibt mir Delphi beim compilieren aus:
[dcc32 Fehler] Main.pas(619): E2010 Inkompatible Typen: 'TCreateImageTask' und 'Set'
[dcc32 Fehler] Main.pas(620): E2008 Inkompatible Typen
[dcc32 Fehler] Main.pas(621): E2008 Inkompatible Typen
[dcc32 Fehler] Main.pas(239): E2065 Ungenügende Forward- oder External-Deklaration: 'TfrmMain.GetCreateTypes'

Wieso meckert Delphi hier, wenn Delphi mit einer fast identischen Funktion in einer VCL damit super klarkommt?

Das Problem ist, dass ich in Delphi eine Funktion füttern muss, welche die Deklaration hat:
Code:
function CreateImage(ImagePath, BadSectorsPath: string; ImageType: TImageType; Task: TCreateImageTask; VerifySectorBuffer: integer; FullCapacity: boolean):boolean;
Task: TCreateImageTask muss dabei bitweise gefüllt sein. Also citCreate oder citVerify alleine oder zusammen.
Hinweis: Übergeb ich nur citCreate oder citVerify wird die Funktion einwandfrei ausgeführt.

Es wird am Ende eine Funktion in einer C++ DL Laufgerufen mittels:

Code:
function TFoxBurnerSDK.CreateImage(ImagePath, BadSectorsPath: string; ImageType: TImageType; Task: TCreateImageTask; VerifySectorBuffer: integer; FullCapacity: boolean):boolean;
var CIP:TCreateImageParams;
begin
    CheckActive;
    StrPLCopy(CIP.ImagePath,ImagePath,MAX_PATH-1);
    StrPLCopy(CIP.BadSectorsFilePath,BadSectorsPath,MAX_PATH-1);
    CIP.ImageType:=integer(ImageType);
     CIP.VerifySectorBuffer:=integer(VerifySectorBuffer);
     CIP.FullCapacity:=BoolToByte(FullCapacity);
    FillReadErrorCorrectionParams(CIP.ErrorParams);
    Result:=DLLResult(FoxBurnerSDKCore.CreateImage(CIP,integer(Task)));
end;
In C++ mache ich einfach

Code:
__int8 dwOperation = 0;

   if (this->IsDlgButtonChecked(IDC_CHECK_CREATE))
   {
      dwOperation = BS_IMGTASK_CREATE;
   }

   if (this->IsDlgButtonChecked(IDC_CHECK_VERIFY))
   {
      dwOperation |= BS_IMGTASK_VERIFY;
   }

int32 res = ::CreateImage(cCreateImageParams, dwOperation);
Was verstehe ich da an der Funktionsweise nicht um das ganze bitweise zu befüllen? Besonders da es ja anscheinend in GetPossibleImageTypes funktioniert.

Geändert von ognif (28. Jun 2019 um 21:46 Uhr)
  Mit Zitat antworten Zitat