![]() |
Verschiedene Aufzählungstypen in einer Funktion verwenden.
Ich habe grade ein Problem einen Lösungsansatz zu finden. Vieleicht könnt Ihr mir weiter helfen.
Ich habe verschiedene Aufzählungstypen. Diese können eine verschiedene Anzahl von Definitionen beinhalten.
Delphi-Quellcode:
Zu jedem dieser Elemente wird ein String gespeichert. Dazu wird folgendes definiert.
type
TAtype1 = (def1_x1, def1_x2, def1_x3, def1_x4, def1_x5, def1_x6); TAtype2 = (def2_y1, def2_y2, def2_y3);
Delphi-Quellcode:
type
TAtype1Data = array [lo(TAtype1) .. high(TAtype1)] of string; TAtype2Data = array [lo(TAtype2) .. high(TAtype2)] of string; im Programm werden damit dann Variablen definiert.
Delphi-Quellcode:
Damit habe ich eine gute Möglichkeit auf die Daten zuzugreifen.
fData1: array of TAtype1Data;
fData2: array of TAtype2Data; Nun habe ich eine Funktion, die ich auf alle Type anwenden könnte. Zur Zeit so definiert:
Delphi-Quellcode:
procedure EineBerechnungFuerfData1(aType1,aType2:TAtype1);
var a:integer; begin // Jetzt ein einfacher code, der aber viel komplexer ist for a:=0 to length(fData1) do begin fData1[a,aType1]:=fData1[a,aType2]; end; end; procedure EineBerechnungFuerfData2(aType1,aType2:TAtype2); begin // Im Prinzip der gleiche Programmcode, nur das ganze passiert für fData2 for a:=0 to length(fData2) do begin fData2[a,aType1]:=fData1[a,aType2]; end; end; Ich hätte gerne eine Funktion die ich so aufrufe:
Delphi-Quellcode:
Ich weis aber nicht, wie ich die Funktion deklarieren soll.
result:=eineBerechnungFuerData1Und2(def1_x1,def1_x2,fData1);
//oder result:=eineBerechnungFuerData1Und2(def2_y1,def2_y2,fData2); Hoffentlich hat das jemand verstanden ;-) |
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
so?
Delphi-Quellcode:
TAtype1 = (def1_x1, def1_x2, def1_x3, def1_x4, def1_x5, def1_x6); TAtype2 = (def2_y1, def2_y2, def2_y3); TAtype1Data = array [low(TAtype1) .. high(TAtype1)] of string; TAtype2Data = array [low(TAtype2) .. high(TAtype2)] of string; TAtype1DataArray = array of TAtype1Data; TAtype2DataArray = array of TAtype2Data; var fData1: TAtype1DataArray; fData2: TAtype2DataArray; Function eineBerechnungFuerData1Und2(a,b:TAtype1;var c:TAtype1DataArray):Integer; begin // end; eineBerechnungFuerData1Und2(def1_x1,def1_x2,fdata1); |
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Zitat:
Delphi-Quellcode:
TAtype1Data = array [TAtype1] of string;
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Meinst du sowas?
Delphi-Quellcode:
interface
procedure EineBerechnungFuerfData(aType1,aType2:TAtype1); overload; procedure EineBerechnungFuerfData(aType1,aType2:TAtype2); overload; implementation procedure EineBerechnungFuerfData(aType1,aType2:TAtype1); var a:integer; begin // Jetzt ein einfacher code, der aber viel komplexer ist for a:=0 to length(fData1) do begin fData1[a,aType1]:=fData1[a,aType2]; end; end; procedure EineBerechnungFuerfData(aType1,aType2:TAtype2); begin // Im Prinzip der gleiche Programmcode, nur das ganze passiert für fData2 for a:=0 to length(fData2) do begin fData2[a,aType1]:=fData1[a,aType2]; end; end; |
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Zitat:
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Zitat:
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Zitat:
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Mit Generics würde mir da eine sehr simple Möglichkeit einfallen, aber da du noch bei Delphi 2007 bist, geht das natürlich nicht.
Deshalb würde ich dir raten einfach wirklich 5 solcher Überladungen nach außen zu deklarieren und intern die Werte auf Integer gecastet mit einem entsprechenden Typparameter an eine einzelne Funktion weiterzureichen. Da nach außen nur die richtigen Typen reinkommen, ist das intern ja kein Problem. Am einfachsten erstellst du dir dann einen Aufzählungstyp mit den 5 Typen und nimmst ein zweidimensionales Array, bei dem die erste Dimension dieser Typ ist. |
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Aus diesem Grund nehme ich von Enumerationstypen Abstand und kodiere die einzelnen Elemente lieber als CONST.
Delphi-Quellcode:
Der Rest wird ein wenig angepasst. Einziger kleiner Nachteil: Die Anzahl der Elemente ergibt sich dann nicht implizit (durch
Const
def1_x1 = 0; def1_x2 = 1; .... def1_max = 2; def2_y1 = 0; def2_x5 = 1; ... def2_max = 1;
Delphi-Quellcode:
sondern muss manuell gepflegt werden (def_max).
High(EnumTyp)
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Das hat aber den Nachteil, dass die Typen nicht mehr automatisch geprüft werden. Deshalb nutze ich lieber Enumerationen und mit Generics lässt sich das ja auch sehr gut umsetzen. ;-)
|
AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
Ja. Generics wäre hier das Zauberwort. XE2 ist auch schon installiert. Aber leider habe ich eine Komponente, die ich noch nicht unter XE2 laufen lassen will. Daher Delphi 2007 und keine Generics.
Die überladenen Proceduren bringen mir nichts. Es geht mir nicht so sehr darum, "einen" Procedurenamen zu haben, sondern den gleichen Quellcode fünf mal mit geringen unterschieden zu haben. Korrekturen müsste ich dann fünf mal durchführen. Constanten sind auch nicht die Lösung, weil ich die Typenprüfung brauche (will). Ich habe mal ne Nacht rüber geschlafen und komme wieder zur guten alten Objektorientierung. Ein Basisobjekt mit virtuellen Getter- und Setter-Methoden und einem Stringarray, welches die Daten beinhaltet. Dort wird die Berechnung durchgeführt. Davon dann Ableitungen, welche die einzelnen Typen kapseln. Noch mal danke für die Antworten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz