Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Startwerte bei Records einstellen. (https://www.delphipraxis.net/105699-startwerte-bei-records-einstellen.html)

snow 27. Dez 2007 22:29


Startwerte bei Records einstellen.
 
hallo ich hab folgendes....

Delphi-Quellcode:
type TGAusrichtung = (normal,grad90,grad180,grad270);
type TGGleisstellung = (gerade, abzweig1, abzweig2, abzweig3);
  {eigenes record deklaieren}
type
    TGleisElement = record
      Gleiselement: -1..254;
      Ausrichtung : TGAusrichtung;
      Gleisstellung : TGGleisstellung;
end;
nun will ich den variablen in dem record einen startwert geben.

normalerweise geht das ja so

Delphi-Quellcode:
var
  i: Integer = 42;
aber leider nicht bei mir. Geht das bei records nicht oder bei typisierten variablen.

gruß snow

Namenloser 27. Dez 2007 22:40

Re: Startwerte bei Records einstellen.
 
Hi,

nei Records geht das imo nicht, aber du könntest stattdessen eine Klasse deklarieren und die Initialisierung im Construktor übernehmen.

Hawkeye219 27. Dez 2007 22:54

Re: Startwerte bei Records einstellen.
 
Hallo,

initialisierte Records lassen sich durchaus verinbaren:

Delphi-Quellcode:
var
  Element : TGleisElement = (
    GleisElement : 42;
    Ausrichtung  : grad90;
    Gleisstellung : gerade
  );
Diese Art der Initialisierung ist bei Variablen nur möglich, wenn sie global vereinbart werden. Konstanten lassen sich auch initialisieren, wenn sie lokal vereinbart werden. In beiden Fällen findet die Initialisierung nur einmal statt, nämlich beim Start der Anwendung.

Gruß Hawkeye

PaddyL 27. Dez 2007 22:58

Re: Startwerte bei Records einstellen.
 
Dürfte sicher auch irgendwo ind er Hilfe/im Netz stehen, aber hier:

Delphi-Quellcode:
type
  TMyRecord = record
    Int: Integer;
    Bool: Boolean;
  end;

var
  Test: TMyRecord = (Int: 0; Bool: True);

Dax 27. Dez 2007 23:08

Re: Startwerte bei Records einstellen.
 
Sowas wie das folgende, bei dem jede Variable/Konstante des Typs TGleisElement die angegebenen Werte hat, geht nicht, nur die Hawkeye gezeigt Variante funktioniert.
Delphi-Quellcode:
type TGAusrichtung = (normal,grad90,grad180,grad270);
type TGGleisstellung = (gerade, abzweig1, abzweig2, abzweig3);
  {eigenes record deklaieren}
type
    TGleisElement = record
      Gleiselement: -1..254 = -1;
      Ausrichtung : TGAusrichtung = normal;
      Gleisstellung : TGGleisstellung = gerade;
end;

fLaSh11 27. Dez 2007 23:17

Re: Startwerte bei Records einstellen.
 
Ich finde es witzig, dass der Compiler hierbei meckert:
Delphi-Quellcode:
type
  TRec = record
    a: integer;
    b: string;
    c: boolean;
  end;

procedure Blah(Rec1: TRec = (a: 1; b: 'huhu'; c: true));

snow 27. Dez 2007 23:22

Re: Startwerte bei Records einstellen.
 
hilft mir leider kaum.

Die variable ist private deklariert, und muss es auch bleiben. Außerdem ist es ein Array of TGleiselement.(dynamisch,2D).

muss ich es also beim start und bei veränderungen der größe überschreiben bzw die neuen einträge auf den startwert setzen.

gruß snow

Hawkeye219 27. Dez 2007 23:40

Re: Startwerte bei Records einstellen.
 
Immerhin kannst du ja zum Initialisieren einen konstanten Record benutzen:

Delphi-Quellcode:
procedure Setup;
const
  Startwert : TGleisElement = (
    GleisElement : -1;
    Ausrichtung  : normal;
    Gleisstellung : gerade
  );
var
  Gleise : array of TGleisElement;
  Index : Integer;
begin
  SetLength (Gleise, 100);

  for Index := Low(Gleise) to High(Gleise) do
    Gleise[Index] := Startwert;
end;
Die lokale Array-Variable ist hier natürlich nur ein (sinnloses) Beispiel, du wirst stattdessen deine private Variable verwenden.

Gruß Hawkeye

dominikkv 28. Dez 2007 06:18

Re: Startwerte bei Records einstellen.
 
Zitat:

Zitat von snow
Die variable ist private deklariert

Also ist sie ein Feld einer Klasse -> damit nur in einer Instanz gültig die durch einen Constructor erzeugt wurde...
Also kannst du im Constructor die initialisierung selbst übernehmen. Entweder benutzt du das entsprechende Ereignis (onFormCreate) oder du überschreibst den bisherigen.

snow 28. Dez 2007 11:15

Re: Startwerte bei Records einstellen.
 
und genau da liegt das problem....

Die Records befinden sich in einem Dynamischen 2 dimensionalen Array, dessen größe erst zur laufzeit feststeht. Somit kann ich nicht auf die records zugreifen, weil sie noch gar nicht exestieren.

ich muss also die records mit der vergrößern-procedure verknüpfen.

Gruß snow

dominikkv 28. Dez 2007 14:45

Re: Startwerte bei Records einstellen.
 
Zitat:

Zitat von snow
Die Records befinden sich in einem Dynamischen 2 dimensionalen Array, dessen größe erst zur laufzeit feststeht. Somit kann ich nicht auf die records zugreifen, weil sie noch gar nicht exestieren.

ich muss also die records mit der vergrößern-procedure verknüpfen.

aha!
du willst also das array beim vergrößern gleich mit Standartwerten füllen?

Dann kannst du dir ja eine eigene Methode schreiben...
Delphi-Quellcode:
type
  TMyGleisArray: Array of TGleisElement;

{...}

procedure SetLengthDef(Ar: TMyGleisArray, l: Integer);
var
  I, Start: Integer;
begin
  Start := Length(Ar);
  SetLength(Ar, l);
  for I := Start to Pred(l) do
    with Ar[I] do
      begin
        Gleiselement := 1;
        Ausrichtung := normal;
        Gleisstellung := gerade;
      end;
end;

snow 28. Dez 2007 18:41

Re: Startwerte bei Records einstellen.
 
ICh habs schon ohne vergrößern gelöst.

Es ging im prinzip nur um eine variable, die von -1 bis 254 ging. Mich hat geärgert, dass die am anfang auf 0 steht. Also hab ich das einfach verschoben...


hab jetz eine von 0..255 sprich ein Byte.

Trotzdem Danke

Gruß snow


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