Autor Beitrag
GR-Thunderstorm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 28.01.08 21:36 
Ich spiele zur Zeit viel Second Life und scripte dort auch hin und wieder.
In der dortigen Programmiersprache gibt es einen "Vector" Variablentyp, den man in der Schreibweise "V = <1,2,3>" angeben kann. Ich finde das ziemlich praktisch, da man auch über V.x / V.y / V.z auf die einzelnen Zahlenwerte zugreifen kann. Ich möchte diesen Variablentypen in ein Delphiprogramm einbauen. Kann mir einer erklären, wie ich sowas mache?
Klar könnte man ein Array nehmen, aber das wäre irgendwie nicht das gleiche...

Kann ich da evtl mit ner Klasse rangehen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type Vector = Class

private

public

end;
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mo 28.01.08 21:46 
Genau diese Schreibweise geht in Delphi leider nicht.
Und hier wäre ein Record besser, da eine Klasse hier oversized ist (oder willst du später mal neue Vektorklassen ableiten?)

Die Funktion zum erstellen der Vektoren sähe dann ungefähr so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TVektor = record
    X,Y,Z: IrgendeinZahlentyp
  end;

function MakeVector(X,Y,Z:IrgendeinZahlentyp):TVector

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 28.01.08 21:51 
Hmm stimmt, darauf hätte ich auch kommen können. ^^

Danke! ^^
Aber direkt Werte eingeben kann ich so nicht. :/ Muss also immer per procedure oder jede Koordinate einzeln...

Gibts da evtl ne andere Möglichkeit?
Edit: Kann man evtl irgendwie etwas "triggern", dass wenn ich k.value:=Blubb (string) mache, dass dann eine Function ausgeführt wird?
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mo 28.01.08 21:59 
Außer class operators (Ab delphi 2k6, nur für records) hab ich nur noch was ganz ekliges:
Hierfür ein eigenes PlugIn schreiben, was die Syntax genau nachbaut.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 28.01.08 22:02 
Hmm, dann steh ich aber noch vor dem großen Problem der Mathematik...

Zwei Rekords addieren ginge auch nicht ohne Funktion....

Ich glaub ich lass des denn einfach. Hatte gehofft man kann nen komplett eigenen Typen einführen ohne mit anderen Sachen rumzumurksen. :(
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 28.01.08 22:03 
Moin!

Lassen wir doch mal die Kirche im Dorf. ;)

Die Klasse ist doch schon der "richtige" Ansatz gewesen, würde ich sagen: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TVector = class(TObject)
  private
    FX, FY, FZ: Integer;
  public
    property X: Integer read FX write FX;
    property Y: Integer read FY write FY;
    property Z: Integer read FZ write FZ;
    property ValueStr: String read GetValueStr write SetValueStr;
Mal so als Idee, lässt sich sicher auch noch anders abbilden.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 28.01.08 22:04 
user profile iconGR-Thunderstorm hat folgendes geschrieben:
Edit: Kann man evtl irgendwie etwas "triggern", dass wenn ich k.value:=Blubb (string) mache, dass dann eine Function ausgeführt wird?


Eine Klasse erzeugen, und dann den Write-Property verwenden?

Edit: Zu langsam..
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 28.01.08 22:49 
user profile iconNarses hat folgendes geschrieben:
Moin!

Lassen wir doch mal die Kirche im Dorf. ;)

Die Klasse ist doch schon der "richtige" Ansatz gewesen, würde ich sagen: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TVector = class(TObject)
  private
    FX, FY, FZ: Integer;
  public
    property X: Integer read FX write FX;
    property Y: Integer read FY write FY;
    property Z: Integer read FZ write FZ;
    property ValueStr: String read GetValueStr write SetValueStr;
Mal so als Idee, lässt sich sicher auch noch anders abbilden.

cu
Narses


Cool thx, aber was genau bewirkt noch gleich "GetValueStr" und "SetValueStr"?

Aber jetzt stünde ich doch vorm selben Problem wie beim Record, oder? Wenn ich zwei Vektoren addieren möchte, geht das nur über Funktionen die das Property für Property machen und nicht einfach nur Vek3:=Vek1+Vek2;

Edit: Das Prob ist ja, dass die Vektoren nicht als Variablen sondern als Objekte gehandhabt werden.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 28.01.08 23:27 
user profile iconNarses hat folgendes geschrieben:
Die Klasse ist doch schon der "richtige" Ansatz gewesen, würde ich sagen: :idea:
Vektoren würde ich nicht als Referenzdatentypen implementieren, das gibt nur dumme Fehler, wenn man sie dann so benutzt, wie man es gewohnt ist. Würde daher für ein Record plädieren.

