Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Verschiedene Aufzählungstypen in einer Funktion verwenden. (https://www.delphipraxis.net/167372-verschiedene-aufzaehlungstypen-einer-funktion-verwenden.html)

bernau 26. Mär 2012 23:49

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:
type
  TAtype1 = (def1_x1, def1_x2, def1_x3, def1_x4, def1_x5, def1_x6);
  TAtype2 = (def2_y1, def2_y2, def2_y3);
Zu jedem dieser Elemente wird ein String gespeichert. Dazu wird folgendes definiert.


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:
  fData1: array of TAtype1Data;
  fData2: array of TAtype2Data;
Damit habe ich eine gute Möglichkeit auf die Daten zuzugreifen.


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:
result:=eineBerechnungFuerData1Und2(def1_x1,def1_x2,fData1);
//oder
result:=eineBerechnungFuerData1Und2(def2_y1,def2_y2,fData2);
Ich weis aber nicht, wie ich die Funktion deklarieren soll.


Hoffentlich hat das jemand verstanden ;-)

Bummi 27. Mär 2012 00:14

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

himitsu 27. Mär 2012 00:22

AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
 
Zitat:

Delphi-Quellcode:
TAtype1Data = array [lo(TAtype1) .. high(TAtype1)] of string;

Bei ordinalen Typen und mit vollständigem Wertebereich, da kann man es sich auch einfach machen.
Delphi-Quellcode:
TAtype1Data = array [TAtype1] of string;

Sir Rufo 27. Mär 2012 01:42

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;

bernau 27. Mär 2012 01:42

AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
 
Zitat:

Zitat von himitsu (Beitrag 1158772)
Bei ordinalen Typen und mit vollständigem Wertebereich, da kann man es sich auch einfach machen.
Delphi-Quellcode:
TAtype1Data = array [TAtype1] of string;

Aahhh. Wieder was gelernt. Danke.

bernau 27. Mär 2012 01:50

AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
 
Zitat:

Zitat von Bummi (Beitrag 1158771)
so?
Delphi-Quellcode:
Function eineBerechnungFuerData1Und2(a,b:TAtype1;var c:TAtype1DataArray):Integer;
begin
 // 
end;

eineBerechnungFuerData1Und2(def1_x1,def1_x2,fdata1);

Ne. Leider nicht. Dann könnte ich ja nur fData1 übergeben und nicht fData2. Und die ersten beiden Werte der Funktion dürften auch nur vom Type TAtype1 sein und nicht vom Type TAtype2.

bernau 27. Mär 2012 01:59

AW: Verschiedene Aufzählungstypen in einer Funktion verwenden.
 
Zitat:

Zitat von Sir Rufo (Beitrag 1158787)
Meinst du sowas?
Delphi-Quellcode:

procedure EineBerechnungFuerfData(aType1,aType2:TAtype1); overload;
procedure EineBerechnungFuerfData(aType1,aType2:TAtype2); overload;

Ne auch das meinte ich nicht. Mir geht es darum die Procedure nur einmal zu haben. Bei deiner Version ist die Procedure zwei mal vorhanden. Und dies mit fast identischem Code. So habe ich es ja jetzt, nur das diese Procedure etwas komplexer (>50Zeilen) ist. Die zweite Procedure wurde quasi kopiert und mit einem Copy/Paste wurde Type1 gegen Type2 ausgetauscht. Nun habe ich das ziemlich vereinfacht im ersten Post beschrieben. Tatsächlich gibt es aber nicht nur Type1 und Type2 sonder auch Type3 Type4 und Type5. Damit hätte ich den gleichen Code fünf mal. Und das ist bestimmt kein guter Programmierstil ;-)

jaenicke 27. Mär 2012 07:13

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.

Furtbichler 27. Mär 2012 08:12

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:
Const
   def1_x1 = 0;
   def1_x2 = 1;
   ....
   def1_max = 2;

   def2_y1 = 0;
   def2_x5 = 1;
  ...
   def2_max = 1;
Der Rest wird ein wenig angepasst. Einziger kleiner Nachteil: Die Anzahl der Elemente ergibt sich dann nicht implizit (durch
Delphi-Quellcode:
High(EnumTyp)
sondern muss manuell gepflegt werden (def_max).

jaenicke 27. Mär 2012 08:34

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. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Seite 1 von 2  1 2   

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