Results 1 to 7 of 7

Thread: Collection items zo snel mogelijk gebruiken

  1. #1

    Collection items zo snel mogelijk gebruiken

    Ik heb een Collection gemaakt van DataSources. Nu doet alles het netjes en kan ik designtime zoveel DataSources toevoegen in de item-editor als ik wil. Echter wil ik nu die DataSources in mijn code gaan gebruiken om het een en ander te gaan doen. Dit wil ik zo snel mogelijk doen. Ik dacht dat je dat op deze plek zou moeten doen:

    Code:
    procedure TCollectionComponent.SetOurCollection(
      const Value: TOurCollection);
    var
      i: Integer;
    begin
      FOurCollection.Assign(Value);
      ShowMessage(IntToStr(FOurCollection.Count));
    end;
    Als test heb ik een ShowMessage hier neergezet om het totaal aantal items te tonen. Dit werkt echter niet. Als ik een knop het het form zet met dezelfde ShowMessage en het programma is gestart krijg ik wel netjes een Dialog in beeld met daarin het totaal aantal items in de Collection.

    Hoe werkt dit wel?

    Mvg. JackCo
    Last edited by JackCo; 16-Feb-06 at 22:17.

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Hoi JackCo,

    Na een paar keer lezen begrijp ik je vraag nog niet echt eerlijk gezegd.

    Je code laat de setter van een collection-property zien die niet werkt. Wanneer niet? Hoe heb je dit getest?

    Maar wat heeft dit te maken met "het snel willen gebruiken" van een zelf gemaakt component waar een collection inzit? Wanneer gebruik je die setter dan? Ik neem aan dat je je collection in de constructor van je component aanmaakt. Dan is die collection (en zijn collection-items) toch public beschikbaar via de getter van zijn bijbehorende public property? Een setter van een collection-property gebruik je als je een nieuwe collection wilt toewijzen. Misschien heb je bedoeld dat je een ShowMessage wilde laten zien als de gétter wordt aangeroepen? Dat kan ik me wel voorstellen.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    Wat ik eigenlijk bedoel is dat na de create van mij eigen Collection ik de items in de Collection direct wil lezen en op basis daarvan het 1 en ander gaan doen. Als test heb ik een ShowMessage gebruikt. En die toont in dit geval direct na creatie "0", maar ik heb designtime weldegelijk wat items toegevoegd.

    Code:
    constructor TCollectionComponent.Create(AOwner: TComponent);
    begin
      inherited;
      FOurCollection := TOurCollection.Create(Self);
      ShowMessage(IntToStr(FOurCollection.Count));
    end;
    Dit gaat wel goed:

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(CollectionComponent1.OurCollection.Count));
    end;
    Volgens mij heeft het te maken met het feit dat die items behoren tot een instantie van mijn CollectionComponent. Hoe zou ik kunnen bereiken dat mijn CollectionComponent zonder daarbij een instantie te gebruiken wel gebruik kan maken van een dergelijke lijstje wat designtime wordt gevuld?

    Mvg. JackCo

  4. #4
    Plaats de showmessage niet in Create, maar in Loaded.
    1+1=b

  5. #5
    Ah thx. Dit werkt:

    Code:
    protected
        procedure Loaded; override;
    //..
    procedure TCollectionComponent.Loaded;
    begin
      inherited;
      ShowMessage(IntToStr(FOurCollection.Count));
    end;
    Loaded is er dus voor gemaakt om overschreven te worden ? Wat natuurlijk niet geheel onhandig is in dit geval.

    Mvg. JackCo

  6. #6
    Loaded kun je net als Create en veel andere methods overriden, inderdaad.
    Loaded wordt aangeroepen nadat alle properties zijn ingesteld.

    Je moet het zo zien:
    Als je een form maakt in de designer in de IDE, dan worden alle properties, de componenten etc opgeslagen in een form bestand, de dfm. Je hebt vast wel eens de definitie van een dfm bekeken. Zo niet, open dan het form in Delphi en druk op Alt-F12.
    Deze definitie wordt ook opgeslagen in een resource in je executable. Wanneer jouw form gemaakt wordt, dan wordt eigenlijk een kaal form gemaakt. Daarna worden de instellingen en components gelezen uit die resource. Nadat dit gebeurd is wordt 'Loaded' aangeroepen. Je customization is dan geladen. Dat is de reden dat je bij de create nog niet de beschikking hebt over alle dingen die je in de designer hebt gemaakt of ingesteld.
    1+1=b

  7. #7
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Wel opletten dat als je je component in runtime aan gaat maken dat je dan geen Loaded aanroep krijgt...
    Qui custodiet ipsos custodes

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
  •