user profile iconGR-Thunderstorm hat folgendes geschrieben:
Aber jetzt stünde ich doch vorm selben Problem wie beim Record, oder? Wenn ich zwei Vektoren addieren möchte, geht das nur über Funktionen die das Property für Property machen und nicht einfach nur Vek3:=Vek1+Vek2;
Du musst den "+"-Operator noch definieren, was in Delphi inzwischen geht. Man nennt das dann "den Operator überladen". (Nötig ist mindestens Turbo Delphi 2006)

Hier mal eine Überladung für das Addieren.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TVector = record
  private
    FX, FY, FZ: Integer;
  public
    property X: Integer read FX write FX;
    property Y: Integer read FY write FY;
    property Z: Integer read FZ write FZ;

    class operator Add(v1 : TVector; v2 : TVector) : TVector;
  end;

(* ... *)

class operator TVector.Add(v1, v2: TVector): TVector;
begin
  result.X := v1.X + v2.X;
  result.Y := v1.Y + v2.Y;
  result.Z := v1.Z + v2.Z;
end;


Dann kannst Du den "+"-Operator ganz normal für Deinen Record benutzen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  v1, v2, r : TVector;
begin
  v1.X := 5;
  v2.X := 10;

  r := v1 + v2;
end;


Mehr findest Du in der Delphi-Hilfe und zwar in der Sprachreferenz zu Delphi. Wichtig: In Win32 geht das Überladen von Operatoren nur bei Records (evtl. ist's bei 2007 anders, weiß ich nicht) und mindestens Turbo Delphi 2006.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Di 29.01.08 02:43 
user profile iconChristian S. hat folgendes geschrieben:
Grüße
Christian


Wow cool, das wär ja dann quasi was ich brauche. :zustimm:
Ist dieses "Turbo Delphi" irgendne spezielle erweiterte Version? Ich hab Delphi7 Enterprise, das sollte doch gehen, oder?

EDIT: Ich versuch das grad anzuwenden aber der meckert bei den Propertys..

"'=' Expected but identifier 'Property' found."
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 29.01.08 06:40 
Wie oben schon geschrieben wurde, werden Klassenoperatoren nur in .Net oder ab D10 auch unter Win32 (für Records) unterstützt.

_________________
Markus Kinzler.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 29.01.08 09:18 
Wie Du an Turbo-Delphi ran kommst, habe ich hier mal beschrieben: www.christian-stelzm...oaded/#_Toc180058857

Kann sein, dass Properties in Records auch erst ab Turbo Delphi oder so funktionieren :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 29.01.08 09:39 
in Turbo-Delphi auf jeden Fall!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Di 29.01.08 11:57 
user profile iconChristian S. hat folgendes geschrieben:
Wie Du an Turbo-Delphi ran kommst, habe ich hier mal beschrieben: www.christian-stelzm...oaded/#_Toc180058857

Kann sein, dass Properties in Records auch erst ab Turbo Delphi oder so funktionieren :gruebel:


K, ich lad dann grade des Turbo Delphi runter...
Aber eine Sache:

Zitat:
Im Unterschied zu den „großen“ Delphis enthält diese Version nur eine Sprache und kann nicht mit den Produkten von Drittanbietern erweitert werden.


Also kann ich keine Objekte zur Oberfläche hinzufügen oder wie ist das gemeint?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 29.01.08 12:12 
neue frage -> neues Thema!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 29.01.08 13:44 
user profile iconKroko hat folgendes geschrieben:
neue frage -> neues Thema!
So ist es! Und hiermit auch offiziell ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Di 29.01.08 14:09 
user profile iconChristian S. hat folgendes geschrieben:
user profile iconKroko hat folgendes geschrieben:
neue frage -> neues Thema!
So ist es! Und hiermit auch offiziell ;-)


:?!?:
Die eine kurze Frage hätte man zwar sicher auch noch mit nem Zweizeiler beantworten können aber was solls.. O_o

Des lässt sich nicht installieren weil NET 1.1 SP1 fehlt, welches sich ebenso nicht installen lässt weil NET 1.1 fehlt, da ich bereits NET 3.0 hab....

Danke trotzdem soweit.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 29.01.08 14:11 
Du musst trotzdem Net 1.1 installieren!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 29.01.08 14:18 
user profile iconGR-Thunderstorm hat folgendes geschrieben:
Des lässt sich nicht installieren weil NET 1.1 SP1 fehlt, welches sich ebenso nicht installen lässt weil NET 1.1 fehlt, da ich bereits NET 3.0 hab....
Auch die Installation von TD hat nichts in einem Thread zu Vektoren zu suchen. Erstelle dafür bitte einen Thread in der Sparte "Programmierwerkzeuge".

Bevor Du also immer weiter neue Fragen hier stellst, mache ich hier zu. Solltest Du noch Fragen zum eigentlichen Thema haben, melde Dich über den "kontaktiere bitte das Team"-Link unter diesem Posting.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.