Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi individuelles abrufen von einem record im record (https://www.delphipraxis.net/135368-individuelles-abrufen-von-einem-record-im-record.html)

MrTerry 9. Jun 2009 23:55


individuelles abrufen von einem record im record
 
hi
ich hab da mal ne Frage... (zufall? ^^)

ich arbeite mit delphi 2007 (falls das wichtig sein sollte)

ich habe ein Record mit anderen Records darin zusammengefasst

Delphi-Quellcode:
TRecord = record
 UnterRecord1 : TUnterRecord1;
 UnterRecord2 : TUnterRecord2;
 UnterRecord3 : TUnterRecord3;
end;


TUnterRecord1 = record
 bla : String;
 ...
 end;
mein Problem ist jetzt wenn ich eine procedure machen will, dass ich die Unterrecords
in eine variable oder zeiger speichern will und dann individuell aufrufen kann

so zum beispiel meine ich das :

Delphi-Quellcode:
var
Rec : TRecord;
Delphi-Quellcode:
procedure bearbeiten;
var irgendwas : keineAhnung;
begin
 rec.irgendwas.bla := 'Hallo';
end;
so, dass "irgendwas" variable Unterrecord1, 2 oder 3 sein kann;

weiß nicht ob ihr mich jetzt verstanden habt ^^
komm damit irgendwie nicht klar :/

wenn ihr mir helft, dann bitte wenns geht mit beispiel code erklären

danke schonmal im vorraus
lg Terry

[edit=mkinzler]Code-Tags durch Delphi-Tags ersetzt Mfg, mkinzler[/edit]

mkinzler 10. Jun 2009 00:03

Re: individuelles abrufen von einem record im record
 
Mit Records geht das so nicht. Du musst in der zuweisung immer den gesamten Unterrecord ersetzen also

Delphi-Quellcode:
var
    myRecord: TRecord;
    ur1: TUnterReord1;
...

   ur1 := myRecord.UnterRecord1;
   ur1.Bla := BlaBla;
   myRecord.UnterRecord1 := ur1;
Bei Verwendung von OOP wäre das natürlich besser lösbar

MrTerry 10. Jun 2009 00:15

Re: individuelles abrufen von einem record im record
 
hmmm das wäre ja nur geringe verkürzung des quellcodes :(

naja... wenns nicht so geht gehts so nicht :-/ muss ich mir was anderes überlegen... oder den langen quellcode nehmen und für jeden fall abfragen.... ^^

trotzdem danke :)

quendolineDD 10. Jun 2009 00:40

Re: individuelles abrufen von einem record im record
 
Nehm doch Klassen und baue dir dafür allgemeingültige Prozeduren :)

MrTerry 10. Jun 2009 08:18

Re: individuelles abrufen von einem record im record
 
hmmm hab leider noch nie selbst mit klassen gearbeitet, da ich mich noch nicht rangetraut hatte....

hab mich jetzt etwas eingelesen und merke zumindest nicht, in wiefern mir das weiterhelfen kann ...
das problem bleibt da doch im endeffekt trotzdem weiterbestehn .... oder täusch ich mich da gerade? Oo

mkinzler 10. Jun 2009 10:01

Re: individuelles abrufen von einem record im record
 
Bei Record kann man immer nur komplette Untertypen austauschen ( Unterrecord1 als Stück aber keine Teile davon, will man das muss man es so kompliziert machen, wie ich oben gezeigt habe Teiltyp in lokale Variable kopieren, Teilwert anpassen und Zurückschreiben)
Bei Klassen kann man dafür Setterschreiben und diese dann mit einer entsprechenden Property verbinden

MrTerry 11. Jun 2009 00:01

Re: individuelles abrufen von einem record im record
 
hmmm ich verstehe was du meinst.... und habe auch ungefähr ne vorstellung wie
aber kannste trotzdem einen kleinen beispielcode machen, damit ich mich nicht sinnlos verrenne ^^

