![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 году . - ссылкаВнятного ответа не было. Будьте добры, помогите ![]() |