Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2014, 10:54
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Загрузить иконку ярлыка в кнопку

Здравствуйте, помогите пожалуйста.
Я умею загружать в image путь до файла и его ярлык. То-есть по нажатию на image у меня отображается иконка и запускается программа...

Как мне сделать тоже самое на кнопки в которые можно загружать картинки, типа speedbutton.
Загружается всё через опендиалог
Подскажите пожалуйста!
Ответить с цитированием
  #2  
Старый 07.04.2014, 11:22
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Gareth
Я умею загружать в image путь до файла и его ярлык. То-есть по нажатию на image у меня отображается иконка и запускается программа...

Как мне сделать тоже самое на кнопки в которые можно загружать картинки, типа speedbutton.
Загружается всё через опендиалог
Компонент TSpeedButton иконки не умеет отображать, он отображает TBitmap, поэтому для отображения иконки в TSpeedButton нужно её преобразовать в TBitmap.
Примерно как-то так:
Код:
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  
Старый 07.04.2014, 12:03
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А есть кнопки которые отображают иконки как image ? Что бы не маятся с этими преобразованиями)
Делаю программу, по нажатию какой либо кнопки на мышке будет вызываться моя форма с ярлыками.


А на счет BitBtn ? С ним так же надо будет преобразовывать ?

Последний раз редактировалось Gareth, 07.04.2014 в 14:47.
Ответить с цитированием
  #4  
Старый 08.04.2014, 10:33
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Компонент TSpeedButton иконки не умеет отображать, он отображает TBitmap, поэтому для отображения иконки в TSpeedButton нужно её преобразовать в TBitmap.
Примерно как-то так:
Код:
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;
Этот код позволяет вставлять в speedbutton только ico, когда вставляю файл например exe, jpg или что-то другое, на кнопке появляется белый квадрат.
Как можно сделать так, что бы отображался любой ярлык?)
Ответить с цитированием
  #5  
Старый 08.04.2014, 10:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Gareth
Цитата:
Сообщение от poli-smen
Код:
.....
    ico.Handle := ExtractIcon(HInstance, 'C:\WINDOWS\system32\calc.exe', 0);
.....
Этот код позволяет вставлять в speedbutton только ico, когда вставляю файл например exe, jpg или что-то другое, на кнопке появляется белый квадрат.
Вообще-то "calc.exe" это вовсе никакой не "ico", а очень даже "exe".
Цитата:
Сообщение от Gareth
Как можно сделать так, что бы отображался любой ярлык?)
Если я правильно тебя понял, тебе нужно что-то вроде такого "Получить иконку файла по ярлыку" или такого "Получить иконку из ярлыка"
Ответить с цитированием
  #6  
Старый 08.04.2014, 14:52
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Poli-smen я новичок, там на всю страницу код, еще и на англ))

Сейчас доходчиво попробую объяснить что конкретно мне надо

У меня есть панель, на ней хочу сделать кнопки, не важно speedbutton или bitbtn... По нажатию по кнопке, будет открываться opendialog, там я буду выберать нужный себе файл. Картинка файла будет грузится в кнопку.
И по нажатию этой кнопки будет открываться тот файл который я выбрал в opendialog.

Я со всем разобрался, не знаю лишь как загрузить в speedbutton или bitbtn икону ярлыка.
Цитата:
Сообщение от poli-smen
Если я правильно тебя понял, тебе нужно что-то вроде такого Получить иконку из ярлыка
Да, получить его в любую из кнопок (speedbutton, bitbtn)

Помогите пожалуйста понять как это делается .

Последний раз редактировалось Gareth, 08.04.2014 в 16:36.
Ответить с цитированием
  #7  
Старый 08.04.2014, 16:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Gareth
Я со всем разобрался, не знаю лишь как загрузить в speedbutton или bitbtn икону ярлыка.
Честно не могу понять в чём у тебя загвоздка. Выше я уже приводил код, который получает иконку для конкретного файла (в примере было для калькулятора). Осталось только переделать этот код, чтобы он получал иконку из произвольно выбранного (через OpenDialog) файла:
Код:
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  
Старый 08.04.2014, 16:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

В модуле 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  
Старый 09.04.2014, 02:00
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
Хорошо

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  
Старый 09.04.2014, 16:58
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 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  
Старый 09.04.2014, 17:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ведь для этого специально функция Execute у диалога результатом булева, поддерживает такую конструкцию
Код:
...
if sOpenDialog1.Execute then
begin
// Здесь всё что нужно сделать при выборе кнопки OK в диалоге
//
end;
...
если ничего не выбрано (нажата отмена) то ничего и не произойдёт
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (09.04.2014)
  #12  
Старый 15.05.2014, 18:05
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Ведь для этого специально функция Execute у диалога результатом булева, поддерживает такую конструкцию
Код:
...
if sOpenDialog1.Execute then
begin
// Здесь всё что нужно сделать при выборе кнопки OK в диалоге
//
end;
...
если ничего не выбрано (нажата отмена) то ничего и не произойдёт

Помогите с ошибкой, что не так делаю ?
Код:
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 году . - ссылка
Внятного ответа не было. Будьте добры, помогите
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter