Results 1 to 5 of 5

Thread: TCollection (verschil Delphi 7 en XE5)

  1. #1

    TCollection (verschil Delphi 7 en XE5)

    Hallo allemaal!

    Ik heb een probleem met het overzetten van oude Delphi 7 code naar Delphi XE5 en het probleem behelst de TCollection.

    Deze wordt 'vrij simpel' aangemaakt en nergens gedefinieerd:

    Code:
    var
      Sheets: TCollection;
    In de Form.Create wordt'ie gemaakt (en in de Form.Destroy bevrijd):

    Code:
    Sheets := TCollection.Create;
    Dit werkte eigenlijk niet meer, maar heb ik reeds veranderd naar "Sheets := TCollection.Create(Self)"

    In deze Collection moet een TSHEET worden gezet:

    Code:
    TSHEET=class(TObject)
        RECSIZE:INTEGER;
        Offset,NrLines,MaxLine:Integer;
        Definition:SheetDefinition;
        constructor Create(Size:Integer;Def:SheetDefinition);
        destructor  Destroy;                                     override;
        function  RealStr(R:Real;Digits:Integer):String;
        PROCEDURE STOREMAXLINE(M:INTEGER);
        FUNCTION  READMAXLINE:INTEGER;
        FUNCTION  SETRECORD(IX:INTEGER;REC:POINTER):BOOLEAN;
        FUNCTION  GETRECORD(IX:INTEGER;REC:POINTER):BOOLEAN;
        PROCEDURE SETCEL(Y:INTEGER);                             VIRTUAL;
        PROCEDURE DRAWLINE(INDEX:INTEGER);                       VIRTUAL;
        PROCEDURE SETUPDATA;                                     VIRTUAL;
        PROCEDURE READDBASE;                                     VIRTUAL;
        PROCEDURE GridMouseDown(X, Y: Integer);                  VIRTUAL;
        FUNCTION  EDITFIELD(X,Y:INTEGER):WORD;
        PROCEDURE FILLSHEET;
      END;
    
     VLOEISTOF=class(TSheet)
        PROCEDURE DRAWLINE(INDEX:INTEGER);                         override;
        PROCEDURE SETCEL(Y:INTEGER);                               override;
        procedure ReadDBase;                                       override;
        procedure GridMouseDown(X, Y: Integer);                    override;
      END;
    In de Form.Create wordt, nadat de Collection aangemaakt is zoals boven aangegeven, een aanroep gedaan naar de Procedure 'AddSheet':

    Code:
    AddSheet(VLOEISTOF.Create(SizeOf(VLOEISTOFRecord),VLOEISTOFSheetDef));
    Deze Procedure ziet er als volgt uit:

    Code:
    procedure TForm1.AddSheet(ASheet:TSheet);
    begin
      TabControl.Tabs.Add(ASheet.Definition.SheetName);
      Sheets.Add(ASheet);
    end;
    Voor zo ver ik kan zien, gaat het daar volledig mis... Het is namelijk niet mogelijk 'Add' aan te roepen met parameters. Ik kan dus 'ASheet' niet toevoegen aan de Collection 'Sheets'. Let wel, dit werkte voortreffelijk in Delphi 7 maar niet meer in Delphi XE5.

    Iemand misschien ene idee wat ik fout doe of waar ik op moet letten? Alvast bedankt!

    Groeten,
    Robert
    Last edited by kleinpeter; 22-May-15 at 16:01.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Het klinkt mij als het verschil tussen een Turbo Pascal/D1 Tcollection (iets wat meer TList achtig was) vs Delphi TCollection die met tcollectionitems werkt. (en jouw tsheet erft van tobject, niet tcollectionitem).

    Hoe het heeft kunnen werken in D7 (aangenomen dat je dezelfde projecten en units gebruikt) weet ik niet. Ergens is er iets anders. Waar kom je terecht als je in D7 pijltje omhoog op de tcollection definitie doet? In classes toch?

  3. #3
    Dat klopt inderdaad, de code is al redelijk oud... Delen komen nog uit Pascal. Helaas heb ik D7 niet meer functioneel werkend op dit moment, dus ik kan het niet nakijken. Maar je hebt gelijk, de TCollection is meer een TList dan een gedefinieerde Collection met CollectionItems. Ik zal dinsdag eens de gehele code op de schop nemen!

    Heeft iemand nog een mooi eenvoudig voorbeeld m.b.t. het gebruik van TCollection in Delphi XE?

  4. #4
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Het makkelijkste is om de VCL zelf door te spitten. Collections worden gebruikt in TStatusBar, TDBGrid, etc...

    Een tutorial staat op Creating Custom Delphi Components, Part II, maar daar zit een fout in, zie deze fix.

    En je zou ook nog code in onze OpenSource server kunnen bekijken, bijvoorbeeld: TStringGridColumn in NLDStringGrid.pas .
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Of gewoon TObjectList<>/TList<> gebruiken

    TCollections zijn in feite alleen interesant als je het VCL streaming mechanisme gebruikt.

    Ik gebruik ze eerlijk gezegd nooit. (wel in TP en dan vooral TV, niet in Delphi)

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
  •