![]() |
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:
mein Problem ist jetzt wenn ich eine procedure machen will, dass ich die Unterrecords
TRecord = record
UnterRecord1 : TUnterRecord1; UnterRecord2 : TUnterRecord2; UnterRecord3 : TUnterRecord3; end; TUnterRecord1 = record bla : String; ... end; 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:
so, dass "irgendwas" variable Unterrecord1, 2 oder 3 sein kann;
procedure bearbeiten;
var irgendwas : keineAhnung; begin rec.irgendwas.bla := 'Hallo'; end; 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] |
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:
Bei Verwendung von OOP wäre das natürlich besser lösbar
var
myRecord: TRecord; ur1: TUnterReord1; ... ur1 := myRecord.UnterRecord1; ur1.Bla := BlaBla; myRecord.UnterRecord1 := ur1; |
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 :) |
Re: individuelles abrufen von einem record im record
Nehm doch Klassen und baue dir dafür allgemeingültige Prozeduren :)
|
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 |
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 |
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 |
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:
ähnlich ginge es mit Objekten, wobei man da die meißten Möglichkeiten hat, wenn Record und Unterrecords durch Objekte ersetzt werden.
var Rec: TRecord;
S := Rec.bla['UnterRecord1']; |
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:
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.
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; Auf Dauer erspart man sich viel doppelten Code, man erhält die Übersichtlichkeit und damit spart man im Endeffekt viel Zeit. |
Re: individuelles abrufen von einem record im record
Zitat:
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 23:34 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 by Thomas Breitkreuz