Array in sich selbst verschachteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Array in sich selbst verschachteln

Beitrag von Mathias »

Ich wollte so etwas machen, aber da motzt der Compiler.

Code: Alles auswählen

type
  TMenuItems = array of record
    Caption: string;
    Command: integer;
    Items: TMenuItems;
  end;  

Code: Alles auswählen

wmmenu.pas(17,12) Error: Illegal expression
Es wäre zu schön gewesen, da hätte man folgendermassen in ein Element im Menu-Baum zugreifen können.

Code: Alles auswählen

var
  M:TMenuItems;
begin
  M[2].items[3].Caption := 'abc'
end; 
Jemand eine Gute Idee als Alternative ?
Auf diese Methode geht es

Code: Alles auswählen

type
  TMenuItems = record
    Caption: string;
    Command: integer;
    Items: array of TMenuItems;
  end;   
Dabei ist das erste Element erst bei Items anstelle schon bei Menutems.

Code: Alles auswählen

  SetLength(MenuItems.Items, 6);
  MenuItems.Items[0].Caption := '&Datei';
  SetLength(MenuItems.Items[0].Items, 8);
  MenuItems.Items[0].Items[0].Caption := '&Neu';
  MenuItems.Items[0].Items[0].Command := cmNewWindow;
  MenuItems.Items[0].Items[1].Caption := '&Oeffnen...';
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Array in sich selbst verschachteln

Beitrag von BeniBela »

Code: Alles auswählen

{$ModeSwitch advancedrecords}
type
  TMenuItem = record
    type TMenuItems = array of TMenuItem;
  public
    Caption: string;
    Command: integer;
    Items: TMenuItems;
  end;

Damit kann man dann memory leaks produzieren:

Code: Alles auswählen

var items: array of TMenuItem;
begin
  SetLength(items, 1);
  items[0].items := items;
end.   

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Array in sich selbst verschachteln

Beitrag von Winni »

Hi!

Da gibt's den uralten Trick von N. Wirth himself.

Für den Fall von Datenstruktur innerhalb der Datenstrultur selbst, gibt es die implizite
forward Definition mittles Pointer.

Also

Code: Alles auswählen

type
  PMenuItems = ^TMenuItems;

  TMenuItems = array of record
                            Caption: string;
                            Command: integer;
                            Items: PMenuItems;
  end; 
Da hast Du was Du möchtest. Fast.
Du musst nur sehen, dass Du noch genug Vorrat an ^ hast.

Winni

Antworten