Das geht nicht weil Spio eine lokale Variable ist die nach Verlassen deines Klickereignisses wieder undefniert ist. Beim nächsten Buttonklick ist also die vorherige Instanz nicht mehr zugewiesen, kann also nicht mehr über diese Variable angesprochen werden und später auch nicht frei gegeben werden.
Im übrigen geht es auch so (was den vorteil hat das du den Frame bei Programmende auch wieder freigeben kannst):
Delphi-Quellcode:
private
spio: TFrame2;
[...]
procedure TForm1.Button3Click(Sender: TObject);
begin
if (spio = nil) then //Alternativ auch: if not(Assigned(spio)) then
begin
spio:=TFrame2.create(Form1); //Frame ins Form einbinden
spio.Parent:=Form1;
spio.Top:=32;
spio.Left:=750;
spio.Show;
end
else
Spio.visible:=true;
end;