AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wie einer Function einen 'Datentyp' übergeben??
Thema durchsuchen
Ansicht
Themen-Optionen

Wie einer Function einen 'Datentyp' übergeben??

Ein Thema von Net7 · begonnen am 21. Okt 2005 · letzter Beitrag vom 23. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#1

Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 20:44
Hi Leute

Ich zerbreche mir gerade den Kopf darüber wie ich einer Function einen zufälligen Typ zuweisen kann.

Mal zur Übersicht.

Delphi-Quellcode:

function Datentypgrösse(unbekannter_Datentyp):Integer; // kann ein Record integer usw. sein
var
rl:integer;
begin
         rl:=0;
         rl:=sizeof(unbekannter_Datentyp); //könnten ja alle möglichen Typen sein
         result:=rl ;

end;

Das Problem ist, ich weiß nicht was für ein Datentyp auftauchen wird, also kann ich ihn auch nicht vorher bei der Procedurendefinition bestimmen.

Für Denkansätze wäre ich sehr dankbar.
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 21:11
Hallo,
solange du in Records denkst wird das nix.
Du solltest in Objekten und Interfaces denken.
Ich würde Dein Problem wie folgt lösen:

Ich würde als Parameter ein Interface verwenden.
Delphi-Quellcode:
function Datentypgrösse(unbekannter_Datentyp : IMyInterface ):Integer; // kann ein Record integer usw. sein
var
rl:integer;
begin
         rl:=0;
         rl:=unbekannter_Datentyp.Size; //könnten ja alle möglichen Typen sein
         result:=rl ;

end;
IMyInterface würde dann wie folgt aussehen
Delphi-Quellcode:
  IMyInterface = Interface
  ['{06C033D1-76E2-452E-8F94-C4ED1DCA429F}']
  function Size : Integer;
  end;
Jetzt kannst Du jedes Objekt dass das IMyInterface implementiert als Parameter übergeben.

Schau Dir folgenden Code mal etwas genauer an:
Delphi-Quellcode:
  TMyObject = class(TInterfacedObject, IMyInterface)
  public
    function Size : Integer;
  end;

  TMyListObject = class(TListBox,IMyInterface)
  public
    function Size : Integer;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    function DataSize(aInterface : IMyInterface) : Integer;
  public
    { Public-Deklarationen }

  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }



{ TMyObject }

function TMyObject.Size: Integer;
begin
  Result:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  aObject : TMyObject;
  aListObject : TMyListObject;
begin
  aObject:=TMyObject.Create;
  DataSize(aObject); // Hier wird ein Objekt des Types TMyObject übergeben
  aObject.Free;

  aListObject:=TMyListObject.Create(Nil);
  DataSize(aListObject); // Hier wird ein Objekt des Types TMyListObject übergeben (eigentlich eine TListBox
  aListObject.Free;
end;

function TForm1.DataSize(aInterface: IMyInterface): Integer;
begin
  Result:=aInterface.Size;
end;

{ TMyListObject }

function TMyListObject.Size: Integer;
begin
  Result:=0;
end;

Ab D2005 würde ich die Möglichkeiten der ClassHelpers ausloten. (Habe bislang aber nur etwas darüber gelesen)
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 21:14
Hi.

Das Beispiel ist etwas irritierend, da es ja genau zu diesem Zweck in Delphi die System-Funktion SizeOf() gibt. Ansonsten braucht es dazu Informationen, die dem Compiler zur Übersetzungszeit vorliegen.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 21:19
Zitat von marabu:
Hi.

Das Beispiel ist etwas irritierend, da es ja genau zu diesem Zweck in Delphi die System-Funktion SizeOf() gibt. Ansonsten braucht es dazu Informationen, die dem Compiler zur Übersetzungszeit vorliegen.

Grüße vom marabu
Na ja - es gibt SizeOf. SizeOf(aObject) liefert aber immer 4. Egal wieviel MByte das Objekt wirklich verbraucht. Bei Strings ergibt SizeOf auch immer 4.

Man könnte auch für jeden nur erdenklichen Typen eine überladene Methode bereistellen

P.S. In meinem Beispiel ist Result:=0 in den Size Methoden nur als Platzhalter zu sehen.
Size muss natürlich typspezifisch implementiert werden.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 21:52
Hallo Jens,

