AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Index für 2-dimensionale Arrayproperty

Ein Thema von Pangea · begonnen am 28. Jan 2012 · letzter Beitrag vom 30. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2      
Pangea

Registriert seit: 28. Jul 2010
5 Beiträge
 
FreePascal / Lazarus
 
#1

Index für 2-dimensionale Arrayproperty

  Alt 28. Jan 2012, 22:17
Delphi-Version: 7
Hallo,

Ich hab da mal ein kleines Problem. Ich weiß wie ich "Arrayproperties" mit meheren Indizies erstelle. Dabei gibt es ja auch die Möglichkeit bei einer ebensolchen Property die dahinterstehende Funktion direkt mit einem bestimmten Index aufzurufen. Das ganze sieht dann in etwa so aus:

Delphi-Quellcode:
type
  TTestClass = class
    function GetSomething(index: integer):integer;
    property a: integer index 5 read GetSomething;
  end;
Gibt es auch eine Möglichkeit das für zwei (oder sogar drei Indizes) zu machen?
Also in etwa so:

Delphi-Quellcode:
type
  TTestClass = class
    function GetSomething(index1, index2: integer): integer;
    property a: integer index 5,1 read GetSomething;
  end;
Aber der Compiler weigert sich (vermutlich zu Recht ) das ganze so zu kompilieren.

Jetzt frage ich mich, gibt Delphi so etwas überhaupt her? Wenn ja, wie müsste die Syntax dann lauten?
Irren ist menschlich!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

AW: Index für 2-dimensionale Arrayproperty

  Alt 28. Jan 2012, 23:37
Dort kann man nunmal nur einen Wert angeben.

Du kannst das höchstens mathematisch lösen.

Delphi-Quellcode:
... index 0101 ...

Index1 := Index mod 100;
Index2 := Index div 100;
Abgesehn davon, daß dieses kein Array-Property ist, sondern das property name[...]: typ ... .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Pangea

Registriert seit: 28. Jul 2010
5 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Index für 2-dimensionale Arrayproperty

  Alt 28. Jan 2012, 23:51
Danke für die Antwort.

Das ich dort nur einen Wert angeben kann ist wirklich schade Vor allem da die mathematische Lösung bei größeren Zahlen nicht mehr funktioniert.

Bezüglich der "Arrayproperty", ich wusste nicht so recht wie ich das nennen sollte... und da es (zumindest für mich) ganz grob in etwa die gleiche Richtung ging, hab ich es mal so bezeichnet

Ich programmiere Delphi jetzt noch nicht sooo lange. Von daher bin ich in Sachen Begrifflichkeiten noch nicht allzu trittsicher...

Auf jeden Fall ist die Sache für mich damit jetzt geklärt
Irren ist menschlich!

