AGB  ·  Datenschutz  ·  Impressum  







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

TObject und extended

Ein Thema von friedemann2009 · begonnen am 18. Mai 2010 · letzter Beitrag vom 18. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
friedemann2009

Registriert seit: 10. Feb 2010
49 Beiträge
 
#1

TObject und extended

  Alt 18. Mai 2010, 09:46
Liebe Leute,

kurze Frage, da sonst noch nichts dazu gefunden: Wie kann ich einen Extended-Wert als TObject einer TStringlist übergeben?

liste.objects[i]:= TObject(Integer(ExtendedWert)); geht nicht, weil ja wohl Integer und nicht Extended. Mit

liste.objects[i]:= TObject(Extended(ExtendedWert)); gehts aber auch nicht: ungültige Typumwandlung.

Danke und Gruß aus HD,
friedemann

EDIT: Sry, Post im falschen Forum.. Mit Bitte um Verschiebung
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: TObject und extended

  Alt 18. Mai 2010, 09:52
Funktuioniert liste.objects[i]:= TObject(Integer(Trunc(ExtendedWert))); ?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TObject und extended

  Alt 18. Mai 2010, 10:02
Granz paßt es da eh nicht rein, da Integer/TObject nur 4 Byte und Extended 10 Byte groß ist.
über Trunc gehen die ganzen Nachkommastellen verloren und zu große Werte passen nicht in den Integer.

Wenn Extended komplett erhalten bleiben soll, wirst du um ein Datenhaltungsobjekt nicht drumrumkommen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

Re: TObject und extended

  Alt 18. Mai 2010, 10:12
Erst einmal vorweg: Ich persönlich halte es sowieso für schlechten Stil, alles was kein Objekt ist, umzucasten, ums als TObject an eine Stringliste zu hängen.
Zu deinem konkreten Problem:
Ich würde eine simple Hilfsklasse bauen, diese instanzieren, und die Instanz an die Stringliste hängen.
Delphi-Quellcode:
type
  TExtended = class
  private
    FValue: Extended;
  public
    constructor Create(const Value: Extended);
    property Value: Extended read FValue write FValue;
  end;
liste.objects[i]:= TExtended.Create(ExtendedWert); Denke hierbei daran, dass du die Objekte wieder freigeben musst. Evtl ist ein OwnsObjects = True beim Create deiner Stringliste schon genug, das musst du je nach Verwendung entscheiden.

@mkinzler: Sauber, schön den Nachkommateil wegschneiden
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: TObject und extended

  Alt 18. Mai 2010, 10:17
Moin,
willst du denn den Inhalt des Extended Wertes behalten, oder reicht dir ein Integer davon?

Für ersteres müsstest du entweder mit Klassen oder Pointern arbeiten und bei zweiterem nimm mkinzlers Weg. Beziehungsweise er schneidet die Nachkommastellen ab. Alternativ kannst du auch ab-, auf- oder kaufmännisch runden (floor, ceil, round).

Zu den Zeigern (ich hoffe das passt so, habe aber lange nicht mehr damit gearbeitet):
Delphi-Quellcode:
var
  e : Extended;
  p : PExtended;
begin
  e := 3.41;
  New(p); // Einen Zeiger darauf erstellen
  p^ := 3.41; // Ich glaube das ^ ist unnötig
  list.objects[i] := TObject(p); // Ich weiß nicht ob er cast obsolet ist
  ShowMessage(FloatToStr(PExtended(list.objects[i])^));
  Dispose(p); // Den Wert wieder freigeben
end;
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
friedemann2009

Registriert seit: 10. Feb 2010
49 Beiträge
 
#6

Re: TObject und extended

  Alt 18. Mai 2010, 10:31
Vielen Dank für die vielen Antworten.

Nun, ja ich brauche die Nachkommazahlen, sonst wäre ich von vornherein auf Integer gegangen. Das mit den neuen Objekten bzw. Zeigern schaue ich mir mal an, das kenne ich noch nicht. - Die einfachste Lösung wäre wohl, wenn ich den Wert einfach in einen String umwandelte und den dann TObject übergäbe und später im Zweifel via strtofloat wieder zurückholte. Aber ich schau mal.

Danke jedenfalls für die Tipps!

Gruß,
friedemann
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: TObject und extended

  Alt 18. Mai 2010, 11:10
Naja ich selber würde das nicht in einen String unwandeln, wenn du schon die Quellzahl vorliegen hast.

Wenn du dich nicht an die Pointer traust, nehm die Klasse, aber die erzeugt einiges an Overhead. Ansonsten machst du das mit Pointern, wie ich das Vorgeschlagen habe. Dann nehme dir zwei/drei Methoden:
Delphi-Quellcode:
procedure SetExtended(AList : TStrings; AIndex : Integer; AExtended : Extended);
var
  p : PExtended;
begin
  p := PExtended(AList.Objects[AIndex]);
  if p = nil then
  begin
    New(p);
    AList.Objects[AIndex] := TObject(p);
  end;
  p^ := AExtended;
end;

function GetExtended(AList : TStrings; AIndex : Integer) : Extended;
var
  p : PExtended;
begin
  p := PExtended(AList.Objects[AIndex]);
  if p = nil then
  begin
    raise Exception.CreateFmt('Index ' + IntToStr(AIndex) + ' is not set!');
  end;
  Result := p^;
end;

procedure ClearList(AList : TStrings);
var
  i : Integer;
  p : PExtended;
begin
  for i := 0 to AList.Length - 1 do
  begin
    p := PExtended(AList.Objects[i]);
    if p <> nil then
    begin
      Dispose(p);
      AList.Objects[i] := nil;
    end;
  end;
end;
Wichtig ist nur, dass du beim zerstören der StringList die Methode ClearList aufrufst, damit da keine Speicherlecks entstehen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TObject und extended

  Alt 18. Mai 2010, 11:21
Zitat von xZise:
nehm die Klasse, aber die erzeugt einiges an Overhead.
einen Hauch an RTTI und pro Wert die 4 Byte mehr ... ich glaub das fällt kaum auf
und die Vorteile eines Objektes(Klasse) in .Objects sollten überwiegen, vorallem da sich neuere StringListen automatisch um die Freigabe kümmern können und man sich so auch noch das Freigeben erspart.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: TObject und extended

  Alt 18. Mai 2010, 11:27
Nagut,
ich habe angenommen, dass durch die Prozeduren und so halt mehr Speicher gebraucht wird Aber wenn das nicht der Fall ist, natürlich die Klasse nehmen. Weil wie himitsu das schon gesagt hat, gibt das die StringList selber ja auch netterweise wieder frei

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TObject und extended

  Alt 18. Mai 2010, 11:46
Och, der Constructor braucht vielleicht auch nur 10 Byte mehr, aber er vereinfacht wenigstens die Erstellung+Wertzuweisung, als wenn man diese Minimalversion verwenden würde.
Delphi-Quellcode:
type
  TExtended = class
    Value: Extended;
  end;
Delphi-Quellcode:
liste.objects[i] := TExtended.Create(ExtendedWert);
//gegen
liste.objects[i] := TExtended.Create;
TExtended(liste.objects[i]).Value := ExtendedWert;
Und das Property verbraucht beim Aufruf garnichts, da ja direkt an FValue weitergeleitet wird.
$2B or not $2B
  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 16: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