4 Stimmen

In Delphi, Problem bei der Verwendung von Typdefinitionen in verschiedenen Einheiten

Mit Delphi 2010... Ich habe eine Reihe von binären Eigenschaften, die ich zusammen gruppieren möchte. Ich habe sie als solche definiert...

type
    TTableAttributeType = (
        tabROOT = 1, 
        tabONLINE = 2, 
        tabPARTITIONED = 3, 
        tabCOMPRESSED = 4,  
        );

// Make a set of of the Table Attribute types...
type
      TTableAttrSet = Set of TTableAttributeType;

In meiner Unit MAIN.PAS kann ich eine Variable vom Typ TTableAttrSet erstellen. Eine andere Unit, UTILS.PAS, muss ebenfalls den Typ TTableAttrSet verstehen. Das wird von den USES-Klauseln erledigt...

Main USES Util... Util USES Main (Die 2. verwendet Klauseln, unter Implementierung Abschnitt, so dass ich nicht bekommen zirkuläre Referenz Probleme....

So weit, so gut. Mein Problem ist, dass ich eine var-Variable vom Typ TTableAttrSet FROM main an Utils übergeben muss.

In main.pas

procedure TForm1.Button1Click(Sender: TObject);
    var
    TabAttr : TTableAttrSet;

    begin
    TestAttr (TabAttr);
    end;

und in UTILS.PAS, habe ich

procedure TestAttr(var Attr: TTableAttrSet);
begin
      Attr := [tabROOT, tabCOMPRESSED];
end;

Wenn ich dies versuche, stoße ich auf mehrere Probleme... Problem 1). Wenn ich meine Prozedurdefinition am Anfang von utils.pas definiere,

procedure TestAttr(var Attr: TTableAttrSet);

Ich erhalte die Fehlermeldung, dass TTableAttrSet ein nicht deklarierter Bezeichner ist. Dies ist sinnvoll, da die Definition in Main.pas steht und das "uses Main.pas" NACH meinen Prozedurdefinitionen steht. Wie kann ich dieses Problem umgehen? Im Moment habe ich die TTableAttrSet-Typdefinition oben in der Datei Utils.pas sowie in Main.pas dupliziert, aber das scheint nicht der richtige Weg zu sein.

Problem 2). Das größere Problem, auf das ich stoße, ist ein Kompilierfehler. in der aufrufenden Zeile in Main.pas

TestAttr(TabAttr);

Ich erhalte die Fehlermeldung 'Typen der aktuellen und formalen Parameter müssen identisch sein'. Meines Wissens sind sie identisch. Worüber beschwert sich der Compiler?

6voto

David Heffernan Punkte 585606

Die einfache Lösung besteht darin, die Deklaration von TTableAttributeType an die Einheit Utils. Sie können es nicht zweimal deklarieren, weil Sie dann zwei verschiedene Typen haben. Das nützt Ihnen nichts, Sie brauchen nur einen einzigen Typ.

Diese Lösung funktioniert so lange, wie der Hauptrechner nicht auf die TTableAttributeType in seinem Schnittstellenbereich. Da die Einheit Utils dies eindeutig tun muss, würde dies eine zirkuläre Abhängigkeit zwischen den Schnittstellenabschnitten der Einheiten schaffen, was illegal ist.

Wenn sowohl die Main- als auch die Utils-Einheiten auf Folgendes verweisen müssen TTableAttributeType in ihren Schnittstellenabschnitten enthalten, müssen Sie eine weitere Einheit erstellen, die nur Typdeklarationen enthält. Diese Unit könnte sowohl von Utils als auch von Main in ihren interface Abschnitte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X