AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Ableiten von Records

Ein Thema von SirThornberry · begonnen am 6. Dez 2010 · letzter Beitrag vom 27. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

Ableiten von Records

  Alt 6. Dez 2010, 10:22
Delphi-Version: 2010
Ist es inzwischen möglich von Records abzuleiten und wenn ja - wie?

Es geht um folgendes. Ich habe einen Record (TRecordBase) mit verschiedenen Funktionen etc.
Jetzt benötige ich an bestimmten Stellen noch weitere Informationen die nicht im Record enthalten sind. Normalerweise würde ich den bisherigen Record einfach erweitern. Das geht jedoch nicht da der Record an bestimmten Stellen auch in eine Datei geschrieben wird bzw. daraus gelesen wird.
Um nicht überall den Quelltext ändern zu müssen und die bisherigen Recordfunktionen kopieren zu müssen etc. würde ich somit gern vom bisherigen Record ableiten.

Bisher habe ich das so gelöst:
Delphi-Quellcode:
TMyNewRecord = record
  Base: TRecordBase;
  extraData: Byte;
end;
Das hat jedoch den Nachteil das man die Stellen wo bisher "baseRecord.ValueXY := ..." verwendet wurde, ändern muss zu "baseRecord.Base.ValueXY := ..."

Das ganze auf Objekte umzustellen ist in dem Fall keine Lösung (also bitte diesen Lösungsvorschlag vergessen).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Ableiten von Records

  Alt 6. Dez 2010, 10:37
Afaik gibt es keinen sauberen Weg.
Entweder man macht es so wie du (immer weiter das abzuleitende Record als seperate Eigenschaft kapseln) oder man macht eine Klasse draus.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 10:38
Records bieten keine Vererbung, wengleich sowas bestimmt cool gewesen wäre.
(also eingebettete Records zumindestens)

also dein bisheriger Weg wäre so das allgemein anerkannte Vorgehen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 10:41
Afaik gibt es keinen sauberen Weg.
Entweder man macht es so wie du (immer weiter das 'abzuleitende' Record als seperate Eigenschaft kapseln) oder man macht eine Klasse draus.
Andersfalls bleiben nur noch Redefinierungen und dann Zeigerfummeleien.


Seit 2006 könnte man aber auch noch sowas machen:
Delphi-Quellcode:
TRecordBase = record
  Feld1: Integer;
  Feld2: String;
end;
TMyNewRecord = record
private
  function GetFeld1: Integer; inline;
  ...
public
  Base: TRecordBase;
  extraData: Byte;
  property Feld1: Integer read GetFeld1 write SetFeld1;
end;

function TMyNewRecord.GetFeld1: Integer;
begin
  Result := Base.Feld1;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Ableiten von Records

  Alt 6. Dez 2010, 10:42
Es muss auch nicht unbedingt Vererbung im eigentlichen Sinne sein.
Mir wäre auch so etwas ganz recht:
Delphi-Quellcode:
TBaseRecord = record
{$CONTENT01}
  Value: Byte;
{$ENDCONTENT}
end;

TNewRecord = record
{$I $CONTENT01}
end;
Das dies geht wenn man den Record-Inhalt in externe Dateien auslagert ist mir klar aber geht das auch in einer Datei das man einen Quellcodeabschnitt später wieder verwenden kann?

Mir geht es hauptsächlich darum nicht an Zig stellen alles ändern zu müssen sondern mir wäre es ganz recht wenn ich nur die Declaration ändern muss.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry ( 6. Dez 2010 um 10:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 10:48
Delphi-Quellcode:
TBaseRecord = record
  Value: Byte;
end;

TNewRecord = record(TBaseRecord)
  Value2: Integer;
end;

// welches dann dieses gergibt (neue Werte hinten angehängt)
TNewRecord = record(TBaseRecord)
  Value: Byte;
  Value2: Integer;
end;
oder vielleicht in etwa sowas, wo man dann namenlos einen Record irgendwo einfügen kann.
Delphi-Quellcode:
TBaseRecord = record
  Value: Byte;
end;

TNewRecord = record(TBaseRecord)
  Value2: Integer;
  *: TBaseRecord;
  Value3: Integer;
end;
Von der Syntax her wäre Beides kein Problem und bestimmt nichmal all zu schwer implementierbar.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Ableiten von Records

  Alt 6. Dez 2010, 11:24
Bisher habe ich das so gelöst:
Delphi-Quellcode:
TMyNewRecord = record
  Base: TRecordBase;
  extraData: Byte;
end;
Das hat jedoch den Nachteil das man die Stellen wo bisher "baseRecord.ValueXY := ..." verwendet wurde, ändern muss zu "baseRecord.Base.ValueXY := ..."
Du kannst den Zeiger von TMyNewRecord auf TRecordBase casten.
Somit entfällt das ".Base." - aber du verlierst auch den Zugriff auf die neuen Felder.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Ableiten von Records

  Alt 6. Dez 2010, 11:29
Genau, so ähnlich mache ich es jetzt auch (bis es eine bessere Lösung gibt). Aber mir wäre es lieber mit weniger Quelltextänderungen das ganze hin zu bekommen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Ableiten von Records

  Alt 6. Dez 2010, 12:25
Seit 2006 könnte man aber auch noch sowas machen:
Delphi-Quellcode:
TRecordBase = record
  Feld1: Integer;
  Feld2: String;
end;
TMyNewRecord = record
private
  function GetFeld1: Integer; inline;
  ...
public
  Base: TRecordBase;
  extraData: Byte;
  property Feld1: Integer read GetFeld1 write SetFeld1;
end;

function TMyNewRecord.GetFeld1: Integer;
begin
  Result := Base.Feld1;
end;
Das geht sogar noch wesentlich einfacher:
Delphi-Quellcode:
type
  TRecordBase = record
    Feld1: Integer;
    Feld2: string;
  end;

  TMyNewRecord = record
  public
    Base: TRecordBase;
    extraData: Byte;
    property Feld1: Integer read Base.Feld1 write Base.Feld1;
  end;
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Ableiten von Records

  Alt 6. Dez 2010, 12:38
Das bringt mich nur kein Stückchen Weiter.
Dann müsste ich ja für jedes Feld in meinem Record (sind etwa 30 Stück) ein Property definieren.
Und wenn ich irgendwann von TMyNewRecord auf diese Art "ableite" bezweifle ich das er dann auf eben die gleiche Weise auf Feld1 von Base zugreifen würde:

Delphi-Quellcode:
 TRecordBase = record
    Feld1: Integer;
    Feld2: string;
  end;

  TMyNewRecord = record
  public
    Base: TRecordBase;
    extraData: Byte;
    property Feld1: Integer read Base.Feld1 write Base.Feld1;
  end;

  TMyNewRecordV2 = record
  public
    Base: TMyNewRecord;
    extraData2: Byte;
    property Feld1: Integer read Base.Feld1 write Base.Feld1; // <== funktioniert nicht da bei read und write Felder erwartet werden
  end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry ( 6. Dez 2010 um 12:49 Uhr)
  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 16:35 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