Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 19:28

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Von Cpp zu Delphi
BeitragVerfasst: Mo Sep 03, 2007 11:18 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Hallo zusammen,
ich programmiere nun schon seit etlicher Zeit mit C, Cpp und C#, und muss bzw. darf (je nachdem wie man es nimmt) jetzt mit Delphi arbeiten. Ich habe ein paar Fragen bezüglich der Syntax und bezüglich dem übergeben von Parametern an Funktionen. Ich hoffe mir kann hier jemand weiterhelfen:
1. In C gibt es den sog. "this" Pointer. Was ist das Pendant zu diesem Zeiger unter Delphi?
2. In C# werden ja Klassen, bis auf wenige Ausnahmen als Referenz übergeben, ist das in Delphi auch so? Wenn nicht, wie übergebe ich eine Referenz?
Danke schonmal im Vorraus für die Antworten
Cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 11:33 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
1. self
2. ist genauso. zum referenzieren von werttypen laesst sich u.a. das schluesselwort var verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 12:25 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
OK danke schonmal für die Hilfe. Ich hänge aber immernoch ^^. Und zwar hier:
Code:
  1.  
  2. unit uM;
  3. interface uses Forms, SysUtils;
  4. type
  5. TForm1 = class(TForm);
  6.  
  7. M = class(TObject)
  8. public
  9. constructor Create(form : TForm1);
  10. end;
  11. implementation uses main; //Hier ist TForm1 definiert
  12.  
  13. constructor M.Create(form : TForm1);
  14. begin
  15. end;
  16.  

bei einem Aufruf innerhalb von TForm1:
Code:
  1.  
  2. cM := M.Create(self);
  3.  

kommt die Fehlermeldung:
E2010 Inkompatible Typen: uM.TForm1 und main.TForm1
Kann mir hier jemand weiterhelfen. Ich wäre demjenigen sehr zu Danke verpflichtet ;)
cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 12:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1. type
  2. TForm1 = class(TForm);

bedeutet das TForm1 noch in dieser Unit definiert wird. Du müsstest die Main nicht erst bei der Implementation sondern im Interface einbinden damit das korrekte TForm1 definiert wird.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du gerade frisch Delphi lernst, kann ich dir auch diese Seite (*klick*) empfehlen. Dort gibt es eine menge tipps und tricks, Tutorials und ein relativ aktives Forum. Du solltest dort nur immer die Suchfunktion benutzen und lass dich von DragonsLair nicht einschüchtern :wink:

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
i0n0s: Nicht direkt. "TForm1 = class;" ist das was du meinst bei "TForm1 = class(TForm);" wird bereits eine Ableitung erstellt.

Code:
  1. TForm1 = class(TForm);

Damit leitest du eine neue Klasse ab. Auch wenn diese ziemlich leer ist handelt es sich um eine neue Klasse. Mit anderen Worten du hast 2 Klassen mit dem Namen TForm1. Und die sind natürlich nicht kompatibel.

Wenn du auf TForm1 der Unit Main zugreifen möchtest so brauchst du nichts weiter tun als die Unit Main in die uses Klausel zu schreiben. Allerdings hast du da das Problem, dass du eine zirkuläre Referenz bekommen wirst, da beide Klassen jeweils die andere zwingend benötigen.

Was is eine Zirkuläre Referenz und wie kann man so etwas vermeiden. Eine zirkuläre Referenz entsteht, wenn sich 2 Units gegenseitig im Interfaceteil einbinden. Also Unit A bindet Unit B im interface ein und Unit B bindet Unit A im interface ein. Denn für deinen Fall müsstest du das eigentlich so machen. Da das aber nicht geht muss du dir etwas anderes überlegen. Möglichkeit 1. Du definierst beide Klassen in ein und der selben Unit. Da sie zwingend miteinander zu tun haben ist das auch nicht wirklich schlimm. Möglichkeit 2. Du Strickst die Klasse "M" so um, dass sie nicht mehr direkt TForm1 benötigt sondern mit einem TForm klar kommt.

PS: Als kleine Anmerkung. Wo du jetzt mit Pascal anfängst würde ich dir auch empfehlen deinen Code nicht so stark zu komprimieren. Leerzeilen tun nicht weh. Und Klassen mit dem Namen "M" sind ganz schlecht. Üblicherweise fangen Klassen in Pascal mit einem großem T an. Und M ist auch etwas kurz. Das aber nur, weil es später meistens länger dauert sich einen sauberen Stil anzugewöhnen. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wo Lossy gerade damit anfängt, muss ich ihm recht geben. Ich habe mittendrin angefangen, meinen Stil aus verschiedenen Gründen umzustellen und es war nicht einfach. Daher kann ich dir mal diese Styleguide (*klick*) auch auf dsdt.info empfehlen.

Aber BTT.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 13:21 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Hey ho,
vielen Dank erstmal für die Hilfe. Ich muss vielleicht anmerken, dass ich kein Neuling bin, was das Programmieren angeht. Ich komme halt nur noch nicht so ganz mit der Delphi Syntax klar.
Ich weiß auch was das Problem mit der cross reference ist, ich weiß nur nicht wie ich das in Delphi umgehen kann. Das ist echt ziemlich frustrierend!
In C würde das einfach so gehen:
Code:
  1.  
  2. \\header1
  3. class Foo;
  4. class Bar {};
  5.  
  6. \header 2
  7. #include "Bar.h"
  8. class Foo {};
  9.  

