AGB  ·  Datenschutz  ·  Impressum  







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

Generic ToString?

Ein Thema von Whookie · begonnen am 16. Okt 2014 · letzter Beitrag vom 16. Okt 2014
Antwort Antwort
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

Generic ToString?

  Alt 16. Okt 2014, 09:53
Ist ein Generic ToString möglich?

Beispiel:
Delphi-Quellcode:
Type
  TMyVar<T> = Class
    Value: T;
    function ToString: String
  End;
Wie würde ToString zu implementieren sein?

   Result := Value.ToString geht leider nicht und prüfen mit "Is" geht nicht immer.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generic ToString?

  Alt 16. Okt 2014, 09:57
Nein, .ToString() wird nicht von allen Typen unterstützt und kann deshalb so nicht vorausgesetzt werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Generic ToString?

  Alt 16. Okt 2014, 10:35
Du könntest vielleicht deinen Typ auf einen Wrapper einschränken, beispielsweise System.Rtti.TValue
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Generic ToString?

  Alt 16. Okt 2014, 12:38
Achtung das müsste eigentlich override gekennzeichnet werden Delphi-Referenz durchsuchenTObject.ToString
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Okt 2014 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Generic ToString?

  Alt 16. Okt 2014, 12:41
Wieso überladen? Er will doch an der Signatur nichts ändern.

Dass er das override vergisst müsste ja auch in seinen Warnungen stehen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Generic ToString?

  Alt 16. Okt 2014, 12:45
Wieso überladen? Er will doch an der Signatur nichts ändern.

Dass er das override vergisst müsste ja auch in seinen Warnungen stehen
Das wollte ich eigentlich auch sagen, hab mich da wohl im Wortregal vergriffen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Generic ToString?

  Alt 16. Okt 2014, 13:09
ja, war mal wieder zu "theoretisch" momentan sieht das so aus:

function ToString: TStringList; reintroduce;
und die Abfragen erfolgen so:


Delphi-Quellcode:
function TMyVar<T>.ToString: TStringList;
begin
  Result := TStringList.Create;
  if ClassName.Contains('Integer') Then
    ConvIntegerToSL(Result)
  else if ClassName.Contains('TMyClass') then
    .. usw.
end;
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Generic ToString?

  Alt 16. Okt 2014, 13:20
Aua, da kannst du dir aber schöne Speicherlecks mit erstellen

Und diese BasisMethode so zu vergewaltigen ist auch nicht ratsam. Dafür würde ich eine eigene Methode einführen ToStrings : TStrings obwohl ich da eher zu TArray<string> tendieren würde, da gibt es keine Lecks.

Mit TValue.From<T>.AsString kann man auch eine Menge erschlagen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Generic ToString?

  Alt 16. Okt 2014, 14:08
Aua, da kannst du dir aber schöne Speicherlecks mit erstellen
Ist ein Argument, ich kopier das am ende in ein TArray<String> um und geb die Liste selber frei

Das mit TValue krieg ich aber irgendwie nicht hin, ich hab eine rekursiv aufgerufene Methode die wie folgt aussieht:

Delphi-Quellcode:
procedure TWrapVariable<T>.DoConvertToString(const Lvl: Integer; const x: TVariable<T>; const ALst: TStringList);
var
  i: Integer;
  iVi: TVariable<Integer>;
  iVf: TVariable<Single>;
  iVs: TVariable<AnsiString>;
  iVb: TVariable<Boolean>;
  s: String;
begin
  if Length(x.FVarArr)=0 then
  begin
    if (fVarType = gicInteger) then
    begin
      x.AsVariable(iVi);
      s:= TValue.From<TVariable<T>>(x).AsString; // comiled zwar wirft aber eine EInvalidCast
      fToStrBuffer := fToStrBuffer + Format('%d,', [iVi.FValue]);
    end
    else if (fVarType = gicFloat) then
    begin
      x.AsVariable(iVf);
      fToStrBuffer := fToStrBuffer + Format('%1.5f,', [iVf.FValue]);
    end
    ....
  end;

  for i := Low(x.FVarArr) to High(x.FVarArr) do
  begin
    DoConvertToString(Lvl+1, x.FVarArr[i] As TVariable<T>, ALst);
  end;


  if (Length(x.FVarArr) <> 0) Or (Lvl=0) then
  begin
    ALst.Add(fToStrBuffer);
    fToStrBuffer := '';
  end;
end;
weiter hinten wird dann über das interne fVarArr iteriert und im anschluß der fToStrBuffer-String der Stringliste
hinzugefügt.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Generic ToString?

  Alt 16. Okt 2014, 18:11
Mit TValue.From<T>.AsString kann man auch eine Menge erschlagen
Mit ToString bitte. AsString wird dich anspringen, wenn T irgendwas nicht string zuweisungskompatibles ist. So wie alle TValue.AsXXX Methoden.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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 15:04 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