Results 1 to 12 of 12

Thread: Component slaat published properties niet op

  1. #1

    Component slaat published properties niet op

    Ik ben bezig met een chat box, en heb hiervoor een aantal properties gemaakt. Maar deze worden niet opgeslagen, ondanks dat deze onder published staan. Misschien iemand die even wilt meekijken waar het precies mis gaat? Ik heb al meerdere components geschreven, maar dit is een van de weinige keren dat het voorkomt en ik niet kan vinden waar het "probleem" zit.

    Ik heb het geuload op pastebin, omdat het te groot was om hier te posten:
    https://pastebin.com/YpZgWjug

  2. #2
    Om welke propery/ies gaat het? Als een property de default waarde heeft, wordt hij niet opgeslagen. Bijvoorbeeld die Left,Top,Right,Bottom zullen niet opgeslagen worden als ze de waarde 20 hebben.
    1+1=b

  3. #3
    Het gaat om de nested properties - die afgeleide zijn van TPersistent. Wat best lastig is, nu nog omdat ik het aan het bijwerken/testen ben - en alle properties runtime moet goed zetten.. Maar ik ben dit nog maar een keer eerder tegen gekomen, een tijd geleden al - en ben vergeten wat de oplossing/probleem was..

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Staat stored of false wellicht?
    TMemoryLeak.Create(Nil);

  5. #5
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    In de type declaratie staan een aantal types die je gebruikt, misschien behandeld Delphi deze intern toch een tikje anders.

    TSingleRect = record
    TChatUser = class
    TChat = class(TComponent)

    Properties bij een record vind ik persoonlijk vreemd overkomen (ik heb het ooit anders geleerd), maar misschien mag en kan dat tegenwoordig allemaal.

    Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  6. #6
    De properties bij een record worden ook gebruikt door Delphi zelf, kijk maar naar TRect:
    Delphi Code:
    1. // changing the width is always relative to Left;
    2. property Width: Integer read GetWidth write SetWidth;
    3. // changing the Height is always relative to Top
    4. property Height: Integer read GetHeight write SetHeight;
    5. property Size: TSize read GetSize write SetSize;
    6. property Location: TPoint read GetLocation write SetLocation;

    Ik wist niet dat dit "slecht" was of niet "mocht"

  7. #7
    Prima hoor. Records mogen properties, methods en zelfs constructors hebben (destructors nog niet, geloof ik? Misschien in 11). Maar of die dan ook automatisch opgeslagen worden weet ik niet.

    Maar met sub-objecten moest je dacht ik iets speciaals doen, maar ik lees in deze willekeurige tutorial dat je in principe gewoon een heel sub-component kan published. Het kan wel zo zijn dat dat component dan ook wel daadwerkelijk een TComponent-afgeleide moet zijn, dus geen willekeurige class of record.

    En dat heeft dan weer te maken met hoe een dfm gestreamed wordt. De TComponent-hierarchie heeft niet alleen logica voor parent/child relaties (of ownership, eigenlijk), maar ook voor streaming. Als je daar van af moet wijken, of op uit wilt breiden, moet je volgens mij DefineProperties overriden en zelf inhaken op het streaming-mechanisme om die waarden goed in je DFM te krijgen.
    1+1=b

  8. #8
    Dankjewel, ga ik daar eens mee aan de slag. Die TSingleRect (Record) wordt enkel gebruikt voor het tijdelijk bijhouden van posities, deze hoeven niet in de DFM opgeslagen te worden omdat deze in de paint worden herberekend. De TChatUser is een class die ik (nu nog) niet gebruik in Designtime, dus hiervoor hoef ik ook deze class niet aan te passen. Ik ga eens je links gaan doorlezen, alvast dank

  9. #9
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Het komt omdat jouw properties read-only zijn: je hebt geen setter geïmplementeerd.
    Delphi Code:
    1. property BalloonA: TChatMessageBalloon read FBalloonA;

    Maak daarvan:

    Delphi Code:
    1. property BalloonA: TChatMessageBalloon read FBalloonA write SetBalloonA;
    2.  
    3. ...
    4.  
    5. procedure TCustomChatMessageBox.SetBalloonA(Value: TChatMessageBalloon);
    6. begin
    7.   FBalloonA.Assign(Value);
    8. end;
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  10. #10
    Maar wie ruimt dan Value op?
    1+1=b

  11. #11
    Dankjewel stom, maar op den duur kijk ik over zulke dingen heen.. Daarom is een extra paar ogen altijd welkom

  12. #12
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Quote Originally Posted by GolezTrol View Post
    Maar wie ruimt dan Value op?
    De IDE. Value is de design time instantie van de object-property (afgeleide van TPersistent) die wordt weergegeven in de object inspector in de IDE.
    Last edited by NGLN; 11-May-22 at 15:54.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

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
  •