Autor Beitrag
perry5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
var v1, v2, v3 : vector;

v3:=v1+v2;


Würde manches vereinfachen.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 23.08.06 22:47 
user profile iconperry5 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.

user profile iconperry5 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:

ausblenden 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 user profile iconChristian S.: Quote-Tag repariert

_________________
Markus Kinzler.
perry5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: Mi 23.08.06 22:56 
Naja, ich habe 2 Dateien die Color mit uses einbinden. Ungefähr so:

ausblenden 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;

ausblenden 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;
 //verschiedene Colorberechnungs operationen
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 23.08.06 23:02 
Dort Color genauso einbinden.

_________________
Markus Kinzler.
perry5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: Mi 23.08.06 23:20 
Hier die Klasse Lens, die ebenfalls Color benutzt.

ausblenden 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
  //result.
 end;
end.


Laut kompiler, kommt der Fehelr in der Lensklasse, da diese die Color Klasse genau wie Screen auch einbindet.

ausblenden 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' {Form1},
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 23.08.06 23:24 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
program Raytracer;

uses
  Forms,
  MainWindow in 'MainWindow.pas' {Form1};

{$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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: 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
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  TheScreen : Screen;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 TheScreen:=Screen.Init;

 TheScreen.gibFrei;
end;

end.



Raytracer
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
program Raytracer;

uses
  Forms,
  MainWindow in 'MainWindow.pas' {Form1},
  Screen in 'Screen.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



Screen
ausblenden 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;

{
Dieser "Bildschirm" speichert die Bildpunkte und
schreibt sie hinterher in eine tga-datei
}

interface

uses Color2;

type Screen = class
 XSize : integer;
 YSize : integer;
 constructor Init;
 destructor gibFrei;

end;

implementation

end.



Color2
ausblenden 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;
 //verschiedene Colorberechnungs operationen
end;


implementation

end.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 24.08.06 19:22 
Die Units dürfen nicht genauso heißen wie die Klassen.
Einloggen, um Attachments anzusehen!
_________________
Markus Kinzler.
perry5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: Do 24.08.06 20:05 
DAS kling logisch, danke^^