Geändert von Pangea (28. Jan 2012 um 23:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 01:41
Mehr als 4 Milliarden Property wirst du bestimmt nicht anlegen.
Dann bliebe noch durchzählen und dann z.B. über ein CASE deine Werte zuweisen.

Delphi-Quellcode:
property ... index 1 read MyGetter ...;
property ... index 2 read MyGetter ...;

procedure TMyClass.MyGetter(Index: Integer);
begin
  case Index of
    1: ...;
    2: ...;
  end;
  ...
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 03:13
Das ich dort nur einen Wert angeben kann ist wirklich schade Vor allem da die mathematische Lösung bei größeren Zahlen nicht mehr funktioniert.
Wozu brauchst du das denn?
Ist dir klar, wozu man das Schlüsselwort "index" überhaupt benützt?
In dem Beispiel werden 5 Properties auf die gleiche Get-Funktion umgebogen.
Delphi-Quellcode:
TTestClass = class
private
  function GetSomething(index: integer): integer;
public
  property SpeedX: integer index 1 read GetSomething;
  property SpeedY: integer index 2 read GetSomething;
  property PositionX: integer index 3 read GetSomething;
  property PositionY: integer index 4 read GetSomething;
  property Acceleration: integer index 5 read GetSomething;
end;
Mal angenommen das vermisste Sprachfeature würde es geben, dann sähe der Code so aus:
Delphi-Quellcode:
TTestClass = class
private
  function GetSomething(index1, index2: integer): integer;
public
  property SpeedX: integer index 1,0 read GetSomething;
  property SpeedY: integer index 1,1 read GetSomething;
  property PositionX: integer index 2,0 read GetSomething;
  property PositionY: integer index 2,1 read GetSomething;
  property AccelerationX: integer index 3,0 read GetSomething;
end;
Wäre es erlaubt so zu programmieren, täte man sich damit aber keinen Gefallen weil diese Deklaration total unübersichtlich wird.
  Mit Zitat antworten Zitat
Pangea

Registriert seit: 28. Jul 2010
5 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 15:05
Mehr als 4 Milliarden Property wirst du bestimmt nicht anlegen.
Ja, das wäre mir dann doch ein bsichen viel Arbeit

Ich bin halt letztens über diesen Index gestolpert und hab mich gefragt, ob das ganze nicht auch mit mehreren Indizes funktionieren würde. Zugegeben man braucht es eher selten, aber es hat mich halt mal interessiert.

Mal angenommen das vermisste Sprachfeature würde es geben, dann sähe der Code so aus:
Delphi-Quellcode:
TTestClass = class
private
  function GetSomething(index1, index2: integer): integer;
public
  property SpeedX: integer index 1,0 read GetSomething;
  property SpeedY: integer index 1,1 read GetSomething;
  property PositionX: integer index 2,0 read GetSomething;
  property PositionY: integer index 2,1 read GetSomething;
  property AccelerationX: integer index 3,0 read GetSomething;
end;
Wäre es erlaubt so zu programmieren, täte man sich damit aber keinen Gefallen weil diese Deklaration total unübersichtlich wird.
So unübersichtlich sieht das Ganze doch gar nicht aus...

Aber ich glaub ich verstehe, dass es nicht sinnvoll ist, alle Properties auf eine Get-Funktion umzubiegen. Das würde in der Tat leicht unübersichtlich werden.
Irren ist menschlich!

Geändert von Pangea (29. Jan 2012 um 16:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#7

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 15:36
Wäre es erlaubt so zu programmieren, täte man sich damit aber keinen Gefallen weil diese Deklaration total unübersichtlich wird.
Dem kann ich nicht zustimmen! Ich hatte schon öfter den Fall, wo ich eine Reihe Boolscher Properties auf die Bits eines ByteArrays mappen wollte. Da käme ein solches Konstrukt gerade recht. Als Lösung habe ich dann für jedes Byte einen eigenen Getter und Setter deklariert, in dem ich dann mit Index 0..7 die Bits abfragen konnte. Alternativ habe ich auch schon einfach eine BitIndex 0..n verwendet, was aber auch nicht ideal war, da die Bits in der Vorgabe mit 4.1, 6.5 usw. angegeben waren. War alles nicht gerade übersichtlicher.

Ein Sprachkonstrukt zu verbieten, nur weil man damit unübersichtlich programmieren kann, ist einfach kurzsichtig. Man kann schließlich mit jeder Programmmiersprache unübersichtlich programmieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 21:22
Deine Bits und Bytes kannst Du doch wunderbar mit einem Index umsetzen:
Delphi-Quellcode:
Property Bit0OfFirstByte : boolean index 00 ...
Property Bit7OfFirstByte : boolean index 07 ...
Property Bit0OfSecondByte : boolean index 10 ...
Property Bit7OfSecondByte : boolean index 17 ...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#9

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 22:22
Deine Bits und Bytes kannst Du doch wunderbar mit einem Index umsetzen:
Delphi-Quellcode:
Property Bit0OfFirstByte : boolean index 00 ...
Property Bit7OfFirstByte : boolean index 07 ...
Property Bit0OfSecondByte : boolean index 10 ...
Property Bit7OfSecondByte : boolean index 17 ...
Klar geht das so - es gibt für fast alles einen Workaround. Elegant geht anders.

IMHO gibt es keinen Grund an der Stelle nicht mehrere Indexeinträge zu erlauben. Wenn das jemand zu unübersichtlich ist, muss er es ja nicht verwenden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Index für 2-dimensionale Arrayproperty

  Alt 29. Jan 2012, 23:12
Ok, wenn man 2 Dimensionen zulassen würde, warum dann nicht auch 3 oder mehr Dimensionen?
Man sollte aber bedenken, dass man schon bei einer Dimension von z.B. 5 * 8 ganze 40 Properties hinschreiben muss.
Hier sollte gleich ein kleines Alarmglöckchen leuten: "Eine Klasse mit 40 Properties? Und alle vom gleichen Typ? Da stimmt doch was nicht, da muss es doch auch einen anderen Weg geben"

Das Schlüsselwort "Index" ist doch eher ein selten genutzes Feature mit relativ wenig Nutzen.

Borland hätte stattdessen folgende Property-Deklaration einführen sollen:
Delphi-Quellcode:
TDirection = (dX, dY);

TTestClass = class
private
  procedure SetSomething(value: integer; typ:Char; dir:TDirection): integer;
  function GetSomething(typ:Char; dir:TDirection): integer;
public
  property SpeedX: integer read GetSomething('S', dX);
  property SpeedY: integer read GetSomething('S', dY);
  property PositionX: integer read GetSomething('P', dX) write SetSomething('P', dX);
  property PositionY: integer read GetSomething('P', dY) write SetSomething('P', dY);
  property AccelerationX: integer read GetSomething('A', dX);
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz