AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Änderung einer Deklarartion integer <-> double möglich?

Änderung einer Deklarartion integer <-> double möglich?

Ein Thema von BAMatze · begonnen am 15. Jun 2009 · letzter Beitrag vom 15. Jun 2009
Antwort Antwort
Seite 2 von 2     12
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#11

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 13:18
Zitat von himitsu:
vergiß aber nicht, daß bei Reinhard Kerns Lösung der Record selber freigegeben werden muß, wenn da etwas größeres drin enthalten ist, welches via Pointer referenziert ist und auch bei Objekten.

...
dieser Record ist z.B. 12 Byte groß,
regelt die Speicherfreigabe selber und man braucht keine Zuweisungsfunktionen aufrufen

...
Das ist eben ein andrer Fall: ich verwalte Ini-Einträge, und die sollen zwar verschiedene Typen verwalten können, aber der Typ darf NIEMALS wechseln. Deswegen auch kein Overloading, als integer festlegen und als string abrufen ist eben falsch (bei dir übrigens auch, nicht formal aber logisch, oder wertest du beim Lesen den Typ aus?).

Gruss Reinhard
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#12

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 13:21
Zitat von BAMatze:
Hallo und guten Morgen an alle DP´ler,

Hab mal eine allgemeine Frage. Kann ich in die Deklaration einer Property einer Komponente je nach Verwendung ändern?
Es geht um folgendes: Ich hab eine Komponente, in welche Ganzzahlen oder Gleitkommazahlen eingegeben werden können. Je nachdem welcher Typ durch den Benutzer eingestellt wird, soll die Property Value integer oder double sein. Gibt es eine Möglichkeit dies umzusetzen?
Leider hab ich zu dem Thema kein Threat gefunden, was sicherlich nicht daran liegt, dass es sie nicht gibt, sondern an den verwedeten Fachwörtern.
Variant wäre möglich. Der Code wird dadurch langsamer, aber du kannst alles damit machen. Du kannst als Integer anfangen, Double draus machen und dann sogar noch ein String

Delphi-Quellcode:
var
  a: Variant;
begin
  a := 5;
  ShowMessage(IntToStr(a * 5));
  a := a / 2;
  ShowMessage(FloatToStr(a));
  a := 'a ist = ' + FloatToStr(a);
  ShowMessage(a);
end;
Das ist schon beinahe Visual Basic
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 13:27
Man könnte den Typ auswerten und entsprechend versuchen umzuwandeln, aber in meinem aktuellen Fall ist dieses nicht so.

Die Originaldefinition sieht eigentlich nur so aus (aus himXMLi.pas) und diehnt eigentlich nur der Möglichkeit einer Funktion unterschiedliche Parameter zu übergeben (da keine überladenen Properties möglich sind ... außer in neueren Delphiversionen und da auch nur bei den Default-Properties)
Delphi-Quellcode:
TIndex = Record
  ValueType: (vtIntValue, vtStringValue);
  IntValue: Integer;
  StringValue: String;
  Class Operator Implicit( Value: Integer): TIndex;
  Class Operator Implicit(Const Value: String): TIndex;
End;
Intern wird da der übergebene Wert direkt entsprechend behandelt.

Also es kommt dann auf die Interne Behandlung an, also ob der Typ sich auch mal ändern kann und man eventuell sogar eine Typumwandlug mit integriert hat,
oder ob der Typ danach Fest ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 15:44
Also habe das jetzt erstmal wie folgt gelöst:

Delphi-Quellcode:
type TZahltyp = (ZtGanzzahl, ZtposGanzzahl, ZtGleitkommazahl, ZtposGleitkommazahl);

Type TLabZahlEdit = Class(TWinControl)
  private
    ...
    FvValue: Variant;
    ...
    procedure SetValue(vWert: Variant);
    function GetValue: Variant;
  protected
    ...
  published
    ...
    property Value: Variant read GetValue write SetValue;
  public
    ...
end;

procedure TLabZahlEdit.SetValue(vWert: Variant);
var sTemp: string;
    dTemp: double;
    iTemp: integer;
begin
  // es muss bei der Konvertierung darauf geachtet werden, dass ein int auch in
  // ein double umgewandelt werden kann und somit muss anhand des eingestellten
  // Zahlentyps die richtige Konvertierung durchgeführt werden.
  sTemp := vartostr(vWert);
  if sTemp <> Null then
    begin
      case FEdEingabe.Zahlart of
        Ganzzahl: if trystrtoint(sTemp, iTemp) then
                             begin
                               FvValue := vWert;
                               SetText(sTemp);
                             end;
        posGanzzahl: if trystrtoint(sTemp, iTemp) then
                             begin
                               FvValue := vWert;
                               SetText(sTemp);
                             end;
        Gleitkommazahl: if trystrtofloat(sTemp, dTemp) then
                             begin
                               FvValue := vWert;
                               SetText(sTemp);
                             end;
        posGleitkommazahl: if trystrtofloat(sTemp, dTemp) then
                             begin
                               FvValue := vWert;
                               SetText(sTemp);
                             end;
      end;
    end;
end;

function TLabZahlEdit.GetValue: Variant;
var sTemp: string;
    iTemp: integer;
    dTemp: double;
begin
  sTemp := vartostr(FvValue);
  case FEdEingabe.Zahlart of
    Ganzzahl: if trystrtoint(sTemp, iTemp) then result := strtoint(sTemp);
    posGanzzahl: if trystrtoint(sTemp, iTemp) then result := strtoint(sTemp);
    Gleitkommazahl: if trystrtofloat(sTemp, dTemp) then result := strtofloat(sTemp);
    posGleitkommazahl: if trystrtofloat(sTemp, dTemp) then FvValue := strtofloat(sTemp);
  end;
end;
Könnt ihr euch ja vieleicht mal anschauen, ob ich da jetzt einen Denkfehler drin hab oder ob das ok ist. Danke euch auf jeden Fall für eure Anregungen.

MfG
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 15:52
Zitat:
if sTemp <> Null then
sTemp ist immer ungleich NULL , selbst wenn es "leer" ist.
Wenn schon, dann solltest du vWert auf NULL prüfen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 16:10
Zitat von himitsu:
Zitat:
if sTemp <> Null then
sTemp ist immer ungleich NULL , selbst wenn es "leer" ist.
Wenn schon, dann solltest du vWert auf NULL prüfen.
Arbeite ich gleich mit ein, Danke @himitsu
2. Account Sero
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 16:25
Ebenso könnte man den Quelltext etwas verschlanken. In dem Case machst du nach dem TryStrToXXX immer das gleiche.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 19:04
Zitat von quendolineDD:
Ebenso könnte man den Quelltext etwas verschlanken. In dem Case machst du nach dem TryStrToXXX immer das gleiche.
ja hab ich auch schon drüber nachgedacht. Werde ich dann morgen mal machen, danke auch an dich.
2. Account Sero
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#19

Re: Änderung einer Deklarartion integer <-> double mög

  Alt 15. Jun 2009, 19:26
Das scheint mir doch alles etwas zu aufwändig zu sein.
In einem TEdit (und alles was davon abgeleitet ist), steht in erster Linie ein Text.
Möchte man sich das Leben etwas einfacher machen, dann kann man zusätzliche Properties aufnehmen:
Delphi-Quellcode:
Property Text:String;
property AsFloat:Extended read ... write ...;
property AsInteger:Integer read ... write ...;
Der Anwender der Komponente hat doch fast immer eine genaue Vorstellung was in dem Control drinsteckt (ganzzahl, float, Text) und wählt das passende Property.
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:34 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