Announcement

Collapse
No announcement yet.

Listen und Pointer

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

  • Listen und Pointer

    Wie kann man anhand eines Pointers aus einen Record Elemente des Records erhalten?
    Ich habe folgendes Record definiert:

    person = record
    name:string;
    nummer:integer;
    end;

    person1erson;

    nun der pointer:

    p = addr(person1);

    Und nun das Problem: Wie kann ich von p ausgehend den Namen der Person erhalten?
    Ich habe es mit p^.name probiert, es erscheint aber eine Fehlermeldung (Record, Klasse oder Objekttyp erforderlich oder so ähnlich).

  • #2
    Hallo Christian,<p>
    probier mal folgendes: (im Type-Abschnitt, wo du auch den Record definierst) <br>
    type<br>
    person = record<br>
    name:string;<br>
    nummer:integer;<br>
    end;<br>
    PPerson = ^person;<br>
    Damit definierst du einen neuen Datentyp, nämlich einen Zeiger vom Typ: Zeiger auf Record Person. Anschließend im Implementation-Abschnitt, innerhalb einer Funktion: (nur so als Beispiel) <br>
    procedure TForm1.Button1Click(Sender: TObject);<br>
    var<br>
    person1: person;<br>
    P: PPerson; // Zeiger definieren<br>
    begin<br>
    P := @person1; // Zeiger initialisieren<br>
    P.name := 'Heinz';<br>
    Edit1.Text := P.name;<br>
    end;<p>
    Gruß<p>
    Wolfgang Rolle

    Comment


    • #3
      Soweit so gut, erst einmal vielen Dank.
      Nun habe ich aber das Problem, daß ich, nachdem ich den Pointer in einer Liste abgespeichert habe, (var Kartei:TList; Kartei.items.add(P)), nach dem Zugriff (P := Kartei.items[0] nicht auf den Namen der Person zugreifen kann. P.name ist dann leer

      Comment


      • #4
        Hi Christian,

        ich hab das in einer Anwendung so gelöst:
        Hab allerdings in meinem Fall eine ArtNr in eine ListBox als Objekt übergeben. Daher mußt du das halt mal ausprobieren, ob´s so geht.

        { Tmyo structure }
        type

        tmyo = record

        arnr: string[7]

        end;

        tpmyo = ^tmyo;

        var pmyo : tpmyo;

        procedure Form.BtnNamenClick(TObject: Sender);

        var ArtNr : String;

        begin

        ArtNr := tpmyo(TObject(LbxArtikel.Items.Objects[LbxArtikel.ItemIndex]))^.arnr;

        Edit1.Text := ArtNr;

        end;

        mfg
        Björ

        Comment


        • #5
          Hi Christian,

          ich hab das in einer Anwendung so gelöst: Hab allerdings in meinem Fall eine ArtNr in eine ListBox als Objekt übergeben. Daher mußt du das halt mal ausprobieren, ob´s so geht.

          { Tmyo structure }<br>
          type <br>
          tmyo = record <br>
          arnr: string[7] <br>
          end; <br>
          tpmyo = ^tmyo; <br>

          var pmyo : tpmyo;

          procedure Form.BtnNamenClick(TObject: Sender); <br>
          var ArtNr : String; <br>
          begin <br>
          ArtNr := tpmyo(TObject(LbxArtikel.Items.Objects[LbxArtikel.ItemIndex]))^.arnr; <br>
          Edit1.Text := ArtNr; <br>
          end;

          mfg Björ

          Comment


          • #6
            Hi

            Dein Pointer P: PPerson wurde mit einem im NUR lokal gültigen Record "person1" initialisiert. D.h. das P nur innerhalb dieser Funktion auf einen gültigen TPerson Record zeigt. Nach dem Rücksprung aus Deiner Funktion wird der Stack freigeben, und somit auch der TPerson record "Person1".
            Abhilfe schafft nur die Allozierung des TPerson-Record im Speicher.

            <pre>

            var
            P: PPerson;
            begin
            P := New(TPerson);
            P.Name := '...';
            List.Add(P);
            end;

            </pre>

            Aber NICHT vergessen diese dynamischen Records wieder freizugeben mit

            <pre>

            procedure ClearList(List: TList);
            var
            I: Integer;
            P: PPerson;
            begin
            for I := 0 to List.Count-1 do
            begin
            P := List[I];
            ReallocMem(P, 0);
            end;
            List.Clear;
            end;

            </pre>

            Eleganter wäre diesen TPerson Record als Object zu definieren

            <pre>

            type
            TPerson = class(TObject)
            public
            Name: String;
            Anschrift: String;
            end;

            </pre>

            Gruß Hage

            Comment


            • #7
              Danke

              Comment

              Working...
              X