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 1 von 2  1 2   
BAMatze

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

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

  Alt 15. Jun 2009, 08:52
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.

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

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

  Alt 15. Jun 2009, 08:57
Eine Property mit veränderlichem Typ gibt es nicht. Mit fallen auf anhieb 2 Lösungen ein: 1. Variant benutzen - da kann man sowohl nen Integer als auch einen Double reinstecken. 2. Zwei Properties benutzen, eine für Integer und eine für Double
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.626 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 15. Jun 2009, 09:07
Eine Klasse zur Kapselung ginge auch. Und rein theoretisch wären auch noch ein variabler Record oder Pointer denkbar, aber beim Auslesen musst du doch sowieso mit dem richtigen Typ arbeiten (außer bei Variants). Deshalb verstehe ich nicht so ganz wie du dir das vorstellst.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 15. Jun 2009, 09:24
Naja Vorstellungen hatte ich bisher noch nicht so wirklich, deswegen hatte ich euch ja mal gefragt, was es dort gibt. Ich versuche es jetzt mal mit den Variants, so wie sich das anhört, scheinen die ja ausreichend variabel für mich zu sein, dass ich je nach den beiden Typen (double oder integer) meine Variable drauftun kann ohne Probleme dabei zu bekommen. Oder gibt es dort trotzdem etwas zu beachten, dass zu Problemen führen könnte?
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.626 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 15. Jun 2009, 09:33
Zitat von BAMatze:
Oder gibt es dort trotzdem etwas zu beachten, dass zu Problemen führen könnte?
Das wichtigste: Sie sind extrem langsam. Wenn du also viele Operationen durchführen willst, rate ich eher davon ab.

Ich glaube auch auf jeden Fall, dass es sicher eine bessere Lösung gibt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 15. Jun 2009, 09:47
Zitat von jaenicke:
Ich glaube auch auf jeden Fall, dass es sicher eine bessere Lösung gibt.
Also möchte eigentlich keine weiteren Operationen damit durchführen. Ich möchte eigentlich nur den Wert, der in meiner Komponente in einem TEdit steht variabel halten.
Im Programm soll dieser dann ganz normal auf den dementsprechend richtigen Typen draufgeschrieben werden ala:
Delphi-Quellcode:
  iWert := Komponente.Value
  // oder ebend
  dWert := Komponente.Value
Würde das gehen?
2. Account Sero
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 15. Jun 2009, 09:53
Dann nimm einen Variant und entsprechende Methoden
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 15. Jun 2009, 10:15
Soll der Typ wärend der Laufzeit geändert werden könne,
oder reicht es, wenn man ihn zum Compilieungszeitpunkt festlegen kann?

siehe himXML ... die Klassen da lassen sich mit unterschiedliche Typendefinitionen kompilieren, aber diese sind dann zur Laufzeit unveränderbar.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Reinhard Kern

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

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

  Alt 15. Jun 2009, 12:57
Zitat von BAMatze:
Also möchte eigentlich keine weiteren Operationen damit durchführen. Ich möchte eigentlich nur den Wert, der in meiner Komponente in einem TEdit steht variabel halten.
Würde das gehen?
Hallo,

grundsätzlich geht immer alles, ist bloss eine Frage des Aufwands. Ich benutze im Folgenden einen Record mit case of, keine Delphi Varianten. Wichtig: es gibt für jeden Typ einen Constructor, und der legt auch für den Rest des Lebens den Typ fest. Abgerufen werden die Werte mit Object.GetInteger, Object.GetString usw. dadurch ist Typprüfung gegeben - ich benutze absichtlich kein Overloading, ich will lieber einen Fehler sehen, wenn ich mich vertan habe. Das mit der Konstruktion auch dyn. Array und Strings möglich sind (Casting mit TRKiniSettingRecordS anstatt TRKiniSettingRecord), tut hier nichts zur Sache. Ist nur ein unvollständiges Schema, keine Copy&Paste-Vorlage!!

Gruss Reinhard