Zitat von Net7:
... ich weiß nicht was für ein Datentyp auftauchen wird ...
mit Datentyp assoziiere ich sofort SizeOf(). Bei Objekten interessieren mich zwei andere Funktionen. Die eine soll mir den in-memory footprint liefern und die andere soll berechnen, wieviel Platz in einem Stream benötigt wird, wenn die Methode SaveToStream() aufgerufen wird.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#6

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 21. Okt 2005, 22:15
Wow, das mit Interface ist für mich Neuland.

Aber scheint eine effektive Methode zu sein.

Delphi-Quellcode:
IMyInterface = Interface
['{06C033D1-76E2-452E-8F94-C4ED1DCA429F}']
Was bedeutet das??


Zitat:
Hallo,
solange du in Records denkst wird das nix.
Entschuldigung, ich weiß, aber es ist schwer aus dem Kopf zu bekommen.

Ich habe auch schon darüber nachgedacht das mit Pointer zu lösen.

Oder ist das ne dumme Idee.

Marabu, das mit den sizeof war nur ein Beispiel.

Ich programmiere gerade eine Empfangsroutine für meine eigenen ServerSockets- und Clientsockets- Kompo.
Ich möchte es dem User es so einfach wie möglich machen.

Grundidee dazu ist, das Server und Client gleiche Typen hin und her schicken können, die voher vom Benutzer definiert wurden.
Aufgabe der Sende und Empfangsroutine soll sein diese Typen zu füllen bzw zu senden.
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#7

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 22. Okt 2005, 01:12
Eine elegante Lösung des Problems.

Allerdings eben mit Pointern.




Delphi-Quellcode:

Function Konvertiere_Datenpaket(var Daten:Pointer;var ExportDaten;Datensize:int64):boolean;
begin
  if (Daten=nil)or(Sizeof(Daten^)<0) then exit;
  Move(Daten^,ExportDaten, Datensize); //konvertiert untypirisierte Typen in Typerisierte Typen
end;
Exportdaten ist Typenlos und ich kann es einen definierten Typen zuweisen.

Und funktioniert bestens.
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 22. Okt 2005, 01:43
Hab nur ich Probleme mit dem letzten Code?

SizeOf kann nicht kleiner als 0 sein ... sogar Delphi hat was dagegen
Zitat von Delphi-Compiler:
[Warnung] xxx: Der Vergleich ergibt immer Falsch
Und ein dereferenzierter Pointer ist kein Datentyp und hat die Größe 0?

Also
Sizeof(Daten^) < 0
0 < 0
False

[add]
Ach ja, Datensize = Int64
MOVE möchte da gern 'nen Integer ... wir sind noch nicht im 64-Bit Zeitalter

Und da Move intern selber nochmal prüft, ob die übergebenen Pointer NIL sind, ist demnach die If-Abfrage
if Daten = nil then exit; ebenfall unnötig.
Demnach ist ein
Move(Daten, ExportDaten, SizeOf(ExportDaten)); , ohne eine Funktion drumrum, völlig ausreichend. (jedenfalls bei dem obrigen Beispiel)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#9

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 22. Okt 2005, 01:56
Naja ich prüfe nicht was im Socket steht, das drück ich der Function auf. Wenn der Wert zb -1.. hat, dann wird die Funktion halt abgebrochen.

Für eine normale Anwendung wäre das natürlich besser.
Delphi-Quellcode:
Function Konvertiere_Datenpaket(var Daten:Pointer;var ExportDaten;Datensize:int64):boolean;
begin
  
  Move(Daten,ExportDaten, Datensize);

end;
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#10

Re: Wie einer Function einen 'Datentyp' übergeben??

  Alt 23. Okt 2005, 15:25
Hallo Jens

Delphi-Quellcode:
IMyInterface = Interface
  ['{06C033D1-76E2-452E-8F94-C4ED1DCA429F}']
  function Size : Integer;
  end;

['{06C033D1-76E2-452E-8F94-C4ED1DCA429F}']

Du sag mal diese Nummer läßt du sie generieren?? Oder denkst du dir die aus??
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  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 00:54 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