Und fertig ist. Weiter will ich erstmal gar nicht, ok bis auf referenzen oder so. Ich bin jedenfalls kurz davor eine c-dll zu bauen und die in das Delphi projekt einzubinden. Es sei denn ihr helft mir weiter ^^
Ich bau auf euch!!!
cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das du dich schon mit der Materie auskennst ist auf jeden Fall schonmal von Vorteil.

Aber anders als in C kannst du unter Pascal eine Klasse nur innerhalb des selben Type blockes vordefinieren.

Code:
  1. type
  2.   TM = class;
  3.  
  4.   TForm1 = class(TForm)
  5.     M: TM;
  6.   end;
  7.  
  8.   TM = class
  9.     Form: TForm1;
  10.   end;

Funktioniert.

Code:
  1. type
  2.   TM = class;
  3.  
  4.   TForm1 = class(TForm)
  5.     M: TM;
  6.   end;
  7.  
  8. type
  9.   TM = class
  10.     Form: TForm1;
  11.   end;

Funktioniert nicht mehr, da die Definition von "TM = class;" nicht vollständig ist. Entsprechend geht es auch nicht, dass du sie in UnitA Vordefinieren und in UnitB richtig definierst.

Du musst jetzt schauen was du damit machen willst? Das können wir nicht wissen, denn es gibt verschiedene Wege.
1. Entweder beide Klassen in der selben Unit (Typeblock), dann ist so ziemlich alles möglich.
2. Oder eine der beiden Klassen muss sich mit weniger zu Frieden geben. Also wenn TM nur ein Fenster benötigt, dann könnte es auch mit einem TForm arbeiten und müsste von TForm1 nichts genaues wissen.
3. Falls das TM kein fester Bestandteil der Klasse TForm1 sein muss sondern nur in einer Methode benutzt wird, dann kannst du die Unit des TMs auch im implementationteil einbinden und kannst sie dann im Implementationteil beliebig benutzen.

Sollte das nicht das treffen was du willst dann solltest du etwas genauer werden und uns sagen was du genau vor hast. Denn wie gesagt. Es gibt nicht nur eine Lösung für dieses Problem. Und wir können so nur raten was du genau bezweckst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 13:54 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Hey Lossy eX,
danke nochmal für dein Posting, ich kann immerhin jetzt das Projekt kompilieren : ). Das ist schonmal der erste schritt. Ich hab es nach deinem Punkt 2 gemacht. D.h. ich hab einfach den "Parent" von Form1 in meiner Klasse M benutzt. (Sie heißt natürlich nicht wirklich M, hab das oben nur für das Beispiel benutzt^^).
Ich hab auch deinen 2. Punkt erst verstanden als ich gesehen hab, dass dieses class(Form) eine Ableitung ist. WIe gesagt Delphi syntax ist mir neu.
Jetzt stehe ich vor folgendem Problem. Ich habe in meiner Form1 natürlich jede menge Objekte. Die müsste ich natürlich irgendwie in meine M Klasse holen. Wenn ich jetzt sowas hier starte:


Code:
  1.  
  2. ...
  3. //cM wurde bereits im konstruktor erstellt und ist im speicher vorhanden
  4. begin
  5. cM.Blub(list);
  6. end;
  7.  

und list ist ein Element von Form1, wird dann die Referenz(call by reference) von dem Objekt übergeben oder wird eine Kopie(call by value) übergeben?
Wenn ich das weiß, kann ich glaub ich loslegen :)
Danke nochmal im vorraus
cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:04 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ist list eine Klasse? Dann per Reference.
Ansonsten hängt es von Blubb ab.
Sieht Blubb so aus:
procedure Blubb(bla: cBla);
ist es Value. Mit
procedure Blubb(var bla: cBla);
ist es Reference.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:20 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Du kannst im die Unit mit TForm1 in der Unit mit M im Implementetions-Teil durchaus einbinden. Zirkulär wird's nur, wenn beide im Interface-Teil stehen. Jetzt kannst Du im Konstruktor mit Assert(form Is TForm1,'Die übergebene Instanz muss vom Typ TForm1 sein.'); sicherstellen, dass M mit einer Instanz von TForm1 angelegt wird. Jetzt kannst Du im Code von M immer mit (form As TForm1). ... auf die Member von TForm1 zugreifen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:30 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Jungs, ihr seid die besten!
Ich bedanke mich, der Thread kann geschlossen werden.
Die ganze Geschichte hat mich an früher erinnert, damals als ich anfing zu proggen. Man weiß gar nicht was das für ein luxus ist, wenn man sich in einer Sprache ausdrücken kann. Aber so langsam bekomm ich ja einen überblick in Delphi, und bis auf ein paar Kleinigkeiten gefällt sie mir auch ganz gut. (Wer hat sich das nur mit dem := ausgedacht *Kopschüttel*) ;)
Also dann
happy proggin und danke nochmal
cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Woltan hat geschrieben:
(Wer hat sich das nur mit dem := ausgedacht *Kopschüttel*) ;)

Niklaus Wirth
Gegenfrage: Wer kommt nur auf sowas wie dieses komische == und && und || ... :wink:

(ich weiss, mächtiges OT, aber das musste einfach sein :wink: :roll: )

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
@LordHorazont:
Gut gekontert :mrgreen:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 15 Queries | GZIP : On ]