title: Components not being found by FindComponent()
body: <p>I have created a login form which holds buttons corresponding to users' names held in an Access file.  The buttons are created in the <code>OnCreate</code> event because I don't want to have to create them each time the screen is shown.</p>
  <p>The buttons display as expected, and I have created LogOn and LogOff procedures, which both work as I expected.</p>
  <p>The next step was to only display the buttons for users who are currently logged on to the system.  To do this, I have created the following code in the <code>OnActivate</code> event:</p>
  <pre><code>procedure TUserInForm.FormActivate(Sender: TObject);
  var
     btn : TLBButton;
  begin
     With UserQuery do begin;
        first;
        while (not eof) do begin
           BtnName := FieldByName('UserName').AsString;
           Btn := TLBButton(FindComponent(BtnName));
           if (Btn &lt;&gt; nil) then
              if (FieldByName('LoggedIn').AsBoolean = True) then Btn.Visible := True else Btn.Visible := False;
           next;
        end;
     end;
  end;
  </code></pre>
  <p>However, it doesn't find any of the buttons - they are all <code>nil</code>. The code throws an Access Violation exception if I remove the <code>nil</code> check. But, at no point in the code do I destroy the buttons or the form itself. The buttons exist, because I can see them on the form. The <code>BtnName</code> variable is global within the unit.  I've checked that the <code>BtnName</code> variable is populated correctly from the table.</p>
  <p>I've used code similar to this to find components before, with no problems. In fact, I &quot;stole&quot; the code shown above from another procedure (with the obvious changes) in which it works fine.  The logs show no errors.</p>
  <p>Can anyone suggest some approach to fixing this problem?  It's very frustrating!</p>