Delphi: Zuweisung: inkompatibel obwohl. gleich?

Hallo!!

Ich hab ein grosses Problem!
ICh hab ein Hauptformular „Main“ und ein unterformular „Setup“.
Weiters habe ich eine Datei „Types.inc“ die in beiden Formularen eingebunden ist. In „Types.inc“ habe ich einen record deklariert, den ich in Main der Variable „config“ und in „Setup“ der Variable „Config“ zugewiesen habe.
Nun möchte ich aus dem Form Main mit

Setup.Config := Config;

den Record an „Config“ in Form Setup zuweisen. Dabei zeigt er mir immer eine Typinkompatibilität an, obwohl sie doch gleich sind. wie kann ich das umgehen?

MFG, Volker

Hi Volker,

ICh hab ein Hauptformular „Main“ und ein unterformular
„Setup“.
Weiters habe ich eine Datei „Types.inc“ die in beiden
Formularen eingebunden ist.

damit (Include-Datei) bewirkst Du, daß der Recordtyp je einmal in jedem der beiden Formulare separat deklariert wird. Für den Compiler sieht die Sache dann so aus, daß bloß zwei Typdeklarationen in zwei verschiedenen Units „zufällig“ gleich lauten. In einem solchen Fall sind die betreffenden Typen nicht zueinander kompatibel.

wie kann ich das umgehen?

Mach Dir klar, daß wenn es sich wirklich um denselben Typen handelt (was mit Sicherheit der Fall sein dürfte), er dann nichts in einer Incude-Datei verloren hat, sondern in eine Unit gehört. Am zweckmäßigsten ist er wohl ganz schlicht und einfach entweder in der Unit „Main“ oder aber in der Unit „Setup“ aufgehoben, oder spricht etwas dagegen, ihn dort unterzubringen?

Mit freundlichem Gruß
Martin

Hi Volker,
Vielleicht deshalb, weil du diese inc-Datei in beiden Units verwendest und diese Units auch noch untereinander aufrufst.

Es reicht eigentlich wenn du in deinem Unterformular „Setup“ diese Typdeklaration im Interface-Teil definierst - damit kennt sie automatisch auch das Hauptformular -Ansonsten ist’s „doppelt gemoppelt“ und bringt den Compiler durcheinander.
Vieleicht erstellst du auch eine Klasse von der Beide Formulare abgeleitet sind - und nimmst die Typedefinitionen in die Basisklasse auf, wäre IMHO die eleganteste Lösung.
Grüsse Mathias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Vielen Dank für den TIP!
…und gleich noch ne Frage: Wenn die Variable mit dem Record nur einmal im speicher bleiben soll, also nicht durch zuweisung verdoppelt werden soll, wie kan ich das lösen? Geht mit Pointern, oder? Dass ich einmal den Record im Speicher erstelle und dann mittels Pointer von beiden Formularen darauf zugreife?
Wie kann ich das konkret machen? Hab schon mehreres probiert, hat aber nicht geklapt!

MFG, Volker

Hi Volker,
ich würds so machen (in einer Unit):
type
tMeineDaten = Class
Name: String;
vorname: String;
Geboren: TDateTime;

constructor Create(neuName,NeuVorname:String;neuGeboren:TDateTime);
end;

Constructor tMeineDaten.Create;
begin
Name:= neuName;
…;
end;

und in dem Formular wo die diese Daten nutzt;

var
meineDaten:tmeineDaten;
begin
meineDaten:= tmeineDaten.Create(‚Hans‘,‚Meier‘,StrToDate(‚11.01.2001‘));
// und die Verwendung in anderen Funktionen reicht die übergabe
// des „Zeigers“ meineDaten

meineDaten.free;
end;

grüsse
Mathias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Vielen Dank!! Jetzt funktioniert es!! (o.T.)
.