ich weiß...beste lernmethode ist backtracking .... versuch und irrtum :D
aber ich glaub schon in meiner vorstellung mache ich es mir komplizierter als es sein muss

danke auf jeden fall schonmal :)
werd mich zu klassen wohl weiter belesen müssen

lg Terry

himitsu 11. Jun 2009 00:23

Re: individuelles abrufen von einem record im record
 
sobald der Compiler es unterstützt, ginge auch sowas:
Delphi-Quellcode:
TRecord = record
private
  function GetBla(const Name: String): String;
  procedure SetBla(const Name, Value: String);
public
  UnterRecord1 : TUnterRecord1;
  UnterRecord2 : TUnterRecord2;
  UnterRecord3 : TUnterRecord3;
  property bla[const Name: String]: String read GetBla write SetBla;
end;


function TRecord.GetBla(const Name: String): String;
begin
  if Name = 'UnterRecord1' then
    Result := UnterRecord1.bla
  else
...
Delphi-Quellcode:
var Rec: TRecord;

S := Rec.bla['UnterRecord1'];
ähnlich ginge es mit Objekten, wobei man da die meißten Möglichkeiten hat, wenn Record und Unterrecords durch Objekte ersetzt werden.

wicht 11. Jun 2009 00:26

Re: individuelles abrufen von einem record im record
 
Hm, jetzt hatte ich den doofen Kasten, aber ich möchte es trotzdem so abschicken.. Passt (hoffentlich)...

Ich möchte dir auch noch einmal die Verwendung von Klassen empfehlen. Zumindest, wenn ich lese, dass Du dich da noch nicht dran "getraut" hast, könnte man sagen, dass du dann einiges (oder vieles) verpasst.

Das würde bei dir dann z.B. so aussehen:

Delphi-Quellcode:
type
  TRecord = class
  private
    FUnterRecord1: TUnterRecord1;
  public
    constructor Create;
    property UnterRecord1: TUnterRecord1 read FUnterRecord1;
  end;

...

procedure TForm1.DoSomething;
var
  R: TRecord;
begin
  // Den Kollegen erstellen
  R := TRecord.Create;
  R.UnterRecord1.Variable := 123;
end;

constructor TRecord.Create;
begin
  // Initialisieren...
  FUnterRecord1.Variable := 0;
end;
Alternativ könnte FUnterRecord1 natürlich auch selbst eine Klasse sein, von der im Constructor von TRecord eine Instanz erstellt wird... Ich will nicht zum übertreiben raten, es kommt immer auf den Kontext an, aber wer sich noch nie an Klassen herangetraut hat, der sollte sich damit beschäftigen.
Auf Dauer erspart man sich viel doppelten Code, man erhält die Übersichtlichkeit und damit spart man im Endeffekt viel Zeit.

Aphton 11. Jun 2009 02:12

Re: individuelles abrufen von einem record im record
 
Zitat:

Zitat von MrTerry
hmmm hab leider noch nie selbst mit klassen gearbeitet, da ich mich noch nicht rangetraut hatte....

hab mich jetzt etwas eingelesen und merke zumindest nicht, in wiefern mir das weiterhelfen kann ...
das problem bleibt da doch im endeffekt trotzdem weiterbestehn .... oder täusch ich mich da gerade? Oo

Grob gesagt:

Records: Variablen
Klassen: Variablen, Properties, Methoden(Procedure/Function)

Bei neueren Delphi Versionen kann man auch Methoden in Records implementieren.
Klassen müssen explizit erstellt & zerstört werden (Create & Free), welches bei
Records nicht der Fall ist, da Speicher zur Laufzeit alloziert wird.
Weiters beherrschen Klassen die Vererbung -> welches - wenn richtig eingesetzt - eine Aufgabe visuell und performancemäßig aufpeppeln kann ;)

Da gibts noch ein Zwischending -> Object. Sie entspricht einer Klasse, jedoch ohne Vererbung und das allozieren des Speichers übernimmt hier Delphi wieder...

Hoffe ein wenig informativ gewesen zu sein :smile2:

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 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