ну для начала, что это такое?
S[IntToStr(SensonTag)] - преобразование числа в строку, а потом пытаемся взять элемент массива с индексом, равным этой строке???.
надо так
S[SensonTag],как правильно сделано в 10 строке.
А саму функцию желательно начинать так
Код:
procedure TForm1.SpeedButtonClick(Sender:TObject);
begin
SensonTag:=TComponent(Sender).Tag;
А с глифами - много лишней работы
Итого
Код:
procedure TForm1.SpeedButtonClick(Sender:TObject);
var
Icon : TIcon;
IconIndex: Word;
begin
SensonTag:=TComponent(Sender).Tag;
if S[SensonTag]='' then
begin
if sOpenDialog1.Execute then
begin
S[SensonTag]:=sOpenDialog1.FileName;
Icon:=TIcon.Create;
try// приучись писать try-finally для такого использования
StrPCopy ( Pch, S[SensonTag] );
Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex);
Q[SensonTag].Glyph:=Icon;//внутри этого присваивания делается всё то, что ты написал
Q[SensonTag].NumGlyphs:= 1;//без этого могут быть глюки
Q[SensonTag].Caption:=ExtractFileName(s[SensonTag]);
finally//!!!!!!!1
Icon.Free;
end;//!!!!!!!!!
end;
end
else
begin
ShellExecute (Form1.Handle, nil,PChar(S[SensonTag]), nil, nil, SW_RESTORE);
end;
end;