Results 1 to 7 of 7

Thread: unieke componenten naam

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    unieke componenten naam

    Hoe krijgt een component zijn unieke naam, designtime?
    Ik maak een component waaraan subcomponenten kunnen worden toegevoegd, vergelijkbaar met TPageControl en zijn TabSheets.
    Hoe kan ik ervoor zorgen dat die subcomponenten een unieke naam krijgen?
    Moet ik dat zelf doen (de owner van het sub-componentent wordt al automatisch het form waarop het betreffende component staat) of kan het "automatisch" door Delphi geregeld worden?

    Edit: Ik wil dus dat die sub-componenten in de published lijst van het form terecht komen (vergelijkbaar met Tabsheets)
    Last edited by Anoniem; 24-Jan-10 at 01:16.

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Dat regelt delphi
    elk component krijgt een 'volgnummer'

    button1
    button2
    button3
    etc
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,703
    Als je @designtime een component op een form dropt, dan neemt Delphi de naam van dat
    component zonder eerste "T" (bijvoorbeeld Button), kijkt of er al een component genaamd
    "Button1" is en zo ja, dan kijkt hij of er een component is met naam "Button2", enzovoorts,
    totdat hij een unieke naam gevonden heeft.

    Voor zover ik weet krijgt een component at run-time ook automatisch een naam, zolang je
    deze niet expliciet zelf zet; uiteraard kun je deze zelf ook opvragen door de "Name"-property
    uit te lezen.

    Je kunt natuurlijk ook zelf een unieke naam creëeren met bijvoorbeeld iets in de geest van:
    Delphi Code:
    1. MyComponent.Name := FormatDateTime('"Test"yymmddzz', Now);

    Greetz,

    Peter.
    Last edited by VideoRipper; 24-Jan-10 at 02:11.
    TMemoryLeak.Create(Nil);

  4. #4
    Volgens mij blijft de naam leeg bij runtime geïnstantieerde componenten, tenzij je die inderdaad zelf zet.
    1+1=b

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Geen naam @runtime. Dat zou een vreemde tijdverspiller zijn.

    De naam gaat automatisch voor een component dat op een form gedropt wordt.
    Maar het subcomponent gaat niet automatisch. De owner van het subcomponent is het form, de parent is niet het form. Zou het daaraan liggen?
    Weet iemand hoe het bij Tabsheets in zijn werk gaat?

    Zo ziet het er in de DFM uit. Zoals te zien is is de tweede page niet van een naam voorzien. (De eerste heb ik zelf via de objectinspector een naam gegeven)

    Code:
      object PageControl1: TPageControl
        Left = 840
        Top = 288
        Width = 289
        Height = 193
        ActivePage = TabSheet2
        TabOrder = 6
        object TabSheet1: TTabSheet
          Caption = 'TabSheet1'
        end
      end
    
      object Wizard1: TWizardControl
        Left = 1
        Top = 1
        Width = 823
        Height = 559
        object page1: TPage
          Left = 160
          Top = 120
          Width = 663
          Height = 439
          Title = 'Title'
          Description.Strings = (
            'Description')
        end
        object TPage
          Left = 160
          Top = 120
          Width = 663
          Height = 439
          Title = 'Title'
          Description.Strings = (
            'Description')
        end
      end
    Last edited by Anoniem; 24-Jan-10 at 11:20.

  6. #6
    Als je wilt dat jouw subcomponenten een naam hebben, dan moet je ze denk ik zelf die naam geven. Of je zou eens in de VCL moeten graven naar waar dat gebeurt. Die naamgeving wordt namelijk niet zozeer door de componenten geregeld, maar vooral door de designer. Ik verdenk IDesignerXXXX.UniqueName in de DesignIntf unit...
    1+1=b

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik geloof dat het nu correct werkt. Je hint wees me in de goede richting.

    Code:
    procedure TPage.SetParent(aWinControl: TWinControl);
    var
      F: TCustomForm;
      Des: IDesignerHook;
    begin
      // ...
    
      if aWinControl is TWizard then 
      begin
        if Name = '' then
          if csDesigning in ComponentState then
          begin
            F := GetParentForm(TWizard(aWinControl));
            if F <> nil then
            begin
              Des := F.Designer;
              if Des <> nil then
                  Name := Des.UniqueName(ClassName);
            end;
          end;
      end;
      // ...
    end;

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
  •