AGB  ·  Datenschutz  ·  Impressum  







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

Ableiten von Records

Ein Thema von SirThornberry · begonnen am 6. Dez 2010 · letzter Beitrag vom 27. Jan 2016
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 09: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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 11: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
 
#3

AW: Ableiten von Records

  Alt 6. Dez 2010, 11: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 11:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 11:59
property Feld1: Integer read Base.Base.Feld1 write Base.Base.Feld1; .
hatte sowas auch mal versucht und bei mir ging es damals irgendwie auch nicht.
(nja, die letzen Male, wo ich sowas gätte gebrauchen können, da hab ich eh intervaces genutzt, wo sowieso keine Zugriffe auf Felde möglich sind)

PS: Das Inline optimiert den Getter/Setter eh weg. (also bei einem Objekt)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 12:05
property Feld1: Integer read Base.Base.Feld1 write Base.Base.Feld1; .
hatte sowas auch mal versucht und bei mir ging es damals irgendwie auch nicht.
Also, das compiliert:
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;

  TMyNewRecord2 = record
  public
    Base: TMyNewRecord;
    extraData: Byte;
    property Feld1: Integer read Base.Base.Feld1 write Base.Base.Feld1;
  end;
Ob's auch in komplizierteren Fällen compiliert und vor allem auch funktioniert, hab ich jetzt nicht ausprobiert.

PS: Das Inline optimiert den Getter/Setter eh weg. (also bei einem Objekt)
OK. Aber schreiben musste das Ding trotzdem.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 12:16
OK. Aber schreiben musste das Ding trotzdem.
Autovervollständigung, Copy&Paste und nach 'ner Weile schreibt man sowas blind in wenigen Sekunden dahin.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
270 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Ableiten von Records

  Alt 25. Okt 2013, 08:03
Hallo,

*thread ausgrab*

gab es Verbesserungen in den letzten Delphi bezüglich der Vererbung von Records?
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Ableiten von Records

  Alt 6. Dez 2010, 12:00
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.
Es ist immerhin eine Lösung, die man an einer zentralen Stelle implementieren kann, statt quer durch den ganzen Quellcode zu gehen und Casts einzubauen . Und mit etwas Makrotrickserei ist das auch kein Riesenaufwand.
Uli Gerhardt
  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 05:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz