I have created a login form which holds buttons corresponding to users' names held in an Access file. The buttons are created in the OnCreate
event because I don't want to have to create them each time the screen is shown.
The buttons display as expected, and I have created LogOn and LogOff procedures, which both work as I expected.
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 OnActivate
event:
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 <> nil) then
if (FieldByName('LoggedIn').AsBoolean = True) then Btn.Visible := True else Btn.Visible := False;
next;
end;
end;
end;
However, it doesn't find any of the buttons - they are all nil
. The code throws an Access Violation exception if I remove the nil
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 BtnName
variable is global within the unit. I've checked that the BtnName
variable is populated correctly from the table.
I've used code similar to this to find components before, with no problems. In fact, I "stole" the code shown above from another procedure (with the obvious changes) in which it works fine. The logs show no errors.
Can anyone suggest some approach to fixing this problem? It's very frustrating!