Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überkreuzender Bezug 2er Units :( (https://www.delphipraxis.net/113411-ueberkreuzender-bezug-2er-units.html)

Spiderpig_GER_15 7. Mai 2008 15:22


Überkreuzender Bezug 2er Units :(
 
Hi,

Wollte meinen Quelltext ein bisschen ordnen und hab dann für meine Klasse TMyMario,
eine neue Unit angefangen.

In Meiner Main Unit hab ich die dann auch eingebunden, und alles hat wieder wunderbar funktioniert.

ABER, ich kann nur von meiner Main Unit auf meinen Mario zugreifen(Wenn ich einen Punkt mache erscheint dieses Menü) und wenn ich In Meiner TMyMario Unit "MyMario.*Punkt*" eingebe, kommt Fehler in Quelltext.

Also dachte ich einfach, Mal in der TMyMario Unit die Unit Main einbinden, aber dann kommt Überkreuzender Bezug 2er Units :(

Mach ich was falsch oder ist das normal?

MfG Spiderpig

mquadrat 7. Mai 2008 15:25

Re: Überkreuzender Bezug 2er Units :(
 
Das ist normal. Delphi kann keine Zyklen in den Uses-Anweisungen der Interfaces. Warum musst du von der TMyMario auf die Main-Unit zugreifen?

mkinzler 7. Mai 2008 15:25

Re: Überkreuzender Bezug 2er Units :(
 
Lagere Gemeinsames in eine Unit aus, welche du von beiden Units dann referenzierst oder binde einmal im Interface und einmal im Implementierungsteil ein

himitsu 7. Mai 2008 15:28

Re: Überkreuzender Bezug 2er Units :(
 
duhast bestimmt beide Units jeweils im Interface-Abschnitt eingebunden?

Binde doch die eine Unit (idealer Weise die Main) im Implementation-Abschnitt ein.

Delphi bindet die uinits in der Reinfolge in die EXE ein, in welcher sie im QuellCode eingebunden wrden, und zwar fängt Delphi mit der Abhänigen Unit an ... wenn du nun beide per Hier im Forum suchenKreuzverweis einbinden willst, weiß Delphi nicht mehr welche Reinfolge es nhmen soll, da die eine Unit von der Anderen abhängig ist und die Andere wiederum von der Ersten ...



Delphi-Quellcode:
Unit Main;

Interface
  Uses MyMario;

Implementation

End.
Delphi-Quellcode:
Unit MyMario;

Interface

Implementation
  Uses Main;

End.

Spiderpig_GER_15 7. Mai 2008 15:32

Re: Überkreuzender Bezug 2er Units :(
 
wie binde ich denn eine unit im Implementations Teil ein?

Spiderpig_GER_15 7. Mai 2008 15:33

Re: Überkreuzender Bezug 2er Units :(
 
mercì,

eine sekunde später kam's schon :stupid:

Ich versuchs dann mal, wenn nciht meld ich mich nochmal :mrgreen:


THX :cat:

grenzgaenger 7. Mai 2008 15:34

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von mkinzler
Lagere Gemeinsames in eine Unit aus, welche du von beiden Units dann referenzierst oder binde einmal im Interface und einmal im Implementierungsteil ein

dann wird aber eine zusätzliche kopie der unit in die ECHSE eingebunden. das solltest du wenn möglich vermeiden. prüfe mal dein Objektdesign!

Spiderpig_GER_15 7. Mai 2008 15:35

Re: Überkreuzender Bezug 2er Units :(
 
JUHUUUU es klappt auch noch :!: :!: :!:

:dp:
:dp:
:dp:

mkinzler 7. Mai 2008 15:36

Re: Überkreuzender Bezug 2er Units :(
 
Also solle er einen Kreuzbezug der Auslagerung vorziehen?

sakura 7. Mai 2008 15:36

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von grenzgaenger
dann wird aber eine zusätzliche kopie der unit in die ECHSE eingebunden.

Bitte was :shock: :gruebel:

...:cat:...

angos 7. Mai 2008 15:49

Re: Überkreuzender Bezug 2er Units :(
 
Hi, ich glaube du machst einen elementaren Fehler mit Objekten, auch wenn dein akutes Problem jetzt gelöst scheint.

Zitat:

Zitat von Spiderpig_GER_15
[...]
ABER, ich kann nur von meiner Main Unit auf meinen Mario zugreifen(Wenn ich einen Punkt mache erscheint dieses Menü) und wenn ich In Meiner TMyMario Unit "MyMario.*Punkt*" eingebe, kommt Fehler in Quelltext.
[...]

Aus welchem Grunde solltest du in der TMyMario - Unit auf (das interpretiere ich jetzt einfach mal so) das Objekt MyMario welches du in der Main erstellst, zugreifen?

Du solltest doch alles was du mit der Klasse machen willst innerhalb der Klasse zur Verfügung haben/durch Funktionen an die Klasse übergeben.

um mkinzler zu zitieren
Zitat:

prüfe mal dein Objektdesign!
(Ich hoffe du sprichst grad auch von OOP ;) )

[edit]fehlerteufel[/edit]

Spiderpig_GER_15 7. Mai 2008 16:12

Re: Überkreuzender Bezug 2er Units :(
 
also das ist soweit correct interpretiert, aber ich bin mir keiner Schuld bewusst,
denn ich habe meine Methoden(MyMario.GoRight) von MyMario in der Unit TMyMario.
Und dafür muss ich wohl oder übel folgendes eingeben:

Delphi-Quellcode:

//In der Unit TMyMario

procedure TMario.GoRight;
begin
MyMario.X:=MyMario.X+5;
end;
und so wie es im Moment ist funktioniert es!

und was soll denn da falsch sein?

MfG Spiderpig

Assertor 7. Mai 2008 16:15

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von Spiderpig_GER_15
Delphi-Quellcode:
//In der Unit TMyMario
procedure TMario.GoRight;
begin
MyMario.X:=MyMario.X+5; // hier ist was FALSCH!
end;

Also wenn Du das so machst, wunder dich später mal nicht über Exceptions!

Da gehört folgendes hin:
Delphi-Quellcode:
//In der Unit TMyMario
procedure TMario.GoRight;
begin
 X := X + 5; // hier ist was richtig!
end;
Gruß Assertor

Edit: Und überleg mal genau, warum. Was ist eine Klasse?

Spiderpig_GER_15 7. Mai 2008 16:37

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von Assertor
Edit: Und überleg mal genau, warum. Was ist eine Klasse?

ähm was denn? Warum ist das denn jetzt richtiger?, was sind exceptions und warum funktioniert es dann trotzdem?

MFG

Spiderpig

Habe das jetzt geändert, und die Unit Main aus Unit TMyMario wieder ausgebunden(Das sollte ich ja tun?!), die Stelle mit dem X funktioniert, jetzt kann ich aber nicht mehr auf MyImageList zugreifen, und das geht nur dann wieder, wenn ich die Unit wieder einbinde
Also muss ich die Unit Main doch drinnen lassen?!

Assertor 8. Mai 2008 10:30

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von Spiderpig_GER_15
Warum ist das denn jetzt richtiger?

Weil Du dich innerhalb einer Klasse, auf eine einzelne Klasseninstanz beziehst. Das kann nur Probleme machen. Bei Dir geht es diesmal gut, weil es die Instanz gibt. Wenn diese Instanz mal anders heißt, wirft der Compiler eine Fehlermeldung, wenn Sie aber da ist, jedoch noch nicht Erzeugt, gibt es eine Exception.

Kurze Analogie:
- Klasse: Grüne Autos
- Klasseninstanz: Ein (bestimmtes) grünes Auto

Zitat:

Zitat von Spiderpig_GER_15
was sind exceptions und warum funktioniert es dann trotzdem?

Exceptions sing grob vereinfacht Fehlermeldungen:
http://www.delphi-treff.de/tutorials...shkurs/page/9/

Zitat:

Zitat von Spiderpig_GER_15
...jetzt kann ich aber nicht mehr auf MyImageList zugreifen, und das geht nur dann wieder, wenn ich die Unit wieder einbinde. Also muss ich die Unit Main doch drinnen lassen?!

Ich habe keine Anhang, wo Deine "MyImageList" deklariert ist *Glaskugel such*

Ansonsten mal grob die Empfehlung für ein günstiges Anfängerbuch:
Amazon Delphi Einsteiger Buch

Gruß Assertor

angos 8. Mai 2008 10:38

Re: Überkreuzender Bezug 2er Units :(
 
Zitat:

Zitat von Spiderpig_GER_15
Zitat:

Zitat von Assertor
Edit: Und überleg mal genau, warum. Was ist eine Klasse?

ähm was denn? Warum ist das denn jetzt richtiger?, was sind exceptions und warum funktioniert es dann trotzdem?

Geh mal davon aus du willst 2 TMyMario-Objekte erzeugen, dann haste im Main MyMario und MyMario2. Wenn du das nach der korrekten Methode wie durch Assertor beschrieben machst, kannst du wunderbar mit beiden MyMarios arbeiten. Was würde denn bei deinem Source passieren, wenn nur MyMario2 schon erzeugt ist, und du dann auf deine GoRight Funktion zugreifst. Genau!: Eine Exception (Ausnahmefehler) würde auftreten.

Befasse dich nochmal mit den Grundlagen der objektorientierten Programmierung. Dann wird dir einiges klarer sein.

Zitat:


MFG

Spiderpig

Habe das jetzt geändert, und die Unit Main aus Unit TMyMario wieder ausgebunden(Das sollte ich ja tun?!), die Stelle mit dem X funktioniert, jetzt kann ich aber nicht mehr auf MyImageList zugreifen, und das geht nur dann wieder, wenn ich die Unit wieder einbinde
Also muss ich die Unit Main doch drinnen lassen?!
Wenn du innerhalb der Klasse ein Imagelist benötigst, warum übergibst du die imagelist nicht an die Klasse?

Grobes BeispieL:
Delphi-Quellcode:
  TMyMario = class(TObject);
private
FMyImgList: TImageList;
public
property MyImgList: TImageList read FMyImgList write FMyImgList;
[...]
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz