Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zugriffsverletzung zwischen zwei Units


THF - Mo 21.03.05 17:08
Titel: Zugriffsverletzung zwischen zwei Units
Hallo,

ich möchte in einem Nebenformular in der Unit2 in einem Edit-Feld etwas eintragen zum Beispiel 'Hallo' dies soll dann nach Bestätigung auf den OK-Button in ein Label im Hauptformular Unit1 eingetragen werden.

Ich bekomme dabei immer Fehlermeldungen weil man vom Nebenformular nicht auf das Hauptformular zugreifen kann.

Gruß

THF

Moderiert von user profile iconChristian S.: Überflüssige Zeilenumbrüche entfernt


IngoD7 - Mo 21.03.05 17:26

Ist die Unit1 per uses-Anweisung in Unit2 eingebunden?


THF - Mo 21.03.05 20:48

Hallo,

nein umgekehrt Unit2 ist bei uses in Unit1 eingebunden.

Gruß

THF


abakama - Mo 21.03.05 20:51

Du musst die Unit 1 auch in der Unit 2 einbinden.


THF - Mo 21.03.05 22:41

Hallo,

also das funktioniert nicht,
wenn ich Unit1 in Unit2 einbinde und dann noch
unit2 in Unit1 einbinde.
Ich glaube das funktioniert nicht!

Oder ? ?

Gruß

THF


retnyg - Mo 21.03.05 23:45

glaube nicht, probiere es einfach.


THF - Di 22.03.05 09:13

Hallo,

ich habs ausprobiert, funktioniert nicht!

Überkreuzender Bezug zweier Units.

Gruß

THF


Holgerwa - Di 22.03.05 10:36

Hallo,

setz mal das "Uses Unit1" nicht in den Interface-Teil von Unit2, sondern direkt nach "Implementation", dann funktionierts.

Holger


AXMD - Di 22.03.05 10:47

Hi :)!

Bitte ändere deinen Titel deines Beitrags so, dass er den Richtlinien entspricht. Dazu einfach den EDIT-Button rechts oben verwenden.

Richtlinien hat folgendes geschrieben:
1.2 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist. [..]


Danke :)
AXMD


magic87 - Fr 17.08.07 09:47

Der Beitrag wird jetzt erstmal wieder ein bisschen nach oben gepusht!=)

Ich wollte nämlich gerne wissen, warum es einen "Überkreuzenden Bezug" gibt, wenn man die Units gegenseitig im Inteface einbindet und wenn man die eine Unit im Interface und die andere im Implementation-Teil einbindet dann klappt es!

Hat dafür jemand eine logische und verständliche Erklärung?

Gruß
Bluemagicon


arj - Fr 17.08.07 11:11

Kurzes Beispiel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
unit Unit1;

interface

function Unit1Test(x : Integer) : string// * a *

implementation

uses Unit2;

function Unit1Test(x : Integer) : string// * b *
begin
  if x = 0 then
    Result := 'Unit1Test'
  else
    Result := Unit2Test(x); // * c *
end;

//////////////////////////////////////
unit Unit2;

interface

function Unit2Test(x : Integer) : string;

implementation

uses Unit1;

function Unit2Test(x : Integer) : string;
begin
  if x = 0 then
    Result := Unit1Test(x);
  else
    Result := 'Unit2Test';
end;


Der Compiler prüft beim Compilieren, ob die Typen zueinander passen, also ob du eine Funktion, die einen Integer erwartet,
auch mit einem Integer aufrufst. Dafür muss er allerdings nur die Signatur kennen. Diese wird bei * a * definiert.
Die Implementation, also der eigentliche Code der Funktion (* b *) muss keiner Typenprüfung nach außen hin standhalten. Da muss
nur intern alles stimmen. Also müssen vor dem jeweiligen Benutzen der anderen Funktionen die Signaturen bekannt sein, damit der
Compiler bei * c * prüfen kann, ob du die Funktion korrekt aufrufst.
Dass erreicht man damit, indem man die Units gegenseitig im Implementation-Teil einbindet, da hier dann einfach nur die Signaturen geschrieben werden müssen.

Ich hoffe es ist klarer geworden ;)