Autor |
Beitrag |
perry5
      
Beiträge: 102
|
Verfasst: Mi 23.08.06 22:40
Ich prgrammiere schon sehr lange C++ und versuche mich nun ein wenig mit Delphi. Da die Sprache ja etwas verschieden ist, habe ich jetzt ein paar Fragen, die gewiss einfach verklärt werden können.
Ich programmiere einen kleinen Raytracer. Mein Problem ist jetzt, das ich eine Klasse "Color" habe, die einerseits 4 Farbwerte und andererseits einige mathematische Operationen bereitstellen soll.
Nun, fast jede andere Componente muss mit Color arbeiten, wie kann ich die Klasse überall benutzen und trotzdem sie nur einmal definieren? Bei C++ war das dank Include-Guards und 2 verschiedenen Dateien recht einfach, und ich denke es sollte ähnlich in Delphi zu lösen sein, oder?
Dann noch ne kurze Frage. Kann man in Delphi Operatoren überladen? Also eine Vector Klasse schreiben, mit der man sowas hier machen kann:
Delphi-Quelltext 1: 2: 3:
| var v1, v2, v3 : vector;
v3:=v1+v2; |
Würde manches vereinfachen.
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 23.08.06 22:47
perry5 hat folgendes geschrieben: | Ich prgrammiere schon sehr lange C++ und versuche mich nun ein wenig mit Delphi. Da die Sprache ja etwas verschieden ist, habe ich jetzt ein paar Fragen, die gewiss einfach verklärt werden können.
Ich programmiere einen kleinen Raytracer. Mein Problem ist jetzt, das ich eine Klasse "Color" habe, die einerseits 4 Farbwerte und andererseits einige mathematische Operationen bereitstellen soll.
Nun, fast jede andere Componente muss mit Color arbeiten, wie kann ich die Klasse überall benutzen und trotzdem sie nur einmal definieren? Bei C++ war das dank Include-Guards und 2 verschiedenen Dateien recht einfach, und ich denke es sollte ähnlich in Delphi zu lösen sein, oder? |
Unit in Uses einbinden. Unit muß im Suchpfad oder Bib.Pfad liegen.
perry5 hat folgendes geschrieben: | Dann noch ne kurze Frage. Kann man in Delphi Operatoren überladen? Also eine Vector Klasse schreiben, mit der man sowas hier machen kann:
Delphi-Quelltext 1: 2: 3:
| var v1, v2, v3 : vector;
v3:=v1+v2; |
Würde manches vereinfachen. |
Mit Klassen (noch nicht). Ab BDS2006 kann man aber Records mit class operatoren verwenden.
Moderiert von Christian S.: Quote-Tag repariert
_________________ Markus Kinzler.
|
|
perry5 
      
Beiträge: 102
|
Verfasst: Mi 23.08.06 22:56
Naja, ich habe 2 Dateien die Color mit uses einbinden. Ungefähr so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| unit Screen;
interface
uses Color;
type Screen = class XSize : integer; YSize : integer;
end;
implementation
end. |
Hier die Color Klasse:
unit Color;
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| interface
type Color = class Blue : Byte; Green : Byte; Red : Byte; Alpha : Byte; end;
implementation
end. |
Ich habe ncoheine Klasse die genau wie Screen color mit uses einbindet. Jede Klasse ist in einer getrennten Datei. Was soll ich jetzt machen?
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 23.08.06 23:02
Dort Color genauso einbinden.
_________________ Markus Kinzler.
|
|
perry5 
      
