Results 1 to 8 of 8

Thread: Component en naam

  1. #1

    Component en naam

    Hoi,

    Ik wil een aparte TPngbutton component maken en bij het laten zien op form zelf dat de Caption direct de naam Krijgt plus getal erachter?
    Eigenlijk zoals TButton werkt maar daar zie je erachter gelijk Button1 of button2 of button3. (zoals wat je plaatst op je form)
    hoe kan ik dat uitlezen? En natuuirlijk in de Caption zetten bij Create TPngButton?

    Ik kom er niet uit.
    Sorry, betreft een class(TCustomControl)

    Groetjes.

  2. #2
    Je component krijgt automatisch een unieke naam als je die op de form plaatst (PngButton1, PngButton2 etc) en de caption zou automatisch overgenomen moeten worden uit die naam, als je deze niet expliciet invult in je component source.
    Dat is alvast het geval in de custom components die ik zelf heb gemaakt.

  3. #3
    Name via Create was nog niet gedefinieerd dus moest het anders oplossen.

    Code:
    procedure TPngButton.SetName(const NewName: TComponentName);
    begin
      FCaption := NewName;
    
      inherited SetName(NewName);
    end;
    Probleem opgelost

  4. #4
    Tip 1: Zet de caption alleen als FCaption gelijk is aan Name, anders moet je na het zetten van Name altijd ook weer je caption zetten.

    Tip 2: Gebruik de Caption property i.p.v. FCaption. Volgens mij is dat een alias voor Text, en al beschikbaar vanaf TControl. Die zal dan weer SetText o.i.d. aanroepen, waarmee ook je control hertekend wordt, en er eventuele andere notificaties afgaan zoals dat normaliter werkt in een component.
    1+1=b

  5. #5
    Ik was nog in een soort van testfase maar daar heb je een punt GolezTrol. Caption ging inderdaad steeds mee met de 'Name'.
    Nu is dit de oplossing en werkt goed. Gebruik van Caption invalidate nu ook gelijk de button zelf.

    Code:
    // property Caption: string read FCaption write SetCaption;
    
    procedure TPngButton.SetName(const NewName: TComponentName);
    begin
      if (FCaption = NewName) or (FCaption = EmptyStr) then // Anders wordt Caption elke keer overschreven.
        Caption := NewName;
    
      inherited SetName(NewName);
    end;
    Bedankt voor de tip

  6. #6
    `or (FCaption = EmptyStr)` <-- Dat zou ik zelfs weglaten. Als je de caption leeg wilt maken moet dat toch ook kunnen? De eerste keer zijn de caption en de name beide leeg, dus zal de caption al mee veranderen als je de name zet.

    Overigens zit dit gedrag al ingebouwd in TControl (en dus ook in jouw TCustomControl-afgeleide):

    Je vindt in TControl de Caption property, die ook GetText en SetText gebruikt. Caption is dus inderdaad een alias voor Text, en aangezien beide protected zijn, kan je in je eigen afgeleide zelf bepalen welke je public of published maakt.

    Delphi Code:
    1. property Caption: TCaption read GetText write SetText stored IsCaptionStored;
    Daarbij heeft SetName al een hele berg logica om te bepalen of al dan niet de text (en dus de caption) gezet moet worden:

    Delphi Code:
    1. procedure TControl.SetName(const Value: TComponentName);
    2. var
    3.   ChangeText: Boolean;
    4. begin
    5.   ChangeText := (csSetCaption in ControlStyle) and
    6.     not (csLoading in ComponentState) and (Name = Text) and
    7.     ((Owner = nil) or not (Owner is TControl) or
    8.     not (csLoading in TControl(Owner).ComponentState));
    9.   inherited SetName(Value);
    10.   if ChangeText then Text := Value;
    11. end;

    Een heel verhaal dus, maar het komt er in ieder geval op neer dat je al een Caption property hebt, dat je geen eigen FCaption (en Caption) nodig hebt, en dat je eigenlijk ook de override van SetName niet nodig hebt. Het enige dat je moet doen, is ervoor zorgen dat je de ingestelde caption tekent, en volgens mij is dat alles.

    Nog een andere tip trouwens. Als je wilt dat je button reageert als een button, dan zou ik niet beginnen met TCustomControl. Er zit heel veel logica in buttons, in de verschillende click- en hover-states, het tab-gedrag, de relatie met andere buttons, reactie op toetsaanslagen, modalresult e.a. Verschillende buttons uit component-sets (inclusief DevExpress) doen dit ook niet helemaal goed, al is m'n ervaring met DevExpress wel 10 jaar oud.

    Als je een button met een plaatje wilt, dus zoals een TBitButton, maar dan beter, dan zou ik afleiden van TButton, of zijn voorouders, TCustomButton of TButtonControl. TButton is een complete button, waar je dus heel simpel een beetje aan kan toevoegen. TCustomButton bevat bijna alles dat TButton heeft, maar het meeste is protected, en de ondersteuning voor styles zit er volgens mij nog niet in. TButtonControl bevat alleen de elementaire functionaliteit van een button-achtig control, maar is ook de basis voor radiobuttons en checkboxen.

    Ik heb zelf ooit een ImageButton gemaakt door een TImage op een TButton-afgeleide te zetten. Het enige dat je dan zelf moet programmeren is het maken van de TImage en zorgen dat deze de button als parent heeft, en het beschikbaar maken van een property (bijvoorbeeld een TPicture, of een TImageList + ImageIndex) om een plaatje mee in te stellen.
    1+1=b

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,054
    Er bestaat volgens mij een SetCaption style, zie ControlStyle (of ComponentStyle).
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  8. #8
    Bedankt voor het meedenken. Ik heb het eens bekeken en dit is de oplossing:

    Code:
    procedure TPngButton.SetName(const NewName: TComponentName);
    begin
      inherited SetName(NewName);
      if (Text = NewName) then
      begin
        Caption := Text;
      end;
    end;
    Dit werkt prima en wil het ook daarbij laten.

    Deze component Button is al 15 jaar oud en is al die jaren uitgebreid. Door de jaren heen steeds een stukje source erbij en hier en daar weer wat weg.
    U zult begrijpen dat het een rommeltje is. Ik ben dit ook aan het herschrijven.

    Bedankt

Thread Information

Users Browsing this Thread

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

  1. BVerhaar

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
  •