Results 1 to 6 of 6

Thread: Variabelen dynamisch aanspreken

  1. #1

    Variabelen dynamisch aanspreken

    Hallo,

    Ik wil a.d.h. van een componentnaam andere componenten aanspreken.
    Dit om mijn code gebruiksvriendelijker te maken. Ik wil dus 1 functie met argumenten maken die ik telkens kan gebruiken.

    Vb : Naam Checkbox : Chk_050520
    Naam TextBox : Edt_050520
    Naam DateTimepicker : DTP_050520

    Nu bouw ik een variabele met een deel van de naam van de checkbox. Met de copy functie filter ik de waarde '050520' in de variabele 'filter'.
    Ik maak dan een string (naam compName) met de code : 'Edt_' + filter.

    Mijn vraag is nu hoe ik de waarde uit compName kan gebruiken om mijn component met dezelfde naam aan te spreken.
    Dit zal waarschijnlijk heel simpel zijn, maar ik vind daar nergens info over.
    Misschien bestaat er ook een gemakkelijkere oplossing voor mijn oplossing.

    Alvast bedankt

    Lainkes

  2. #2
    Op deze manier kun je door je componenten lopen.

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      C: TComponent;
    begin
      for I := 0 to ComponentCount - 1 do
      begin
        C := Components[I];
        if EndsStr('_050520', C.Name) then  // Uses System.StrUtils,
        begin
          // Doe iets met het component.
          Memo1.Lines.Add('++' + C.Name);
        end;
      end;
    
    end;
    Ik weet niet wat je met de verschillende componenten wilt doen, maar waarschijnlijk zul je het component eerst moeten casten naar bijvoorbeeld een TEdit, voordat je er iets mee kunt doen wat nuttig is.

  3. #3
    Ik wil de textbox en DateTimePicker op de status enable zetten.

    Dus met C.Name kan ik een nieuwe variabele maken, die dezelfde naam heeft als mijn te bewerken component.
    Vb : var := 'Edt_' + C.Name;

    Hoe kan ik die inhoud van var gebruiken als variabele?
    Ik probeerder met TDateTimePicker(var).Enabled := True; maar daar krijg ik een memoryfout op.
    De waarde van 'var' is dezelfde als de naam van de DateTimePicker. Dat heb ik meerdere keren nagekeken om zeker te zijn.


    Lainkes
    Last edited by alain.janquart; 29-Jan-23 at 23:19.

  4. #4
    Je kan niet zomaar een string naar een control typecasten. Je zal het control op moeten zoeken o.b.v die naam.

    Dat kan bijvoorbeeld met de loop die Luigi eerder postte, maar je kan ook FindComponent gebruiken. Normaliter zijn alle componenten op een form ook 'eigendom' van het form. Met (Form1.)FindComponent zoek je in alle componenten waar (Form1) eigenaar van is.
    Je kan voor de zekerheid controleren of het is gelukt. Daarmee voorkom je kritieke fouten:

    Delphi Code:
    1. var
    2.   c: TComponent;
    3. begin
    4.   c := FindComponent('DateTimePicker1');
    5.   if not Assigned(c) then
    6.     ShowMessage('Component niet gevonden')
    7.   else if not (c is TDateTimePicker) then
    8.     ShowMessage('Component is geen datetimepicker')
    9.   else
    10.     ShowMessage(DateToStr(TDateTimePicker(c).Date));
    1+1=b

  5. #5
    Als je alleen wilt enablen/disablen kun je misschien ook checken of het component een TControl.
    Code:
    procedure TViewMain.EnableAll;
    var
      I: Integer;
    begin
      for I := 0 to ComponentCount - 1 do
        if Components[I] is TControl then
          (Components[I] as TControl).Enabled := True;
    end;

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Het is een beetje moeilijk inschatten zonder de exacte context te weten, maar pPersoonlijk ben ik er nooit zo dol op om dynamisch componenten op hun naam als string aan te spreken; uit ervaring weet ik dat je jezelf er uiteindelijk alleen maar mee in de vingers snijdt en het juist gebruiksonvliendelijker wordt.

    Je kunt IMHO componenten beter (wel op naam, maar niet op string) direct opgeven als parameter van een functie of procedure.

    Voorbeeld:
    Delphi Code:
    1. procedure SetControlValue(const AControl: TControl; AValue: string);
    2. begin
    3.   if AControl is TEdit then
    4.     TEdit(AControl).Text := AValue
    5.   else
    6.   if AControl is TCheckBox then
    7.     TCheckBox(AControl).Checked := StrToBool(AValue)
    8.   else
    9.   if AControl is TDateTimePicker then
    10.     case TDateTimePicker(AControl).Kind of
    11.       dtkDate: TDateTimePicker(AControl).Date := StrToDate(AValue);
    12.       dtkTime: TDateTimePicker(AControl).Time := StrToTime(AValue);
    13.     end
    14. //   else
    15. //   if AControl is Txxxxxx then
    16. end;
    17.  
    18. procedure TForm1.Button1Click(Sender: TObject);
    19. begin
    20.   SetControlValue(Chk_050520, 'True');
    21.   SetControlValue(Edt_050520, 'Dit is een edit');
    22.   SetControlValue(DTP_050520, '2023-01-30');
    23. end;

    Alleen wanneer je de componenten uit bijvoorbeeld een dataset (of inifile oid) wilt zetten, dan heb je geen andere mogelijkheid dan met de daadwerkelijke naam als string te werken, maar dan kun je eventueel gebruik maken van de streamingmogelijkheden die ieder component al bezit of de al eerder genoemde "FindComponent".
    TMemoryLeak.Create(Nil);

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
  •