Announcement

Collapse
No announcement yet.

Array / offenes Array zuweisen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Array / offenes Array zuweisen

    Hallo zusammen, ich habe irgendwie ein Problem zwischen den Ohren, ich habe folgende Deklarationen:
    <p><pre>
    TTextRec = record
    name : String;
    von : Integer;
    bis : Integer;
    feld : TField;
    wert : String;
    write : Boolean;
    end;
    TTextArray = Array of TTextrec;

    TButtonRec = Record
    name : String;
    importCB : TCheckBox;
    edit : Boolean;
    editCB : TCheckBox;
    startBtn : TSpeedButton;
    lastDT : TLabel;
    impRec : Array of TTextRec;
    end;
    </pre><p>
    Soweit, so gut, jetzt möchte ich gerne bei Übergabe eines Statischen Arrays ein Dynamisches erzeugen:<p><pre>
    procedure initTextArray(const tt: TAdsTable; const tVon: Array of TTextRec);
    var i, x : Integer;
    begin
    setLength(impArray, High(tVon)+1);
    x := 0;
    for i := 0 to High(tVon) do begin
    Assert(tVon[i].name <> '', 'initTextArray: '+tt.TableName+', Eintrag '+inttostr(i)+' leerer Name');
    Assert(x < tVon[i].von, 'initTextArray: '+tt.TableName+', Eintrag '+inttostr(i)+' von < bis davor');
    Assert(tVon[i].bis >= tVon[i].von, 'initTextArray: '+tt.TableName+', Eintrag '+inttostr(i)+' von: '+inttostr(tVon[i].von)+' bis: '+inttostr(tVon[i].bis));
    impArray[i].name := tVon[i].name;
    impArray[i].von := tVon[i].von;
    impArray[i].bis := tVon[i].bis;
    impArray[i].feld := tt.FindField(impArray[i].name);
    impArray[i].wert := '';
    impArray[i].write := true;
    x := impArray[i].bis;
    Assert(impArray[i].feld <> nil, 'initTextArray: '+tt.TableName+', Feld '+tVon[i].name+' nicht gefunden');
    // Assert(tVon[i].bis - tVon[i].von +1 <= impArray[i].feld.DataSize, 'initTextArray: '+tt.TableName+', Feld '+tVon[i].name+' zu klein');
    end;
    end;
    </pre></p>
    Mit dem Aufruf initTextArray(stamm, stammDef);
    klappt das wunderbar, warum funktioniert dan aber die Zuweisung mainButtons[0].impRec := stammDef; nicht, immerhin ist der Eintrag in diesem Record (TButtonRec) genauso wie obiger 2ter Procedur Parameter als Array of TTextRec deklariert, bei der Zuweisung meckert der Compiler aber über inkompatible Typen.

  • #2
    Welchen Typ hat denn "stammDef"?<br>Uli

    Comment


    • #3
      stammdeff ist ein konstantes array[0..xx] of TTextRec, also mit werten definiert..

      Comment


      • #4
        Dann musst du noch eine neue Typ einführen, z.b. TStammArray = array[0..255] of TStammRecord. Nun werden in beiden Records die array[] of TStamm durch diesen Typ ersezt. Ab diesem Moment sind beide arrays Typkompatibel.
        Vorher, bei deiner Deklaration, waren die beiden arrays[] NICHT typkompatibel da sie KEINEN Typ hatten.

        Gruß Hage

        Comment


        • #5
          Hmm, also wirklich verstehen kann ich das nicht, wieso ist denn in der Deklaration der procedure initTextArray der Teil tVon: Array of TTextRec); kein Typ und wieso kann ich bei gleicher (nicht?) Deklaration diese Procedure mit dem statischen array als parameter aufrufen, diesen aber nicht einem gleichlautenden Eintrag in einem Record zuweisen? 2.tes Problem: Sinn soll es sein, hier verschiedene statische Arrays zu übergeben, die der übersichthalber alle als konstante Arrays deklariert sind, wenn ich da überall eine feste länge (die des längsten) ausfüllen müsste wäre wieder übersicht dahin.

          Gruß Karste

          Comment


          • #6
            Dann musst du bei solchen Arrays jedes Element einzeln kopieren.

            Gruß Hage

            Comment

            Working...
            X