Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Den Typ einer Variable herausfiinden (https://www.delphipraxis.net/45362-den-typ-einer-variable-herausfiinden.html)

Kostas 4. Mai 2005 22:17


Den Typ einer Variable herausfiinden
 
Hallo Zusammen,

ist es möglich den Typ einer Variable herauszufinden?

Es hadelt sich nur um "Integer, String, TDateTime, Double und Boolean"


Delphi-Quellcode:
Procedure Beispiel;
var i:Integer;
begin
  i:=1;
  // wie kann ich jetzt abfragen vom welchen Typ die Varialbe i ist?
end;

Das Beispiel ist sicherlich Unsinn, es soll jedoch nur visualisieren.

Gruß Kostas

Aenogym 4. Mai 2005 22:19

Re: Den Typ einer Variable herausfiinden
 
hi,

das abfragen ist unmöglich, da sinnlos. du musst die variable schließlich selbst deklarieren, somit weißt du ja auch, von welchem typ sie ist.

aenogym

Kostas 4. Mai 2005 22:45

Re: Den Typ einer Variable herausfiinden
 
Danke für die schnelle Antwort,

aber ich habe tatsächlich eine Anforderung dafür.
Ich habe einen neuen Record-Typ definiert mit mehrere Elemente.

Delphi-Quellcode:
type TKDFahrzeug = Record
                     kfAdressNr:integer;
                     kfArtikelNr:String;
                     kfAbholID:integer;
                     kfAbholPosID:integer;
                     kfAuftragID:integer;
                     kfAuftragPosID:integer;
                     kfTyp:String;
                     kfBezeichnung:String;
                     kfEingangsdatum:TDateTime;
                     kfGebremst:String;
                     kfHoeche:Double;
                     kfBreite:Double;
                     kfLaenge:Double;
                     kfEigengewicht:Double;
                     kfGesamtgewicht:Double;
                     kfBereifung:String;
                     kfKennzeichen:String;
                     kfFahrgestellNr:String;
                     kfHersteller:String;
                     kfTuevBis:TDateTime;
                     kfErstzulassung:TDateTime;
                     kfFarbe:String;
                   end;
Dann habe ich eine Procedure dieser übergeben ich den Record.
Die Procedure füllt die Query-Parameter und führ sie aus.
Das Problem ist, ich muß jedes einzelne Feld inhaltlich prüfen
um es dem Parameter zuzuordnen.


Delphi-Quellcode:
{---------------------------------------------------------------}
{}function TdmH.InsertKDFahrzeug(KDFahrzeug:TKDFahrzeug):integer;
{---------------------------------------------------------------}
var
  i:integer;
begin
  result := 0;
  with dsInsertKDFahrzeug, KDFahrzeug do
  begin
    if not prepared then prepare;
    i := Gen_ID('GEN_KDFAHRZEUGE_ID',1);
    ParamByName('KDFAHRZEUGEID').AsInteger := i;
    if (kfAdressNr>0)
    then ParamByName('ADRESSNR').AsInteger := kfAdressNr
    else ParamByName('ADRESSNR').clear;

    if (kfArtikelNr='')
    then ParamByName('ARTIKELNR').AsString := kfArtikelNr
    else ParamByName('ARTIKELNR').clear;

    if (kfHoeche>0.0)
    then ParamByName('HOEHE').AsFloat := kfHoeche
    else ParamByName('HOEHE').Clear;

    if (kfEingangsdatum>0.0)
    then ParamByName('EINGANGSDATUM').AsDate := kfEingangsdatum
    else ParamByName('EINGANGSDATUM').clear;
    ....
Diesen Vorgang muß ich mehrere Hundert mal im Programm machen.
Ich stelle mit vor ich hätte eine Procedure derer übergebe ich
den Feldnamen und die Wert-Varialbe z.B. so:


Delphi-Quellcode:
{---------------------------------------------------------------}
{}function TdmH.InsertKDFahrzeug(KDFahrzeug:TKDFahrzeug):integer;
{---------------------------------------------------------------}


     procedure SetParamValues(FieldName:String; ValueVariable:????);
     begin
       with dsInsertKDFahrzeug do
       begin
         case GetVarType(ValueVariable) of
           Integer:
             begin
               if (Integer(ValueVariable)>0)
               then ParamByName(FieldName).AsInteger := Integer(ValueVariable)
               else ParamByName(FieldName).clear;
             end;
           String:
             begin
               if (String(ValueVariable)<>'')
               then ParamByName(FieldName).AsString := String(ValueVariable)
               else ParamByName(FieldName).clear;
             end;
           ...
          end;
       end;
     end;    

var
  i:integer;
begin
  result := 0;
  with dsInsertKDFahrzeug, KDFahrzeug do
  begin
    if not prepared then prepare;
    i := Gen_ID('GEN_KDFAHRZEUGE_ID',1);

    SetParamValues('KDFAHRZEUGEID', i);
    SetParamValues('ADRESSNR', kfAdressNr);
    SetParamValues('ARTIKELNR', kfArtikelNr);
    SetParamValues('HOEHE', kfHoeche);
    SetParamValues('EINGANGSDATUM', kfEingangsdatum);

    ....
Dabei habe ich zweites Problem wie übergebe ich die Varialbe selbst?
Wenn es keine andere Möglichkeit gibt werde ich es wohl über einen
weiteren Parameter machen z.b.
procedure SetParamValues(FieldName:String; ValueVariable:variant; ValueTyp:Byte);

Gruß Kostas

Christian Seehase 4. Mai 2005 23:23

Re: Den Typ einer Variable herausfiinden
 
Moin Kostas,

wenn Du mit Variants arbeitest: Schau Dir mal die Funktion Delphi-Referenz durchsuchenVarType an.

jim_raynor 5. Mai 2005 08:59

Re: Den Typ einer Variable herausfiinden
 
Vielleicht ist es besser in deinem Fall Objekte zu nutzen und dann mit der RTTI zu arbeiten. Mit Records (selbst bei Variants) kommst du da nicht weit, da du nicht per String auf ein Feld in einem Record zugreifen kannst.

Kostas 5. Mai 2005 09:47

Re: Den Typ einer Variable herausfiinden
 
Hi,

VarTyp hatte ich mir bereits angeschaut.
So weit ich weis, wird der Wert der Variant-Variable
bewertet. Besser währe es den Typ der Variable selbst
heraus zu finden. Vermutlich ist das nicht möglich.

Mit Objekten und RTTI habe ich mich leider immer noch
nicht beschäftigt.
Ich glaube ich erzeuge Global für jeden Datentyp
eine eigene Procedure und übergeben die Query, Feldname
und den Wert um die Parameter richtig zu füllen.
Es ist sicherlich nicht schön aber deutlich übersichtlicher
als hunderte von Feldwerten einzeln zu prüfen.

Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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