Announcement

Collapse
No announcement yet.

Variablen 'Komponenten.Namen'

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Variablen 'Komponenten.Namen'

    Über eine FOR-Schleife möchte ich gerne eine Reihe von gleichen Komponenten ansteuern, um mit Programmcode und die Updates zu ersparen.
    <p>
    Im konkreten Beispiel möchte ich eine Anzahl von TCheckBox prüfen, ob sie angekreuzt wurden (.checked=true);

    Der schwerfällige Weg würde so aussehen:<p>
    <b>if checkbox1.checked then i:=i+1;<p>
    if checkbox2.checked then i:=i+1;<p>
    if checkbox3.checked then i:=i+1;<p>
    etc.</b><p>

    wie kann ich die Checkbox mittels Variable ansteuern? Ich habe es irgendwie so versucht:<p>

    <b>for i:=0 to 7 do<p>
    if ('checkbox' + inttostr(i)) as TCheckBox).checked then j:=j+1;<p></b>

    Geht aber nicht? Was ist falsch?

  • #2
    Hallo Sebastian,
    hier die Lösung:

    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    var
    I,m: Integer;
    begin
    m := 0;
    for I := ComponentCount - 1 downto 0 do
    begin
    begin
    if (Components[I] is TCheckbox) then if (Components[I] as TCheckbox).checked then inc(m);
    end;
    end;
    ShowMessage(IntToStr(m));
    end;
    </pre>

    mfg Klaus-Pete

    Comment


    • #3
      Als Nachtrag für alle, die Code hier posten.
      Kopiert ihn aus eurer Unit und setzt ihn zwischen <pre> und </pre>.
      Das Ergebnis: Siehe oben.

      mfg Klaus-Pete

      Comment


      • #4
        Hi

        Besser als Components[] wäre Controls[]. Du setzt alle CheckBoxes auf ein TPanel, nun mit:

        <pre>

        for I := 0 to Panel1.ControlCount -1 do
        if Panel1.Controls[I] is TCheckBox then
        ...

        </pre>

        Die Components[] Liste des Formulars enthält ALLE Komponenten im Gegensatz zur gruppierten Panel1.Controls[] die dann wirklich nur die CheckBoxen enthält.

        Gruß Hage

        Comment


        • #5
          Hallo Klaus
          Hallo Hagen

          Der Code klappt bestens. Vielen Dank für Eure Unterstützung.

          Ich habe aber einen Code in Erinnerung der aus einer Variablen einen Komponentennamen zusammensetzt. Doch ich kriegte denn Code nicht hin.<p>
          Die Lösungsvorschläge durchsuchen beide das Formular bzw. ein Panel nach bestimmten Komponenten (hier: TCheckBox) ab.<p&gt

          Comment


          • #6
            Meintest du etwas in dieser Richtung
            <font size=2 face="Courier New"><font color="#000000"><b>private
            </b>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000080"><i>{...}
            </i></font>&nbsp;&nbsp;&nbsp;<font color="#000080"><i>//&nbsp;the&nbsp;OnClick&nbsp;Procedure&nbsp;for&nbs p;our&nbsp;Buttons
            </i></font>&nbsp;&nbsp;&nbsp;<b>procedure</b>&nbsp;RunTimeButtonClick(Sender:&nbsp;TObject);
            <b>end</b>;

            <font color="#000080"><i>{...}
            </i></font><b>var
            </b>&nbsp;&nbsp;Form1&nbsp;:&nbsp;TForm;
            &nbsp;&nbsp;<font color="#000080"><i>{Declare&nbsp;an&nbsp;Array&nbs p;of&nbsp;TButtons}
            </i></font>&nbsp;&nbsp;RunTimeButtons&nbsp;:&nbsp;<b>arr ay</b>[1..10]&nbsp;<b>of</b>&nbsp;TButton;

            <font color="#000080"><i>{...}

            </i></font><b>implementation

            </b><font color="#000080"><i>{...}

            </i></font><b>procedure</b>&nbsp;TForm1.RunTimeButtonClick(Sender:&nbsp;TOb ject);
            <b>begin
            </b>&nbsp;&nbsp;&nbsp;<font color="#000080"><i>{Show&nbsp;the&nbsp;Button&nbsp ;Nummer&nbsp;that&nbsp;was&nbsp;clicked}
            </i></font>&nbsp;&nbsp;&nbsp;ShowMessage('Button'&nbsp;+ &nbsp;inttostr((Sender&nbsp;<b>as</b>&nbsp;TButton).Tag)&nbsp;+&nbsp;'&nbsp;clicked!' );
            <b>end</b>;

            <b>procedure</b>&nbsp;TForm1.Button13Click(Sender:&nbsp;TObject) ;
            <b>var
            </b>&nbsp;i&nbsp;:&nbsp;Byte;
            <b>begin
            </b>&nbsp;<b>for</b>&nbsp;i&nbsp;:=&nbsp;1&nbsp;<b>to</b>&nbsp;10&nbsp;<b>do
            </b>&nbsp;<b>begin
            </b>&nbsp;&nbsp;&nbsp;<font color="#000080"><i>{Create&nbsp;the&nbsp;buttons}
            </i></font>&nbsp;&nbsp;&nbsp;RunTimeButtons[i]&nbsp;:=&nbsp;TButton.Create(Self);
            &nbsp;&nbsp;&nbsp;<b>With</b>&nbsp;RunTimeButtons[i]&nbsp;<b>do
            </b>&nbsp;&nbsp;&nbsp;<b>begin
            </b>&nbsp;&nbsp;&nbsp;&nbsp;Parent&nbsp;:=&nbsp;Form 1;
            &nbsp;&nbsp;&nbsp;&nbsp;Caption&nbsp;:=&nbsp;'Butt on&nbsp;'+&nbsp;inttostr(i);
            &nbsp;&nbsp;&nbsp;&nbsp;Top&nbsp;:=&nbsp;i&nbsp;*& nbsp;Height;
            &nbsp;&nbsp;&nbsp;&nbsp;Tag&nbsp;:=&nbsp;i;
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000080"><i>{Assign&nbsp;a&nbsp;OnClick&nbs p;handler}
            </i></font>&nbsp;&nbsp;&nbsp;&nbsp;OnClick&nbsp;:=&nbsp; &nbsp;RunTimeButtonClick;
            &nbsp;&nbsp;&nbsp;&nbsp;Visible&nbsp;:=&nbsp;Tr ue;
            &nbsp;&nbsp;&nbsp;<b>end</b>;
            &nbsp;&nbsp;<b>end</b>;
            <b>end</b>;

            <b>procedure</b>&nbsp;TForm1.FormDestroy(Sender:&nbsp;TObject);
            <b>var
            </b>&nbsp;&nbsp;i&nbsp;:&nbsp;Byte;
            <b>begin
            </b>&nbsp;<font color="#000080"><i>{Important:&nbsp;Free&nbsp;your &nbsp;created&nbsp;Buttons}
            </i></font>&nbsp;<b>for</b>&nbsp;i&nbsp;:=&nbsp;1&nbsp;<b>to</b>&nbsp;10&nbsp;<b>do
            </b>&nbsp;&nbsp;&nbsp;RunTimeButtons[i].free;
            <b>end</b>;

            </font>
            mfg Klaus-Pete

            Comment


            • #7
              Um über den Komponentennamen zu gehen kannst Du findcomponent nutzen.<br>
              <pre>
              for i:=0 to 7 do
              if (Tcheckbox(findcomponent('checkbox' + inttostr(i))).checked then
              inc(j);
              </pre&gt

              Comment

              Working...
              X