Autor Beitrag
pascal4free
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure Test(Eigenschaft: string);
begin
  MeinRecord.Eigenschaft:=10;  //Eigenschaft soll hier der String sein
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 10.06.05 19:17 
hmm vielleicht ist das passende wort Suche in: Delphi-Forum, Delphi-Library STRTOINT

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
pascal4free Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: Fr 10.06.05 19:21 
öhm, nein *g*

evt hab ich mich schlecht ausgedrückt.

Mein Record soll so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type MeinRecord= record
                   Haus, Hof, Baum: integer;
                 end;

var Eigenschaft: string;


und ich habe meine procedure:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 10.06.05 19:28 
ich würd das mit pointern lösen

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 10.06.05 19:50 
user profile iconretnyg hat folgendes geschrieben:
ich würd das mit pointern lösen

n anderer einfacher weg ist dieser (wenn alle integer sind)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type MeinRecord= record
                   Haus, Hof, Baum: integer;
                 end;

var Eigenschaft: string;

procedure NeuerWert(var i:integer)
begin
  i:=10;
end;

procedure button1click;
begin
   neuerwert(meinrecord.haus);
end;

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: Fr 10.06.05 21:18 
@alzaimir: leider brauch ich das record auf jeden fall :?

@benbe: öhm, ich äh nix verstand :shock: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.06.05 21:29 
Vielleicht sowas:
ausblenden 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
  // Zugriff mittels APlanet.Felder[Feld]
end;

Aufrufen mit (Beispiel):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 10.06.05 21:36 
Cool! Und Simpel!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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):
ausblenden 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); // Nur so mal was anderes
      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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: 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 8)

thx nochmal an alle die geholfen haben oder auch nur helfen wollten :wink: