 <p>The <code>Sender</code> of the event is the button, so save the "appData" into button's tag (when you create it) and then in the mouse event use it, ie</p> <pre><code>procedure TForm3.CreateAppButton(sBtnCapt: string); ... begin AppData := TAppDetails.Create(sBtnCapt); with NewButton do begin Tag := NativeInt(AppData); ... end; //AppData.Free; // NB! do not free here! end; procedure TForm3.btnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer); var AppData: TAppDetails; begin ... else if Button = mbRight then begin AppData := TAppDetails((Sender as TSpeedButton).Tag); // use the appData ShellExecute(self.Handle, 'open', PChar(AppData.Wiki), nil, nil, SW_SHOWNORMAL); //AppData.Free; // NB! do not free here! end; end; procedure TForm3.DeleteAppButton(aBtn: TSpeedButton); begin TAppDetails(aBtn.Tag).Free; aBtn.Free; end; </code></pre> <p>Note that you have to free the objects you saved into button's tag when the buttons are freed (unless the buttons are not freed until app terminates, then you don't have to worry about it althought it isn't good style).</p>