Delphi-Quellcode:
   TRKiniSettingVariant = (sv_Undef,sv_String,sv_Bool,sv_Integer,
                           sv_Real,sv_Color,sv_Pen,sv_WinPos,sv_Font,sv_Binary);
{...}
   PRKiniSettingRecord = ^TRKiniSettingRecord;
   TRKiniSettingRecord = packed record
     SetupControl : TControl;
     dirty : boolean;
     removed : boolean;
       case TRKiniSettingVariant of
         sv_Undef : (vUndef : int64); { 8 bytes }
         sv_Bool : (vBool : boolean); { svWinpos }
         sv_Integer : (vInteger : longint);
         sv_Real : (vReal : double);
         sv_Color : (vColor : TColor);
         sv_Pen : (vPen : longint);
       { sv_WinPos  :  see above }
       { sv_Binary,sv_String,sv_Font  :  see below }
     end;
    { record size : 20 b }

   PRKiniSettingRecordB = ^TRKiniSettingRecordB;
   TRKiniSettingRecordB = packed record
     SetupControl : TControl;
     dirty : boolean;
     removed : boolean;
     vBinary : TRKIniBinaryArray;
     BDummy : DWord;
     end;

   PRKiniSettingRecordS = ^TRKiniSettingRecordS;
   TRKiniSettingRecordS = packed record
     SetupControl : TControl;
     dirty : boolean;
     removed : boolean;
     vString : TRKIniDynString;
     BDummy : DWord;
     end;
{...}
   TRKiniSettingValue = class
     sType : TRKiniSettingVariant;
     gType : TRKIniSettingsGrouping;
     digits : Smallint;
     Uplink : TRKIniSettingTable;
     ForwardLink : TRKiniSettingValue;
     pGroupItems : PRKiniSettingRecord; { 0 : Default. 1..n : Items }
     IniGroup,IniItem : TRKiniSettingName;
     FirstRecord,FieldLength,ExtraRecords : word;
     procedure SetupGrouping (imax : Smallint);
     procedure Create_General (imax : Smallint; IG,II : TRKiniSettingName;
                const Def; pCC : PAoTC; maxCC : Smallint; OwnerTable : TRKIniSettingTable);
     constructor Create_String (imax : Smallint; IG,II : TRKiniSettingName;
             Def : ShortString; EC : array of TEdit; OwnerTable : TRKIniSettingTable);
     constructor Create_Bool (imax : Smallint; IG,II : TRKiniSettingName;
                    Def : Boolean; BC : array of TButtonControl; OwnerTable : TRKIniSettingTable);
     constructor Create_Integer (imax : Smallint; IG,II : TRKiniSettingName;
                    Def : longint; EC : array of TEdit; OwnerTable : TRKIniSettingTable);
{...}
     function GetString (ix : Smallint) : ShortString;
     function GetBool (ix : Smallint) : boolean;
     function GetInteger (ix : Smallint) : longint;
     function GetReal (ix : Smallint) : Double;
     function GetColor (ix : Smallint) : TColor;
     function GetPenWidth (ix : Smallint) : Smallint;
{...}
{ speziell für ein Projekt: }
  TBPMLogSettings = class (TRKIniSettingTable)
    public
    Station_Node : TRKiniSettingValue; { group }
    Station_Description : TRKiniSettingValue; { group }
{...}
constructor TBPMLogSettings.CreateTable (IC : TRKIniClass);
var CSection : ShortString;

begin
inherited Create (IC);

with BLMainForm do
  begin
  CSection := 'Station';
  Station_Node := TRKiniSettingValue.Create_Integer (-maxStationNo,CSection,
        'Node',0, [] ,self);
  Station_Description := TRKiniSettingValue.Create_String (-maxStationNo,CSection,
        'Description','', [] ,self);
{...}
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 15. Jun 2009, 13:09
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.

Delphi-Quellcode:
TIndex = Record
  ValueType: (vtIntValue, vtStringValue);
  IntValue: Integer;
  StringValue: String;
  Class Operator Implicit( Value: Integer): TIndex;
  Class Operator Implicit(Const Value: String): TIndex;
  Class Operator Implicit(Const Value: TIndex): Integer;
  Class Operator Implicit(Const Value: TIndex): String;
End;
dieser Record ist z.B. 12 Byte groß,
regelt die Speicherfreigabe selber und man braucht keine Zuweisungsfunktionen aufrufen

Delphi-Quellcode:
Var X: TIndex;
  i: Integer;
  S: String;

X := i;
X := S;
S := X;
i := X;
praktisch wie Variant, nur etwas Schlanker.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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:58 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