|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Загрузить иконку ярлыка в кнопку
Здравствуйте, помогите пожалуйста.
Я умею загружать в image путь до файла и его ярлык. То-есть по нажатию на image у меня отображается иконка и запускается программа... Как мне сделать тоже самое на кнопки в которые можно загружать картинки, типа speedbutton. Загружается всё через опендиалог Подскажите пожалуйста! |
#2
|
||||
|
||||
Цитата:
Примерно как-то так: Код:
procedure TForm1.SpeedButton1Click(Sender: TObject); var ico: TIcon; bmp: TBitmap; begin ico := TIcon.Create; try ico.Handle := ExtractIcon(HInstance, 'C:\WINDOWS\system32\calc.exe', 0); bmp := TBitmap.Create; try bmp.PixelFormat := pf32bit; bmp.Width := ico.Width; bmp.Height := ico.Height; bmp.Canvas.Draw(0, 0, ico); SpeedButton1.Glyph.Assign(bmp); finally bmp.Free; end; finally ico.Free; end; end; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Gareth (07.04.2014)
|
#3
|
|||
|
|||
А есть кнопки которые отображают иконки как image ? Что бы не маятся с этими преобразованиями)
Делаю программу, по нажатию какой либо кнопки на мышке будет вызываться моя форма с ярлыками. А на счет BitBtn ? С ним так же надо будет преобразовывать ? Последний раз редактировалось Gareth, 07.04.2014 в 14:47. |
#4
|
|||
|
|||
Цитата:
Как можно сделать так, что бы отображался любой ярлык?) |
#5
|
||||
|
||||
Цитата:
Цитата:
|
#6
|
|||
|
|||
Poli-smen я новичок, там на всю страницу код, еще и на англ))
Сейчас доходчиво попробую объяснить что конкретно мне надо У меня есть панель, на ней хочу сделать кнопки, не важно speedbutton или bitbtn... По нажатию по кнопке, будет открываться opendialog, там я буду выберать нужный себе файл. Картинка файла будет грузится в кнопку. И по нажатию этой кнопки будет открываться тот файл который я выбрал в opendialog. Я со всем разобрался, не знаю лишь как загрузить в speedbutton или bitbtn икону ярлыка. Цитата:
Помогите пожалуйста понять как это делается . Последний раз редактировалось Gareth, 08.04.2014 в 16:36. |
#7
|
||||
|
||||
Цитата:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject); var ico: TIcon; bmp: TBitmap; FileName: AnsiString; begin if OpenDialog1.Execute then begin FileName := OpenDialog1.FileName; ico := TIcon.Create; try ico.Handle := ExtractIcon(HInstance, Pointer(FileName), 0); bmp := TBitmap.Create; try bmp.PixelFormat := pf32bit; bmp.Width := ico.Width; bmp.Height := ico.Height; bmp.Canvas.Draw(0, 0, ico); SpeedButton1.Glyph.Assign(bmp); finally bmp.Free; end; finally ico.Free; end; end; end; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Gareth (08.04.2014)
|
#8
|
||||
|
||||
В модуле ShellApi есть подходящая функция ExtractAssociatedIcon, вот так ей можно пользоваться
Код:
... var Icon : TIcon; Pch: array[0..256] of Char; IconIndex: Word; begin Icon := TIcon.Create; StrPCopy(Pch,'C:\WINDOWS\NOTEPAD.EXE'); Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex); SpeedButton1.Glyph.Width:= Icon.Width; SpeedButton1.Glyph.Height:= Icon.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, Icon); Icon.Free; end; ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (08.04.2014)
|
#9
|
|||
|
|||
Poli-smen, Alegun спасибо Вам огромное!!!
Сделал то что я хотел Код:
var Form1: TForm1; S:string; ..... .... procedure TForm1.sSpeedButton1Click(Sender: TObject); var Icon : TIcon; Pch: array[0..256] of Char; IconIndex: Word; begin if S='' then // если переменная пуста begin sOpenDialog1.Execute; //открыть опен-диалог S:=sOpenDialog1.FileName; //переменная равна выбранному файлу if S='' then // если переменная по прежнему пуста begin sSpeedButton1.Glyph:=nil; ShowMessage('Ничего не выбрано'); end else sSpeedButton1.Glyph:=nil; Icon:=TIcon.Create; StrPCopy(Pch,S); Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex); sSpeedButton1.Glyph.Width:= Icon.Width; sSpeedButton1.Glyph.Height:= Icon.Height; sSpeedButton1.Glyph.Canvas.Draw(0, 0, Icon); Icon.Free; end else begin sPanel1.Caption:=S; ShellExecute (Form1.Handle, nil, PChar(S), nil, nil, SW_RESTORE); end; end; Еще раз спасибо!! |
#10
|
|||
|
|||
Мужики, подскажите пожалуйста, тот код что выше я написал.
Я нажимаю на кнопку, идет проверка переменной S типа string, где должен лежать путь к файлу. Если он пуст, то открывается opendialog, выбирается файл. После этого идет еще одна проверка переменной S. Если она всё еще пуста, то появляется сообщение о том что ничего не выбрано в opendialoge. Если она не пуста, то загружает в себя картинку выбранного файла, и потом запускает этот файл. Вот мне надо узнать, при второй проверке переменной S, если она всё еще пуста, (в opendialog`e ничего не выбрал, нажал отмена. ) сделать так что бы кнопка не грузила в себя ничего. Была просто пустой. Пробовал писать Код:
speedbutton1.glyph:=nil; В 12 строке кода то, что я делаю. Код:
var Icon : TIcon; Pch: array[0..256] of Char; IconIndex: Word; begin if S='' then // если переменная пуста begin sOpenDialog1.Execute; //открыть опен-диалог S:=sOpenDialog1.FileName; //переменная равна выбранному файлу if S='' then // если переменная по прежнему пуста begin sSpeedButton1.Glyph:=nil; // ВОТ ТУТ Я ПИШУ КОД, КОТОРЫЙ ДОЛЖЕН ОЧИСТИТЬ КНОПКУ ОТ КАРТИНОК. ShowMessage('Ничего не выбрано'); end else sSpeedButton1.Glyph:=nil; Icon:=TIcon.Create; StrPCopy(Pch,S); Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex); sSpeedButton1.Glyph.Width:= Icon.Width; sSpeedButton1.Glyph.Height:= Icon.Height; sSpeedButton1.Glyph.Canvas.Draw(0, 0, Icon); Icon.Free; end else begin sPanel1.Caption:=S; ShellExecute (Form1.Handle, nil, PChar(S), nil, nil, SW_RESTORE); end; end; Последний раз редактировалось Gareth, 09.04.2014 в 17:11. |
#11
|
||||
|
||||
Ведь для этого специально функция Execute у диалога результатом булева, поддерживает такую конструкцию
Код:
... if sOpenDialog1.Execute then begin // Здесь всё что нужно сделать при выборе кнопки OK в диалоге // end; ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (09.04.2014)
|
#12
|
|||
|
|||
Цитата:
Помогите с ошибкой, что не так делаю ? Код:
var Form1: TForm1; Icon: TIcon; Pch: array[0..256] of Char; IconIndex: Word; S:String; ....... ....... procedure TForm1.sSpeedButton1Click(Sender: TObject); begin if S='' then begin if sOpenDialog1.Execute then begin S:=sOpenDialog1.FileName; Icon:=TIcon.Create; StrPCopy(Pch,S); Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex); sSpeedButton1.Glyph.Width:= Icon.Width; sSpeedButton1.Glyph.Height:= Icon.Height; sSpeedButton1.Glyph.Canvas.Draw(0, 0, Icon); Icon.Free; end; end else begin ShellExecute (Form1.Handle, nil, PChar(S), nil, nil, SW_RESTORE); end; end; Всё работает нормально, ярлык отображается, но как только закрываю программу, выскакивает ошибка access violation at address 00000000 В интернете естественно искал, но нашёл только одну похожую тему. Человек делал что-то похожее на то, что делаю я, только в 2004 году . - ссылка Внятного ответа не было. Будьте добры, помогите |