AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TValue casten, kann es das von alleine ?

Ein Thema von Mokus · begonnen am 2. Okt 2017 · letzter Beitrag vom 2. Okt 2017
Antwort Antwort
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 10:23
Delphi-Version: 10 Berlin
Hallo zusammen,

seid neuesten bewege ich mich richtung RTTI und finde die möglichkeiten damit echt unglaublich.
Nun komme ich aber zu einem Punkt, wo ich eure hilfe brauche.

Durch TRttiInstanceType.getProperty(PropName);
bekomme ich ein TValue zurück.
Das habe ich nun immer stumpf als Value.AsVaraint zurück gegeben.
Jetzt habe ich ein TDateTime als Property und statt den erwartetetn Wert von now(), der kurz vorher reingeschrieben wurde, liefert asVaraint mir ein Wert zurück, der halt ohne Casten nicht als TDateTime interpritiert werden kann.
Daher meine Frage,

muss ich das wirklich nun von Hand machen, quasi* als

* nicht funktionierender Code
Delphi-Quellcode:
 case Value.type of
Datetime : result := Value.AsDatetime;
Integer : result := Value.AsInteger
{etc.}
oder geht das durch das TValue irgendwie schöner ... ?


( ist die Frage verständlich? ^^)

Gruß
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 10:35
Ich weiß jetzt nicht, was du genau vorhast, aber warum verwendest du TValue nicht solange wie möglich und wandelst erst dann um, wenn du den Wert wirklich brauchst?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 10:48
ok war bisschen schwer beschrieben.

Hier nun ein bisschen Quellcode mit kommentaren.
Viel davon ist es, ein TcxVerticalGrid mit Daten aus einem Objekt zu füllen.
An dieser Stelle bräuchte ich halt den wirklichen Wert von TValue.



Delphi-Quellcode:
procedure TVerticalGridBinding.Load;
var
  value: TcxCustomRow;
  i: Integer;
  SetValue: TValue;
  name: string;
  list: TTempList;
  OBJ: TTTRttiObject;

begin
  FVerticalGrid.BeginUpdate;
  SetValue := TValue.FromVariant(Null);
  try
    for i := 0 to FVerticalGrid.Rows.Count - 1 do
    begin
      value := FVerticalGrid.Rows[i];
      if value is TcxCategoryRow then
        Continue;
      name := value.name;
      if name = FOBJ_ID_NAME then
        Continue;
      self.ModifiziereName(name);
      if FID2OBJ.Count > 0 then
        FID2OBJ.TryGetValue(TcxEditorRow(FVerticalGrid.RowByName(FOBJ_ID_NAME)).Properties.value, list);

    // Bis hier eigentlich Code, der für das Problem unrelevant ist.

      for OBJ in list.Values do
      begin
        if OBJ.GetPropValue(name, SetValue) then // << hier wird sich der Wert Via TValue schon besorgt. Das heißt es wird so lange wie möglich schon mit TValue gearbeitet
          Break;
      end;

      TcxEditorRow(value).Properties.value := SetValue.AsVariant; // < diese Zeile gibt mir komische Werte bei TDateTime zurück. Dadruch kann die TcxEditorRow das nicht als Datum konvertieren.
      SetValue := SetValue.FromVariant(Null);
    end;
  finally
    FVerticalGrid.EndUpdate;
  end;
end;
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 10:50
TValue ist TValue. Du kannst implizit fast beliebigen Kram reinstecken, aber du musst explizit sagen was du rausholen möchtest, das ist beim (schrecklichen) Variant anders.
Delphi-Quellcode:
procedure printDateTime(timestamp: TDateTime);
begin
   WriteLn( DateTimeToStr(timestamp) );
end;

procedure p();
var
   asDateTime: TDateTime;
   asValue: TValue;
   asVariant: Variant;
begin
   asDateTime := Now();
   asValue := asDateTime;
   asVariant := asDateTime;
   printDateTime(asVariant);
   printDateTime(asValue.AsVariant);
   //acceptDateTime(asValue); // << Geht nicht
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 11:04
Ich glaube, jetzt verstehe ich: Da TcxEditorRow(value).Properties.value selbst nicht vorgibt, was es für einen Typ erwartet, kannst du das nicht direkt auflösen. Da TTypeKind keinen Wert für TDateTime kennt, wird das intern als Float dargestellt, was dann hinterher wohl falsch interpretiert wird. In dem Fall wird dir auch ein case Value.Kind of nicht viel helfen, da wie gesagt TDateTime kein direkt unterstützter Typ ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 11:16
@Uwe,
ja, du hast da Problem erfasst.
Nun brauch ich eine Lösung, im idealfall eine schöne mit dazu

@Günther
und wie bekomme ich ein TDateTime raus ? Da bleibt mir ja bei deinem Beispiel nur das TDateTime(asValue.asVaraint) oder ?
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 11:22
Update: nicht schön aber geht.


Delphi-Quellcode:
    
// do Something
  for OBJ in list.Values do
      begin
        if OBJ.GetPropValue(name, SetValue) then
          Break;
      end;

      if TcxEditorRow(value).Properties.EditProperties is TcxDateEditProperties then
        TcxEditorRow(value).Properties.value := TDateTime(SetValue.AsVariant)
      else
        TcxEditorRow(value).Properties.value := SetValue.AsVariant;

      SetValue := TValue.From(null);
    end;
  finally
    FVerticalGrid.EndUpdate;
  end;
end;
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 11:25
Dann besser
        TcxEditorRow(value).Properties.value := SetValue.AsType<TDateTime>
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: TValue casten, kann es das von alleine ?

  Alt 2. Okt 2017, 11:30
ok, die Zeile wurde geändert!

Danke dafür, für mich nun gelöst.
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  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 05:42 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