AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Gleiche Prozedur mit verschiedenen Parametertypen aufrufen
Thema durchsuchen
Ansicht
Themen-Optionen

Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

Ein Thema von FriendOfDelphi · begonnen am 24. Aug 2011 · letzter Beitrag vom 24. Aug 2011
Antwort Antwort
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#1

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 15:20
Der älteste Weg das zu erreichen, ist einen untypisierten Pointer zu übergeben.
Alternativ ein Record, das alle versch. Typen kennt und ein Feld hat, was angibt, welcher Typ benutzt werden soll.
Alternativ ein Variant.
Alternativ eine Array of Variant.
Alternativ eine Basisklasse und Ableitungen davon.

Die Idee mit dem untypisierten Zeiger gefällt mir am besten.
Nur habe ich ein Problem mit der Typisierung des übergebenen Zeiger.

Ich übergebe einen Zeiger auf eine Variable vom Typ record.
Der Record sieht so aus:
Delphi-Quellcode:
type
  TMeinTyp = record
             Var1: Array [0..10] of SmallInt;
             Var2: Integer;
end;

//...

var
  MeineVar : TMeinTyp;

//...

//Aufruf der Prozedur mit:
MeineProzedur(MeineVar);

//Prozedur
procedure TForm1.MeineProzedur(aArray: Pointer);
begin
  TMeinTyp(aArray^).Var1[index]:=1; //so funktioniert es

  //der Typ "TMeinTyp" ist aber in einer anderen Unit deklariert, die ich nicht verwenden will
  //ich möchte daher direkt auf den "SmallInt"-Teil des Records zugreifen
  //geht das?
  Array [0..6] of SmallInt(aArray^).Var1[index]:=1; //so funktioniert es nicht. Der Compiler meldet: "Anweisung erwartet, aber 'ARRAY' gefunden"
  //mache ich etwas falsch (Syntax), oder funktioniert das nicht?
end;
Herzlichen Gruß
FriendOfDelphi

Geändert von FriendOfDelphi (24. Aug 2011 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#2

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 15:30
Das ist doch wohl Blödsinn. Du willst einen allgemeinen Typen übergeben und castest dann doch wieder auf SmallInt?!

Deshalb meine Frage: Was hast du konkret mit den übergebenen Werten vor? An andere Funktionen übergeben, damit rechnen, ...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#3

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 15:56
Das ist doch wohl Blödsinn. Du willst einen allgemeinen Typen übergeben und castest dann doch wieder auf SmallInt?!

Deshalb meine Frage: Was hast du konkret mit den übergebenen Werten vor? An andere Funktionen übergeben, damit rechnen, ...
Na ja ganz so einfach ist es nicht.
Es existieren insgesamt 5 verschiedene Records.

Der Prozedur werden zwei weitere Parameter übergeben:
2.Parameter: eine(Objekt-)Liste und
3.Parameter: Name des übergebenen Tys ("TMeinTyp1", "TMeinTyp2", "TMeinTyp3" usw.)

In dieser Liste werden Werte verwaltet.
In den einzelnen Einträgen der Liste ist gespeichert, aus welchem Rekord(typ) dessen Wert ausgelesen werden soll.

Innerhalb der Prozedur werden nun alle Einträge durchlaufen.
Im jeweiligen Listeneintrag wird verglichen, ob der übergebene Rekord(typ) für den aktuellen Eintrag gültig ist.
Wenn ja, sollen die einzelnen Teile aus dem übergebenen Rekord in dem zugehörigen Listeneintrag gespeichert werden.
Wenn nein, wird die Schleife fortgesetzt.

Wenn für jeden Record eine eigene Prozedur existiert funktioniert das.
Ich möchte aber eine Prozedur für alle Recordtypen haben.

Was ist jetzt daran Blödsinn?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 16:25
Also ich kann mir zwar noch nicht 100%ig vorstellen was du da machst, aber es hört sich so an als ob du mit Klassen und Vererbung weiterkommen solltest.

Dann kannst du konkrete Klasse einfach als Typ der Basisklasse übergeben. Und du kannst in den abgeleiteten Klassen bestimmte abweichende Funktionalitäten implementieren (überschriebene Methoden, ...), die dann über die Basisklasse aufgerufen werden kann.

Aber wie Uwe Raabe schon sagte:
Ich glaube auch das Problem ist eher das Gesamtkonzept...

Was ist jetzt daran Blödsinn?
Damit meinte ich verschiedene Typen zu übergeben und dann den Typ doch wieder zu unterscheiden. Wenn, dann macht eine gemeinsame Prozedur nur Sinn, wenn der größte Teil der Prozedur auch unabhängig vom konkreten Typ funktioniert.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#5

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 20:05
Also ich kann mir zwar noch nicht 100%ig vorstellen was du da machst, aber es hört sich so an als ob du mit Klassen und Vererbung weiterkommen solltest.

Dann kannst du konkrete Klasse einfach als Typ der Basisklasse übergeben. Und du kannst in den abgeleiteten Klassen bestimmte abweichende Funktionalitäten implementieren (überschriebene Methoden, ...), die dann über die Basisklasse aufgerufen werden kann.

Aber wie Uwe Raabe schon sagte:
Ich glaube auch das Problem ist eher das Gesamtkonzept...

Was ist jetzt daran Blödsinn?
Damit meinte ich verschiedene Typen zu übergeben und dann den Typ doch wieder zu unterscheiden. Wenn, dann macht eine gemeinsame Prozedur nur Sinn, wenn der größte Teil der Prozedur auch unabhängig vom konkreten Typ funktioniert.
Das Problem ist, dass ich mein Programm mit dem eines Kollegen zusammenführen muss. Und der arbeitet halt mit diesen Records, die ich nun benutzen muss.
Um nochmal auf das ursprüngliche Problem zurück zu kommen:
Kann ich denn über ein typcasten auf die einzelnen Teile des Records zugreifen?
Wenn ja, wie ist die richtige Syntax.
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 20:37
Hallo,

Delphi-Quellcode:
procedure MeineProzedur(Meinparameter: array of Double); overload;
begin
  //tue was
end;

preocedure MeineProzedur(Meinparameter: array of Integer); overload;
begin
  //tue das gleiche
end;
Tue das gleiche kann nicht sein,
es sind 2 verschiedene Arrays.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#7

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 22:38
Kann ich denn über ein typcasten auf die einzelnen Teile des Records zugreifen?
Wenn ja, wie ist die richtige Syntax.
Ich habe ein wenig gezögert, weil ich nicht sicher bin, ob es sinnvoll ist einen derart grausamen Hack für diesen Fall zu posten... aber ist ja nicht mein Code, in den der Schrott eingebaut wird...
Delphi-Quellcode:
type
  TTestA = record
    a, b: LongInt;
  end;

  TTestB = record
    a: string;
    b: LongInt;
  end;

procedure Test(Value: Pointer);
begin
  ShowMessage(IntToStr(PLongInt(Integer(Value) + 4)^));
end;

var
  a: TTestA;
  b: TTestB;
begin
  a.b := 777;
  b.b := 666;
  Test(@a);
  Test(@b);
end;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Gleiche Prozedur mit verschiedenen Parametertypen aufrufen

  Alt 24. Aug 2011, 15:31
Du solltest das Design deiner Anwendung überdenken!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:35 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