Beiträge: 102
|
Verfasst: Mi 23.08.06 23:20
Hier die Klasse Lens, die ebenfalls Color benutzt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| unit Lens;
interface
uses Color;
type Lens = class function CalcPixel(X : real, Y : real) : Color; end;
implementation
function Lens.CalcPixel(X : real, Y : real) : Color begin end; end. |
Laut kompiler, kommt der Fehelr in der Lensklasse, da diese die Color Klasse genau wie Screen auch einbindet.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| program Raytracer;
uses Forms, MainWindow in 'MainWindow.pas' , Color in 'Color.pas', Screen in 'Screen.pas', Ray in 'Ray.pas', Vector in 'Vector.pas', Lens in 'Lens.pas';
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
Scheinbar ist dies die Reihenfolge, wie alles kompiliert wird. Nach dem redefineit fehelr kommt der Fehelr "verwendete Unit konnte nicht kompiliert werden", welche auf die Stelle "Lnes in 'Lens.pas'" verweißt. Offensichtlich gibt es also ein Problem wenn 2 Units jeweils eine andere Einbinden? Oder was mache ich sonst falsch?
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 23.08.06 23:24
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| program Raytracer;
uses Forms, MainWindow in 'MainWindow.pas' ;
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
Reicht aus, da die anderen Units hier noch nicht benötigt werden.
_________________ Markus Kinzler.
|
|
perry5 
      
Beiträge: 102
|
Verfasst: Do 24.08.06 15:09
Naja, die werden noch nciht benutzt weil ich die erstmal fertig programmeiren wollte.
Also, ich habe die anderen Zeilen mal weggemacht. Dann musste ich die Screen.pas wieder hinzufügen, da ich die ja im prinzip benutze. Das Hauptprogramm muss nur den Screen kennen, der Rest wird von ihm erledigt.
Ok, Screen also dme Projekt hinzugefügt, da wurde auch gleich Color2 demn Projekt hinzugefügt, weil Screen das ja benutzt.
Wie man mekrt, heißt die Klasse nicht mehr Color, vielleicht gibt es ja eine Systeminterne Colorklasse, daher hab ich die mal testweise Color2 genannt.
Gut, allerdings kommt da wieder derselbe Fehler.
"Bezeichner redefineit Colro2"
"verwendete Unit konnte nicht kompiliert werden Color2.pas"
Das ist aber diesmla komisch, da ich die Color2 nur ein einziges mal einbinde. Was soll das?
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 24.08.06 15:15
Zitat: | Also, ich habe die anderen Zeilen mal weggemacht. Dann musste ich die Screen.pas wieder hinzufügen, da ich die ja im prinzip benutze. |
Aber nicht hier im Hauptprogramm.
Zitat: | Ok, Screen also dme Projekt hinzugefügt, da wurde auch gleich Color2 demn Projekt hinzugefügt, weil Screen das ja benutzt. |
Dann reicht es, die Unit in Screen und u.U. den Units, die Screen verwenden einzubinden.
Zitat: | Wie man mekrt, heißt die Klasse nicht mehr Color, vielleicht gibt es ja eine Systeminterne Colorklasse, daher hab ich die mal testweise Color2 genannt. |
Diese heißt TColor
Poste mal den ganzten Source.
_________________ Markus Kinzler.
|
|
perry5 
      
Beiträge: 102
|
Verfasst: Do 24.08.06 17:18
Ja stimmt, die Color2.pas wurde nicht dem Projekt hinzugefügt, sondenrnur geöffnet.
So hier mal alle Dateien:
MainWindow
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:
| unit MainWindow;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Screen, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; TheScreen : Screen;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin TheScreen:=Screen.Init;
TheScreen.gibFrei; end;
end. |
Raytracer
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| program Raytracer;
uses Forms, MainWindow in 'MainWindow.pas' , Screen in 'Screen.pas';
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
Screen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| unit Screen;
interface
uses Color2;
type Screen = class XSize : integer; YSize : integer; constructor Init; destructor gibFrei;
end;
implementation
end. |
Color2
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| unit Color2;
interface
type Color2 = class Blue : Byte; Green : Byte; Red : Byte; Alpha : Byte; end;
implementation
end. |
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 24.08.06 19:22
Die Units dürfen nicht genauso heißen wie die Klassen.
Einloggen, um Attachments anzusehen!
_________________ Markus Kinzler.
|
|
perry5 
      
Beiträge: 102
|
Verfasst: Do 24.08.06 20:05
DAS kling logisch, danke^^
|
|
|