Results 1 to 7 of 7

Thread: generic list van objecten

  1. #1

    generic list van objecten

    Hallo allemaal,

    Ik zit met het volgende probleem waarbij ik een generic list maak van een object.
    Als ik later de data probeer terug te lezen krijg ik onzin terug
    Hierbij een korte omschrijving van de beoogde werking

    Ik heb een TNCR object deze bevat een TNCRArtikel object.
    Bij het aanmaken van het TNCR object creëer in ook NCRArtikelen als een generic list.
    Code:
     NCRArtikelen := Tlist<TNCRArtikel>.Create;
    als ik op de knop druk moet de NCR gevuld worden met data en moeten er meerdere artikelen gemaakt worden
    hiervoor maak ik een tempArtikel aan dat ik vul met de artikel data
    Code:
    NCR:=TNCR.Create();
    NCR.ArtikelNr:='172T100';
    NCR.Aanvrager:=4266;
    NCR.datum:=formatdatetime('yyyymmdd', now);
    NCR.Afdeling:=200;
    NCR.Prod_order:=4170012;
    NCR.Omschrijving:='Dit is een test';
    NCR.SubAssy:=7;
    
    
    for i := 0 to 4-1 do
    begin
     tempArtikel:=TNCRArtikel.Create(0);
     TempArtikel.PijpNr:=i+16600;
     TemPArtikel.ArrayNr:=0;
     TemPArtikel.IDNr:=0;
     NCR.NCRArtikelen.Add(TempArtikel);
     tempArtikel.Free;
    end;
    Als ik hierna de data in NCR.NCRArtikelen wil terug lezen krijg ik alleen voor het eerste item data terug (weliswaar de laatste entry maar goed)
    Voor de overige items krijg ik onzin terug

    Code:
    for I := 0 to NCR.NCRArtikelen.Count-1 do
     showmessage(NCR.NCRArtikelen.Items[i].PijpNr.ToString);
    Blijkbaar doe ik iets fout en kloppen mijn pointers niet meer na het toevoegen van de data.
    Maar ik zie niet wat ik fout doe.

    hieronder de complete source van mijn test programma (de twee objecten en het formulier met de knop om het NCR object te vullen)

    Code:
    unit Unit2;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Generics.Collections, Vcl.StdCtrls;
    
    type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
     TNCRArtikel =  class(Tobject)
      private
       FNCR_ID:integer;
       FIDNr: integer;
       FPijpNr: integer;
       FArrayNr: integer;
       function Get_IsSaved: boolean;
      public
       Constructor Create(NCR_ID:integer);
       Destructor Destroy; override;
       Procedure Save;
      Published
       property PijpNr:integer read FPijpNr write FPijpNr;
       property ArrayNr:integer read FArrayNr write FArrayNr;
       property IDNr:integer read FIDNr write FIDNr;
       property IsSaved:boolean read Get_IsSaved;
     end;
    
     TNCR = class(Tobject)
      private
       FArtikelType:integer;
       AantalAut:integer;
       FProdOrder: integer;
       FNCR_ID: integer;
       FArtikelNr: string;
       Fstatus: integer;
       FDatum: string;
       FNCRNr: integer;
       FAanvrager: integer;
       FAfdeling: integer;
       FOmschrijving: String;
       FSubAssy: integer;
       procedure LoadNCR;
       procedure Set_ArtikelNr(const Value: string);
       procedure Set_Prodorder(const Value: integer);
       function Get_NewNCRNumber: string;
       function GetNCRNummer: string;
       procedure Set_NCR_ID(const Value: integer);
      public
       NCRArtikelen: Tlist<TNCRArtikel>;
       Constructor Create(ANCR_ID:integer); overload;
       Constructor Create; overload;
       Destructor Destroy; override;
       procedure MakeDoc;
       procedure Save ;
       procedure UpdateStatus(Sender:Tobject; Status:integer);
       procedure UpdateAantalAut(Sender:Tobject; NumAut:integer);
      Published
       property NCRNr:integer read FNCRNr write FNCRNr;
       property NCR_ID:integer Read FNCR_ID write Set_NCR_ID;
       property ArtikelNr: string Read FArtikelNr write Set_ArtikelNr;
       property ArtikelType: integer Read FArtikelType;
       property Prod_order: integer read FProdOrder write Set_Prodorder;
       property Status: integer read Fstatus;
       property datum: string read FDatum write FDatum;
       property Afdeling:integer read FAfdeling write FAfdeling;
       property Aanvrager:integer read FAanvrager write FAanvrager;
       property Omschrijving:String read FOmschrijving write FOmschrijving;
       Property NewNCRNr:string read Get_NewNCRNumber;
       property NCRNummer:string read GetNCRNummer;
       Property SubAssy:integer read FSubAssy write FSubAssy;
     end;
    
    
    
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    { TNCRArtikel }
    
    constructor TNCRArtikel.Create(NCR_ID: integer);
    begin
    
    end;
    
    destructor TNCRArtikel.Destroy;
    begin
    
      inherited;
    end;
    
    function TNCRArtikel.Get_IsSaved: boolean;
    begin
    
    end;
    
    procedure TNCRArtikel.Save;
    begin
    
    end;
    
    { TNCR }
    
    constructor TNCR.Create(ANCR_ID: integer);
    begin
    
    end;
    
    constructor TNCR.Create;
    begin
     AantalAut:=2;
     FNCR_ID:=0;
     NCRArtikelen := Tlist<TNCRArtikel>.Create;
    
    end;
    
    destructor TNCR.Destroy;
    begin
      NCRArtikelen.Free;
      inherited;
    end;
    
    function TNCR.GetNCRNummer: string;
    begin
    
    end;
    
    function TNCR.Get_NewNCRNumber: string;
    begin
    
    end;
    
    procedure TNCR.LoadNCR;
    begin
    
    end;
    
    procedure TNCR.MakeDoc;
    begin
    
    end;
    
    procedure TNCR.Save;
    begin
    
    end;
    
    procedure TNCR.Set_ArtikelNr(const Value: string);
    begin
    fartikeltype:=1;
    end;
    
    procedure TNCR.Set_NCR_ID(const Value: integer);
    begin
    
    end;
    
    procedure TNCR.Set_Prodorder(const Value: integer);
    begin
    
    end;
    
    procedure TNCR.UpdateAantalAut(Sender: Tobject; NumAut: integer);
    begin
    
    end;
    
    procedure TNCR.UpdateStatus(Sender: Tobject; Status: integer);
    begin
    
    end;
    
    procedure TForm2.Button1Click(Sender: TObject);
    var NCR:TNCR;
        i:integer;
        tempartikel:TNCRArtikel;
    begin
    
    NCR:=TNCR.Create();
    NCR.ArtikelNr:='172T100';
    NCR.Aanvrager:=4266;
    NCR.datum:=formatdatetime('yyyymmdd', now);
    NCR.Afdeling:=200;
    NCR.Prod_order:=4170012;
    NCR.Omschrijving:='Dit is een test';
    NCR.SubAssy:=7;
    
    
    for i := 0 to 4-1 do
    begin
     tempArtikel:=TNCRArtikel.Create(0);
     TempArtikel.PijpNr:=i+16600;
     TemPArtikel.ArrayNr:=0;
     TemPArtikel.IDNr:=0;
     NCR.NCRArtikelen.Add(TempArtikel);
     tempArtikel.Free;
    end;
    
    
    for I := 0 to NCR.NCRArtikelen.Count-1 do
     showmessage(NCR.NCRArtikelen.Items[i].PijpNr.ToString);
    
    NCR.Free;
    
    end;

  2. #2
    Waarom gooi je je tempArtikel weg in je loop?

  3. #3
    Heb het ook geprobeerd waarbij de create en free van het tempartikel buiten de loop stonden maar helaas met het zelfde resultaat.

  4. #4
    Die free moet je niet gebruiken bij het toevoegen van artikelen. Die free moet je alleen gebruiken als je het item gaat verwijderen.
    Code:
       Ongesorteerd.
       LMijnLijst[LIndex].Free;

    Daarnaast zou ik die TList<Type> anders doen:

    Code:
      LMijnLijst := TObjectList<TType>.Create;
    Deze lijst (indien OwnsObject op true staat = standaard zo), gooit zelf alle items weg als je de lijst opruimt. Losse items opruimen bij zijn index of index van het object. IndexOfObject(Object); Plus dat LMijnLijst eigenaar is van alle objecten. Overigens TempArtikel.Create(0) zou ik of TempArtikel.Create; of TempArtikel.Create(nil); als er op dat moment geen owner is.

    P.S. Ik zou het artikelnummer in een property plaatsen.

    Code:
    TempArtikel := TArtikel.create;
    TempArtikel.ArtikelNummer := aArtikelNummer; of -1 nieuw?  Wellicht kun je hier genoeg aan hebben om alle overige artikel info op te halen door alleen het artikelnummer te vullen met een geldig nummer.
    Last edited by PSterk; 13-Jul-17 at 14:51.

  5. #5
    Ik heb er nu inderdaad een TobjectList van gemaakt
    Verder heb ik de boel nog verder uitgekleed zodat het eenvoudiger wordt om de fout te vind (helaas nog niet gelukt)

    ik heb nu de volgende code om een lijst van testobject aan te maken

    Code:
    var
        cp:TtestOb;
        test : TObjectlist<TTestOb>;
    begin
    
    
    test:=TobjectList<TTestob>.create;
    test.OwnsObjects:=true;
    cp:=TtestOb.create;
    for i := 0 to 10 do
    begin
      cp.A:=i;
      cp.B:=i+10;
      test.Add(cp);
    end;
    cp.Free;
    
    for i := 0 to 10 do
      showmessage('A='+test[i].A.ToString + ' B='+test[i].B.ToString); //hier krijg ik nog steeds rare waardes terug
    mijn TTestOb ziet er als volgt uit

    Code:
     TTestOb = class(Tobject)
      public
       A:integer;
       B:integer;
       constructor create;
       destructor destroy;
     end;

  6. #6
    Code:
    for i := 0 to 10 do
    begin
      cp:=TtestOb.create;
      cp.A:=i;
      cp.B:=i+10;
      test.Add(cp);
    end;

  7. #7
    Yes dat is hem.

    Werd dus genekt door mijn eigen "opruim" woede ;-)

    Bedankt

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •