Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu "Typenkompatibilität" und "array index" (https://www.delphipraxis.net/15177-frage-zu-typenkompatibilitaet-und-array-index.html)

barnti 23. Jan 2004 12:12


Frage zu "Typenkompatibilität" und "array ind
 
Habe im Forum folgendes gefunden:

Delphi-Quellcode:
Type TWochenTag = (Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag);
     TNachtwaechter = Record
                        Vorname,
                        Nachname,
                        Strasse,
                        PLZ_Ort: string;
                      end;

...

VAR Nachtwaechter: Array[Montag..Sonntag] of TNachtwaechter;
Meine Frage: Gibt es eine Möglichkeit, evtl mit kleinen Änderungen, nicht über den "enumeration Typ" (Montag..Sontag) auf das array zuzugreifen, sondern auch über einen Index. Bsp:

Delphi-Quellcode:
Nachtwaechter[1].Vorname:= 'Karl-Heinz'
Ich würde gern die Möglichkeit nutzen per Enum auf den Inhalt zuzugreifen. Bei der Initialisierung würde ich aber gern mit einer Schleife arbeiten, in etwa:

Delphi-Quellcode:
for i:=0 to count do
  Nachtwaechter[i].name:= List.items[i];
Ideen? Her damit ;)

Danke & Gruß,

Barnti

Phoenix 23. Jan 2004 12:31

Re: Frage zu "Typenkompatibilität" und "array
 
Hehe, in genau dem gleichen Thread steht das hier.

Code:
var Nachtwaechter: Array[1..7] of TNachtwaechter;
Somit hast Du 7 Elemente die Du mit Nachtwaechter[1] bis Nachtwaechter[7] auch mit einer Variablen ansprechen kannst.

Phoenix 23. Jan 2004 12:32

Re: Frage zu "Typenkompatibilität" und "array
 
Achso. Frage im ersten Moment falsch verstanden.

Ja, das geht, und zwar musst Du da mal nach Hier im Forum suchenRTTI suchen. Da findest Du informationen wie die Enums intern aufgelöst werden um sie direkt anzusprechen.

kiar 23. Jan 2004 12:33

Re: Frage zu "Typenkompatibilität" und "array
 
mache aus deinen var typ einfach:
Delphi-Quellcode:
var nachtwaechter:array[1..7] of tnachtwaechter;

Phoenix 23. Jan 2004 12:36

Re: Frage zu "Typenkompatibilität" und "array
 
Zitat:

Zitat von kiar
mache aus deinen var typ einfach:
Delphi-Quellcode:
var nachtwaechter:array[1..7] of tnachtwaechter;

Na, das will er ja nicht. Er will ja zum initialisieren mit einer Schleife durch und an anderen Stellen aber weiterhin mit der Enumeration darauf zugreifen. Das geht so freilich nicht.

Deswegen muss man da einen Umweg über die RTTI nehmen.

kiar 23. Jan 2004 12:41

Re: Frage zu "Typenkompatibilität" und "array
 
hallo phoenix,

ist ja richtig, mir ging es genau wie dir, bloß war ich ein wenig langsamer :lol:

raik

barnti 23. Jan 2004 12:51

Re: Frage zu "Typenkompatibilität" und "array
 
Hi phoenix,

ich habe Dein Beispiel zwar gefunden, leider aber nicht ganz durchschaut. Ist es möglich, dass Du mir Beispielcode dazuschreibst? Ich weiß so einfach nicht, wie ich über das Array iterieren soll?! Sorry!

Danke & Gruß,

Barnti

Phoenix 23. Jan 2004 12:59

Re: Frage zu "Typenkompatibilität" und "array
 
Ist eigentlich ganz einfach:

Delphi-Quellcode:
var
  i: integer;
begin
  for i := ord( low( TWochenTag ) ) to
           ord( high( TWochenTag ) ) do
  begin
    // i geht vom ersten bis zum letzten Element durch
  end;
