Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array of Record - Einzelne Fixe Elemente? (https://www.delphipraxis.net/114279-array-record-einzelne-fixe-elemente.html)

Real-TTX 22. Mai 2008 18:45


Array of Record - Einzelne Fixe Elemente?
 
Hey,

Ist es möglich dass ich einem Array von einem Record ein festen Wert zuweise ?

Mein Record :
Delphi-Quellcode:
  Values = record
    ValueFrom : string;
    ValueFromType : string;
    ValueTo : string;
    ValueToType : string;
    ValueSectionA : string;
    ValueSectionB : string;
    ValueSectionC : string;
    ValueSectionD : string;
  end;
Und so greife ich drauf zu:
Delphi-Quellcode:
Value[0].ValueFrom := '0,5';
...
Value[1].ValueFrom := '01';
...

Edit1.Text := Value[0].ValueFrom;
etc.... Aber ich habe pro Record eine feste Bezeichnung.

Ich will zb "Value.Name" benutzen können ? Es ist ja ein Array of Record. Aber das Array of Record soll auch ein einzelnen Wert haben, der auserhalb der Liste/ dem Array liegt. Ist das möglich?

Ich hoffe ihr konntet mir folgen....

LG, Real-TTX

Klaus01 22. Mai 2008 18:58

Re: Array of Record - Einzelne Fixe Elemente?
 
Zitat:

Zitat von Real-TTX
Ich hoffe ihr konntet mir folgen....

Ehrlich gesagt, nein ich konnte Dir nicht folgen.
Hast Du vielleicht mal ein Beispiel wie Du dir das vorstellst?

Grüße
Klaus

sx2008 22. Mai 2008 19:05

Re: Array of Record - Einzelne Fixe Elemente?
 
Verwende doch eine Aufzählung:
Delphi-Quellcode:
TWert = (wNetwerk, wWLAN, wHauptspeicher, wScreenX, wScreenY); // die Aufzählung
TValues = record // Datentypen sollen immer mit T.... beginnen !
    ValueFrom : string;      // vielleicht sollte man hier den Prefix "Value" weglassen; zuviel Schreibarbeit
    ValueFromType : string;
    ValueTo : string;
    ValueToType : string;
    ValueSectionA : string;
    ValueSectionB : string;
    ValueSectionC : string;
    ValueSectionD : string;
  end;

TValueArray = array[wNetzwerk..wScreenX] of TValues;
var
  MyValues : TValueArray;
...
  MyValues[wWLAN].ValueFrom := '1 MBit';
  MyValues[wWLAN].ValueTo  := '54 MBit';

Real-TTX 22. Mai 2008 20:29

Re: Array of Record - Einzelne Fixe Elemente?
 
Naja, ich weis nicht genau wie ich das lösen soll. Ich Programmier noch nicht so lange in Pascal/Delphi.

Ich habe eine Funktion. Diese liest mir Sämtliche Werte aus einer XML Datei aus. Vorgegebene Anzahl etc. Ein Fester Wert wäre: Der Name. Nun dachte ich dass ich den Typ "Array of TValues"(Ist eine Wertetabelle) nehme für diese Funktion.Nun will ich ein Record haben. Zb:

Werte[0].From ... Werte[0].SectionD ... etc

Desweiteren noch "Werte.Name" ...

Ohne dass ich auf ein Array Element zugreifen muss... ? Ich weis echt nicht wie ich es anders erklären kann :/

Gruß

rollstuhlfahrer 22. Mai 2008 20:34

Re: Array of Record - Einzelne Fixe Elemente?
 
Ich glaub, ich habs verstanden. Guck dir mal den Quellcode in Delphi für TStrings/TStringlist an.
Du brauchst ein Objekt, das eine Property als DEFAULT hat. So kannst du deine Abfragen mit [0],[1],... und gleichzeitig auch mit .name; .xxx machen

rollstuhlfahrer

himitsu 22. Mai 2008 20:38

Re: Array of Record - Einzelne Fixe Elemente?
 
ein Name pro Array-Element?

also warum dann nicht in dem Record?

Code:
Values = record
    [b]Name : string;[/b]
    ValueFrom : string;
    ValueFromType : string;
    ValueTo : string;
    ValueToType : string;
    ValueSectionA : string;
    ValueSectionB : string;
    ValueSectionC : string;
    ValueSectionD : string;
  end;
Delphi-Quellcode:
Werte[0].Name

Christian Seehase 22. Mai 2008 20:39

Re: Array of Record - Einzelne Fixe Elemente?
 
Moin sx2008,

kleiner Vorschlag zur Vereinfachung.

Statt
Delphi-Quellcode:
TWert = (wNetwerk, wWLAN, wHauptspeicher, wScreenX, wScreenY); // die Aufzählung

TValueArray = array[wNetzwerk..wScreenX] of TValues;
kann man es auch so

Delphi-Quellcode:
TWert = (wNetwerk, wWLAN, wHauptspeicher, wScreenX, wScreenY); // die Aufzählung
TValueArray = array[TWert] of TValues;
schreiben.

Vorteil:
Ändere ich was an TWert, brauche ich bei der Array-Deklaration nichts zu ändern.

rollstuhlfahrer 22. Mai 2008 20:43

Re: Array of Record - Einzelne Fixe Elemente?
 
und was ist mit meinem Objekt wie TStrings??

Zitat:

Zitat von Real-TTX
Werte[0].From ... Werte[0].SectionD ... etc

Trifft zu

Zitat:

Zitat von Real-TTX
Desweiteren noch "Werte.Name" ... (<- Add: hier keine Arraystruktur)

Das auch

Gruß

Real-TTX 22. Mai 2008 20:52

Re: Array of Record - Einzelne Fixe Elemente?
 
Wie würde dass denn mit TStrings gehen, wenn man fragen darf ? Ich habe mir das mal angeschaut, aber verstehe ich das noch nicht so ganz :/ :wall:

Gruß

Real-TTX 22. Mai 2008 20:56

Re: Array of Record - Einzelne Fixe Elemente?
 
Ein Name Pro Array und nicht Record aus dem einfach Grund dass es sich um auslesen einer Wertetabelle handelt. Diese Tabelle hat IMMER 4 (mit Header 5) Zeilen. Die Werte lese ich aus. Und diese Tabelle hat ein Name und nicht die einzelnen Spalten. Zb Name der Tabelle "DIN ISO 2768 T1"... Genau das ist mein Problem, ich will diesen Name nicht jedem Record zuweisen... Ich denke "rollstuhlfahrer" hat dies verstanden :P

Gruß, Real-TTX

rollstuhlfahrer 22. Mai 2008 20:59

Re: Array of Record - Einzelne Fixe Elemente?
 
Delphi-Quellcode:
  TValues = class(TPersistent) // oder was auch immer
  private
    xxx: array of TValue; // dein Record
    fName: string;
  protected
    function Get(Index: Integer): string; virtual; abstract;
    procedure Put(Index: Integer; const S: string); virtual;
  public
    property Strings[Index: Integer]: string read Get write Put; default;
    property Name: String read fName write fName;
  end;
ungefähr so

oki 22. Mai 2008 21:19

Re: Array of Record - Einzelne Fixe Elemente?
 
Hi,

du kannst es auch mit einer TObjectList machen. Dabei benutzt du nicht den Record als einzelnes Element, sondern eine eigene Klasse. Etwa so:

Delphi-Quellcode:
TValue = class(TObject)
    ValueFrom : string;
    ValueFromType : string;
    ValueTo : string;
    ValueToType : string;
    ValueSectionA : string;
    ValueSectionB : string;
    ValueSectionC : string;
    ValueSectionD : string;
  end;
Das kannst du dann noch mit diversen Propertys, Getter- und Settermethoden ausschmücken.

Dann verwendest du eine ObjectListe wie folgt:
Delphi-Quellcode:
TValueList = class(TObjectList)
  private
    FListName : String; // Name der Liste
  protected
    function GetItem(Index: Integer): TValue;
    procedure SetItem(Index: Integer; AObject: TValue);
  public
    function Add(AObject: TValue): Integer;
    function Extract(Item: TValue): TValue;
    function Remove(AObject: TValue): Integer;
    function IndexOf(AObject: TValue): Integer;
    procedure Insert(Index: Integer; AObject: TValue);
    function First: TValue;
    function Last: TValue;
    property Items[Index: Integer]: TValue read GetItem write SetItem; default;
    property ListName : String read FListName write FListName;
  end;

{ TValueList }

function TValueList.Add(AObject: TValue): Integer;
begin
  Result := inherited Add(AObject);
end;

function TValueList.Extract(Item: TValue): TValue;
begin
   Result := TValue(inherited Extract(Item));
end;

function TValueList.First: TValue;
begin
   Result := TValue(inherited First);
end;

function TValueList.GetItem(Index: Integer): TValue;
begin
  Result := TValue(inherited GetItem(Index));
end;

function TValueList.IndexOf(AObject: TValue): Integer;
begin
  Result := inherited IndexOf(AObject);
end;

procedure TValueList.Insert(Index: Integer; AObject: TValue);
begin
  inherited Insert(Index, AObject);
end;

function TValueList.Last: TValue;
begin
  Result := TValue(inherited Last);
end;

function TValueList.Remove(AObject: TValue): Integer;
begin
  Result := inherited Remove(AObject);
end;

procedure TValueList.SetItem(Index: Integer; AObject: TValue);
begin
  inherited SetItem(Index, AObject);
end;
Gruß oki

Khabarakh 22. Mai 2008 21:41

Re: Array of Record - Einzelne Fixe Elemente?
 
@Real-TTX:
Wenn dir rollstuhlfahrers Klasse zu hoch ist, was sicherlich keine Schande ist (mir gehts auch so *g* ... bin mir z.B. nicht sicher, was er mit dem abstrakten Getter bezweckt), kannst du es dann nicht einfach so machen?
Delphi-Quellcode:
TContainer = record
  Values: array of TValues; //würde ich in TValue umbenennen, bei Pluralen denke ich an Listen
  Name: string; //sollte man vielleicht auch noch umbenennen ^^
end
Sieht dann von der Syntax nicht genau wie gewollt aus, aber insgesamt ist es glaube ich doch, was du willst :zwinker: :
Delphi-Quellcode:
container.Name := ...;
container.Values[i].ValueFrom := ...;
@oki:

oki 22. Mai 2008 22:05

Re: Array of Record - Einzelne Fixe Elemente?
 
Ich hab mal eher das Gefühl, das das Absract bei Rollstuhlfahrer ein Copy and Waste - Fehler ist. Macht da eigentlich keinen Sinn.
Das mit dem Array sieht auf den ersten Blick immer einfacher aus, will man dann aber einzelne Elemente an beliebiger Position in das Array einfügen oder löschen schreibt man schnell alles neu was die ObjectList mitbringt.

Gruß oki

Real-TTX 23. Mai 2008 16:04

Re: Array of Record - Einzelne Fixe Elemente?
 
Danke an alle :) Habt mir sehr geholfen... Ich denke ich mach es über eine Klasse ;)

Gruß, Real-TTX


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz