Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Festes Array zur Laufzeit füllen (https://www.delphipraxis.net/189661-festes-array-zur-laufzeit-fuellen.html)

0x92 6. Jul 2016 15:45

Delphi-Version: XE7

Festes Array zur Laufzeit füllen
 
Hallo ich würde gerne ein Array zur Laufzeit erstellen das bereits entsprechende Werte in sich trägt.

Als Veranschaulichung eine kleine Grafik

http://i.imgur.com/tiuR9Ws.png


Also in der ersten Spalte Buchstaben und in der zweiten Nummern aber als String.

TestArray: array[1..26, 1..26] of String =
(('A','6'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('B','12'),
('C','18'));

Das scheint leider nicht zu klappen. Ich möchte die Werte im Array bereits vorab belegen also nicht dynamisch. Wer hilft mir :p?

Neutral General 6. Jul 2016 15:58

AW: Festes Array zur Laufzeit füllen
 
Du brauchst ein Array[1..26, 1..2] of String.
Du hast ja pro Buchstabe (26) nur 2 (nicht 26) Strings: Buchstabe und Zahl.

Du kannst dieses Array im Quelltext als Konstante deklarieren:
Delphi-Quellcode:
const
  TestArray: array[1..26,1..2] of String = (('A','1'), ('B', '2'), ('C', '3'), ...);
Eine Array-Variable kannst du dynamisch (z.B. per Buttonklick o.ä.) nicht über diese Syntax füllen.
Da muss dann ne Schleife o.ä. her.

TiGü 6. Jul 2016 15:58

AW: Festes Array zur Laufzeit füllen
 
Hallo und willkommen in der DP!

Es ist in unseren Forum üblich, den genauen Fehler zu benennen und nicht nur "es geht nicht".

Delphi-Quellcode:
const
  TestArray: array [1 .. 27, 1 .. 2] of String =
    (
    ('A', '6'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('C', '18')
    );

himitsu 6. Jul 2016 17:37

AW: Festes Array zur Laufzeit füllen
 
Alternativ ginge auch ein
Delphi-Quellcode:
Array[1..27] of Record
, wenn man die Zahl gern als Zahl Integer haben möchte.
Zählen müsste man können, wobei XE7 in der Fehlermeldung sogar die richtige Anzahl nennen sollte.


Sonst wurde noch bissl was erwähnt.
"Das scheint leider nicht zu klappen" ist keine Fehlerbeschreibung, aber da kann man gern die Fehlermeldungen kopieren (Strg+C) funktioniert in den Compiler-Meldungen (Log) und auch bei Dialogen (kopiert den Inhalt als Text).
Und Bilder bitte an den Post anhängen, denn wenn in 2 Jahren jemand den Thread findet, ist das externe Bild bestimmt nicht mehr da und dem Post somit fehlen Informationen.

0x92 7. Jul 2016 14:01

AW: Festes Array zur Laufzeit füllen
 
Zitat:

Zitat von TiGü (Beitrag 1342092)
Hallo und willkommen in der DP!

Es ist in unseren Forum üblich, den genauen Fehler zu benennen und nicht nur "es geht nicht".

Delphi-Quellcode:
const
  TestArray: array [1 .. 27, 1 .. 2] of String =
    (
    ('A', '6'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('B', '12'),
    ('C', '18')
    );

Vielen Dank auch an die anderen 2 Benutzer der DP

Der Fehler lautete "[dcc32 Fehler] uMain.pas(22): E2072 Anzahl der Elemente (2) weicht von der Deklaration (26) ab"

@himitsu Ich benutze imgur als Imagehoster sehr unwahrscheinlich, dass die demnächst dicht machen die wirds noch ne Weile geben

Stevie 7. Jul 2016 15:42

AW: Festes Array zur Laufzeit füllen
 
Ausgehend von der Grafik würd ich ja ein
Delphi-Quellcode:
array[1..26] of Char
vorschlagen.

p80286 7. Jul 2016 20:56

AW: Festes Array zur Laufzeit füllen
 
[QUOTE=0x92;1342162]
Zitat:

Zitat von TiGü (Beitrag 1342092)
Der Fehler lautete "[dcc32 Fehler] uMain.pas(22): E2072 Anzahl der Elemente (2) weicht von der Deklaration (26) ab"

Wenn ich die Fehlermeldung richtig interpretiere sollte es so eigentlich funktionieren:
Delphi-Quellcode:
const
  TestArray: array [1 .. 27, 1 .. 2] of String =
    (
    ('A', 'B','B'.....'C'),
    ('6', '12','12'....'18')
     );
Aber vielleicht ist ein
Delphi-Quellcode:
Array of record
doch die bessere Wahl?

Gruß
K-H

0x92 8. Jul 2016 09:17

AW: Festes Array zur Laufzeit füllen
 
[QUOTE=p80286;1342200]
Zitat:

Zitat von 0x92 (Beitrag 1342162)
Zitat:

Zitat von TiGü (Beitrag 1342092)
Der Fehler lautete "[dcc32 Fehler] uMain.pas(22): E2072 Anzahl der Elemente (2) weicht von der Deklaration (26) ab"

Wenn ich die Fehlermeldung richtig interpretiere sollte es so eigentlich funktionieren:
Delphi-Quellcode:
const
  TestArray: array [1 .. 27, 1 .. 2] of String =
    (
    ('A', 'B','B'.....'C'),
    ('6', '12','12'....'18')
     );
Aber vielleicht ist ein
Delphi-Quellcode:
Array of record
doch die bessere Wahl?

Gruß
K-H

Fand die Lösung mit dem Array of Record am schönsten vom Zugriff her

Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMainForm = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ResultMemo: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure InitalizeEnglishGematriaArray;
    function CalculateValue(Str: String): Integer;
    function GetGematriaValuefromChar(Chr: Char): Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TEnglishGematria = record
    Buchstabe: Char;
    Wert: Integer;
  end;

var
  MainForm: TMainForm;
  EnglishGematriaArray : Array[0..25] of TEnglishGematria;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);
begin
  CalculateValue(Edit1.Text);
end;

function TMainForm.CalculateValue(Str: String): Integer;
var
  Target:      String;
  TargetLength: Integer;
  i:           Integer;
  CharValue:   Integer;
begin
  ResultMemo.Clear;
  CharValue := 0;
  Result := 0;

  Target := UpperCase(Str);
  TargetLength := Length(Target);

  for i := 1 to TargetLength do
  begin
    CharValue := GetGematriaValuefromChar(Target[i]);
    ResultMemo.Lines.Add('    ' + Target[i] + ' ' + IntToStr(CharValue));
    Result := Result + CharValue;
  end;

  Result := Result;
  ResultMemo.Lines.Add('+----------+');
  ResultMemo.Lines.Add('    ' + IntToStr(Result));
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  InitalizeEnglishGematriaArray;
end;

function TMainForm.GetGematriaValuefromChar(Chr: Char): Integer;
var
  i: Integer;
begin
  if (Chr = #0) OR (Chr = '') OR (Chr = ' ') then
  begin
    Result := 0;
  end
  else
  begin
    for i := 0 to 26  do
      begin
        if Chr = EnglishGematriaArray[i].Buchstabe then
        begin
          Result := EnglishGematriaArray[i].Wert;
          Exit;
        end;
      end;
  end
end;

procedure TMainForm.InitalizeEnglishGematriaArray;
begin
  EnglishGematriaArray[0].Buchstabe := 'A';
  EnglishGematriaArray[0].Wert := 6;

  EnglishGematriaArray[1].Buchstabe := 'B';
  EnglishGematriaArray[1].Wert := 12;

  EnglishGematriaArray[2].Buchstabe := 'C';
  EnglishGematriaArray[2].Wert := 18;

  EnglishGematriaArray[3].Buchstabe := 'D';
  EnglishGematriaArray[3].Wert := 24;

  EnglishGematriaArray[4].Buchstabe := 'E';
  EnglishGematriaArray[4].Wert := 30;

  EnglishGematriaArray[5].Buchstabe := 'F';
  EnglishGematriaArray[5].Wert := 36;

  EnglishGematriaArray[6].Buchstabe := 'G';
  EnglishGematriaArray[6].Wert := 42;

  EnglishGematriaArray[7].Buchstabe := 'H';
  EnglishGematriaArray[7].Wert := 48;

  EnglishGematriaArray[8].Buchstabe := 'I';
  EnglishGematriaArray[8].Wert := 54;

  EnglishGematriaArray[9].Buchstabe := 'J';
  EnglishGematriaArray[9].Wert := 60;

  EnglishGematriaArray[10].Buchstabe := 'K';
  EnglishGematriaArray[10].Wert := 66;

  EnglishGematriaArray[11].Buchstabe := 'L';
  EnglishGematriaArray[11].Wert := 72;

  EnglishGematriaArray[12].Buchstabe := 'M';
  EnglishGematriaArray[12].Wert := 78;

  EnglishGematriaArray[13].Buchstabe := 'N';
  EnglishGematriaArray[13].Wert := 84;

  EnglishGematriaArray[14].Buchstabe := 'O';
  EnglishGematriaArray[14].Wert := 90;

  EnglishGematriaArray[15].Buchstabe := 'P';
  EnglishGematriaArray[15].Wert := 96;

  EnglishGematriaArray[16].Buchstabe := 'Q';
  EnglishGematriaArray[16].Wert := 102;

  EnglishGematriaArray[17].Buchstabe := 'R';
  EnglishGematriaArray[17].Wert := 108;

  EnglishGematriaArray[18].Buchstabe := 'S';
  EnglishGematriaArray[18].Wert := 114;

  EnglishGematriaArray[19].Buchstabe := 'T';
  EnglishGematriaArray[19].Wert := 120;

  EnglishGematriaArray[20].Buchstabe := 'U';
  EnglishGematriaArray[20].Wert := 126;

  EnglishGematriaArray[21].Buchstabe := 'V';
  EnglishGematriaArray[21].Wert := 134;

  EnglishGematriaArray[22].Buchstabe := 'W';
  EnglishGematriaArray[22].Wert := 138;

  EnglishGematriaArray[23].Buchstabe := 'X';
  EnglishGematriaArray[23].Wert := 144;

  EnglishGematriaArray[24].Buchstabe := 'Y';
  EnglishGematriaArray[24].Wert := 150;

  EnglishGematriaArray[25].Buchstabe := 'Z';
  EnglishGematriaArray[25].Wert := 156;
end;

Mavarik 8. Jul 2016 10:14

AW: Festes Array zur Laufzeit füllen
 
Nee nicht so kompliziert...

Delphi-Quellcode:
type
   TEnglishGematria = record
     Buchstabe: Char;
     Wert: Integer;
   end;

Const
   EnglishGematriaArray : Array[0..25] of TEnglishGematria = ((Buchstabe:'A';Wert:6),
                                                              (Buchstabe:'B';Wert:12),
                                                               ...
                                                              (Buchstabe:'Z';Wert:156));

p80286 8. Jul 2016 12:09

AW: Festes Array zur Laufzeit füllen
 
Zitat:

Zitat von Mavarik (Beitrag 1342218)
Nee nicht so kompliziert...

das halte ich aber für einen Euphemismus.
Die Syntax für eine
Delphi-Quellcode:
const Array of record
ist ja nun nicht soo eingängig.
(aber immer noch besser als die ursprüngliche Version)


Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.
Seite 1 von 2  1 2      

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