end;
Schau dazu auch mal in die Onlinehilfe zum Thema "TypeInfo".

barnti 23. Jan 2004 13:09

Re: Frage zu "Typenkompatibilität" und "array
 
Hallo,
also irgentwie ist mir das nicht ganz klar. Vielleicht muss ich noch mal ausholen:

Delphi-Quellcode:
var
  i: integer;
begin
  for i := ord( low( TWochenTag ) ) to
           ord( high( TWochenTag ) ) do
  begin
    Nachtwaechter[i].Name     //Hier ist das Problem. Ich muss irgentwie über das Array
                              // iterieren. So geht es nicht. Enum-Typ gefordert
  end;
end;
Wie iteriere ich hier über das Array "Nachtwaechter", so dass ich alle Positionen beschreiben kann?

Gruß,

Barnti

Jens Schumann 23. Jan 2004 13:15

Re: Frage zu "Typenkompatibilität" und "array
 
Hallo,
wo ist denn das Problem ?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iCnt : TWochentag;
  Nachtwaechter: Array[TWochenTag] of TNachtwaechter;
begin
  For iCnt:=Montag to Sonntag do
    Nachtwaechter[iCnt].Nachname:='Problem gelöst';
end;

Phoenix 23. Jan 2004 13:19

Re: Frage zu "Typenkompatibilität" und "array
 
Du castest das i einfach als TWochentag:
Delphi-Quellcode:
for i ... to ... do begin
   Nachtwachter[TWochentag(i)].Name := 'xxx';
end;

barnti 23. Jan 2004 13:21

Re: Frage zu "Typenkompatibilität" und "array
 
Hallo Jens,

Tja, warum einfach, wenns auch kompliziert geht?! Danke! Das Brett war (etwas) dicker.

Tschau & Danke an alle Beteiligten,

Barnti

barnti 23. Jan 2004 14:01

Re: Frage zu "Typenkompatibilität" und "array
 
Jetzt ist mir doch noch etwas eingefallen:

Ich möchte mein Array[TWochentag] of Nachtwaechter über eine Variable in Form eines Strings ansprechen:

Delphi-Quellcode:
function GetName(Wochentag: String): String;
begin
  result:= Nachtwaechter[Wochentag].name;    // so leider nicht
end;
Ich brauche für einen übergebenen Parameter, gezwungener Maßen ein String, den Inhalt des Records. Geht das mit einem Cast-Operator?
So in etwa:

[/delphi]
result:= Nachtwaechter[TWochentag(Wochentag)].Name
[delphi]

Kann jemand helfen?

Gruß,

Barnti

Phoenix 23. Jan 2004 14:04

Re: Frage zu "Typenkompatibilität" und "array
 
Jetzt guckst Du bitte mal hier: klick!

Da steht, wie Du die einzelnen Strings der WOchentage in eine Stringlist bekommst.
Du musst nun die Benutzereingabe (am besten über eine Listbox, geht aber auch als normaler String) in den Index auflösen. Bei der LIstbox hast Du das durch den Itemindex, bei einem normalen String musst Du halt selber vergleichen.

Den index castet Du als TWochentag und gut ist :)

barnti 23. Jan 2004 14:10

Re: Frage zu "Typenkompatibilität" und "array
 
Danke! So isses auch gut jetzt...

Gruß,

Barnti

Robert Marquardt 23. Jan 2004 19:01

Re: Frage zu "Typenkompatibilität" und "array
 
Delphi-Quellcode:
VAR
  Nachtwaechter: array [TWochenTag] of TNachtwaechter;
  I: TWochenTag;
begin
  for I := Low(TWochenTag) to High(TWochenTag) do
    List[Ord(I)]
Enumerationen sind ordinale Typen und Schleifen funktionieren mit ordinalen Typen.
Ord(I) liefert die Werte 0 bis 6 in der Schleife


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