| Autor |
Beitrag |
pascal4free
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Fr 10.06.05 19:14
Hi, ich scheitere gerade an folgendem: ich möchte gerne aus einem Record mit 16 Teilen (natülich alle verschiedene namen) immer nur bestimmte abarbeiten. Hierzu wollte ich eine Procedure aufrufen die in etwa wie folgt aussehen sollte:
Delphi-Quelltext 1: 2: 3: 4:
| procedure Test(Eigenschaft: string); begin MeinRecord.Eigenschaft:=10; end; |
also wenn mein Record von mir aus aus den Teilen Baum, Haus, Hof besteht, möchte ich halt gerne Hof übergeben, und er ändert dann entsprechend den Wert von Hof. Ist das möglich?
Umgehen kann ich das Problem leider nur schlecht, bzw ich sehe gerade keine Möglichkeit, außer ca 20x die gleiche Procedure mit nur dieser kleinen Abänderung zu verwenden, was ja irgendwie nicht das gelbe vom Ei ist.
Google und DF-Suche haben mir leider recht wenig gebracht, wenn mir jemand ein Stichwort geben könnte wäre ich auch schon froh, weil das passende Wort für mein Problem ist mir leider nicht bekannt.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 10.06.05 19:17
hmm vielleicht ist das passende wort STRTOINT
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Fr 10.06.05 19:21
öhm, nein *g*
evt hab ich mich schlecht ausgedrückt.
Mein Record soll so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| type MeinRecord= record Haus, Hof, Baum: integer; end;
var Eigenschaft: string; |
und ich habe meine procedure:
Delphi-Quelltext 1: 2: 3: 4:
| procedure NeuerWert(Eigenschaft) begin MeinRecord.'Eigenschaft':=10; end; |
wenn ich jetzt als 'Eigenschaft' z.B 'Hof' übergebe, also aufrufe NeuerWert(Hof) ,möchte ich erreichen dass dann MeinRecord.Hof den Wert 10 zugewiesen kriegt.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 10.06.05 19:28
ich würd das mit pointern lösen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type MeinRecord= record Haus, Hof, Baum: integer; end;
var Eigenschaft: string;
procedure NeuerWert(p:pinteger) begin p^:=10; end;
procedure button1click; var p : pinteger; begin p := @meinrecord.haus; neuerwert(p); end; |
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 19:47
Wenn Du nicht auf das Record angewiesen bist, dann versuch doch mal rauszubekommen, wie und bei welchen Klassen die Properties aufzählbar sind. Irgendwie muss der ObjectInspector von Delphi ja wissen, wie die Properties heissen. Da das auch zur Laufzeit funktioniert, müssen diese Objekte ja irgendwie wissen, wie ihre Properties heissen...
Nur so als Tipp...
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 10.06.05 19:50
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 10.06.05 20:09
Dazu kannst Du das Streaming-System der VCL verwenden, sofern deine Klasse von TPersistent abgeleitet ist. Dann kann diese mit TStream.WriteComponent speichern und mit TStream.ReadComponent wieder auslesen.
In einen String kannst Du das dann über MIME64 oder andere Encodierungen umwandeln.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Fr 10.06.05 21:18
@alzaimir: leider brauch ich das record auf jeden fall
@benbe: öhm, ich äh nix verstand  das geht ehrlich gesagt etwas über meine Kenntnisse hinaus.
Insgesamt muss ich aber glaube ich doch näher darstellen was das ganze wirklich soll, weil eigentlich geht es weniger um die Wertzuweisungen.
Es geht darum, das ich eine Liste habe (mit zeigern) und diese besteht halt aus Records mit 16 Inhalten (allesamt strings). Nun will ich diese sortieren, aber halt nach 16 möglichen Gesichtspunken (also entweder alle nach Inhalt Nr.1 alle nach Inhalt Nr.2 usw). Aus diesem Grund dachte ich mir, baue ich die Liste einfach neu sortiert auf, nur halt jedesmal unter einem anderen Aspekt.
Vereinfacht dargestellt nochmal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type Planet= record Wasser, Feuer, Luft, Erde: string[40] end;
var Suchparameter: string;
procedure sortieren(Parameter: string); begin if (Planet.Parameter > Vergleichswert) then.... end; |
Als Parameter könnte ich jetzt halt entweder Feuer, Wasser, Luft, Erde übergeben. Diese ganzen Inhalte dienen aber nur zum Vergleichen, es finden also keine Wertzuweisungen statt.
Ich hoffe es ist irgenwie verständlich wodrauf ich hinauswill.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 10.06.05 21:29
Vielleicht sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type Elemente = (EWasser, EFeuer, ELuft, EErde); Planet = record case byte of 0: (Wasser, Feuer, Luft, Erde: String[40]); 1: (Felder: Array[Elemente] of String[40]); end;
procedure MyProc(APlanet: Planet; Feld: Elemente); begin end; |
Aufrufen mit (Beispiel):
Delphi-Quelltext 1:
| MyProc(APlanet, EWasser); |
//Edit:
Ach ja, damit's klar ist:
APlanet.Wasser ist immer identisch mit APlanet.Felder[EWasser]; das ist ja gerade der Witz.
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Fr 10.06.05 21:35
ok, ich verstehe zwar nicht so ganz was die case-of-Anweisung soll, aber von der Idee her könnte das gehen, mal bissjen probieren
Edit: Dank deinem Edit schauts noch besser aus, wird direkt ausprobiert, muss der byte-wert irgendwann mal benutzt werden? Wie gesagt verstehe ich nicht ganz was der bewirkt
Zuletzt bearbeitet von pascal4free am Fr 10.06.05 21:38, insgesamt 1-mal bearbeitet
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 21:36
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 10.06.05 21:57
Der byte-Wert ist völlig unbedeutend und dient lediglich dazu, den Code lesbarer zu machen. Optional könnte man im Record eben noch ein Byte definieren, in welchem gespeichert ist, welcher Fall jetzt gültig ist. Dieses Byte hat dann allerdings keine direkte Verbindung mit dem Case.
Der Syntax case im record ist tatsächlich etwas verwirrend und ist (soweit ich weiss) einfach historisch bedingt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 22:11
Da kommt dann mein hohes Alter ins Spiel. Diese 'variant records' sind tatsächlich in der ersten Sprachdefinition von N.Wirth enthalten und stehen im scheinbaren Widerspruch zu der strengen Typenprüfung von Pascal. Die Restriktionen bei der Syntax sind wirklich etwas merkwürdig und passen so gar nicht zur restlichen Ästhetik von Pascal:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Type TmyVariantRecord = Record Foo : String; Bar : TSomethingElse; Case Boolean Of False : (W : Word); True : (bLo, bHi : Byte); End; |
So muss das Case immer am Ende des Records stehen. Weiterhin fehlt hier ein End. 'Case' und 'Record' haben ja normalerweise jeweils ein Eigenes.
Variant Records dienen einerseits zum 'sauberen' Typecasting (jedenfalls im Sinne des Pascal-Erfinders), andererseits zur platzsparenden Aufnahme von unterschiedlichen Daten. Schliesslich waren in den 70er Jahren Klassen und Vererbung noch unbekannt (softwaretechnisch gesehen):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Type TGraphicalShape = Record gsOrigin : TPoint; Case gsType : TShapeType Of stSquare : ( gsSquareSize : Integer ); stRectangle : ( gsVertSize, gsHorzSize : Integer ); stCircle : (gsRadius : Real); stPolygon : ( gsN : Integer; gsPoints : TPointArray ); stTriangle : ( gsA,gsB,gsC : Integer ); .... End; |
Während man Ersteres durchaus für Typecasting Geschichten oder die Enumerierung von homogenen Recordfeldern nach delfiphan verwenden kann, ist Lezteres durch Klassenvererbung überholt.
Sowas gibts auch in 'C', aber da fällt mir der Name nicht ein. Ist das nicht ein 'UNION'?
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Fr 10.06.05 22:16
tausend Dank für die schnelle und kompetente Hilfe, und mit diesen VariantRecords direkt nochmal was dazugelernt, wäre schon oft froh gewesen wenn ich sowas gehabt hätte
thx nochmal an alle die geholfen haben oder auch nur helfen wollten 
|
|
|