Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 526

/ вопрос решён /

Здравствуйте! Уважаемые эксперты! У меня такой вопрос:
Есть очень много кнопок SpeedButton, мне хотелось бы организовать быстрое и удобное присвоение картинки каждой кнопки из имейдж-листа. Ниже приведу код "через >|<опу".
Конечно для вас вопрос слишком простой, но меня он поставил в ступор. Хотелось бы всё зделать все в цикле, что-то типа:
for i:=0 to 5 do
ImageList1.GetBitmap( i, SpeedButton[i].Glyph );
Но, к сожалению, динамическое имя это фантастика =). Надеюсь суть вопроса понятна, надеюсь на помощь.

Приложение:
  1. with ImageList1 do begin
  2. GetBitmap( 1, SpeedButton1.Glyph );
  3. GetBitmap( 2, SpeedButton2.Glyph );
  4. GetBitmap( 3, SpeedButton3.Glyph );
  5. GetBitmap( 4, SpeedButton4.Glyph );
  6. GetBitmap( 5, SpeedButton5.Glyph );
  7. GetBitmap( 6, SpeedButton6.Glyph );
  8.  
  9. end;


Phoenix Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 25 апреля 2008, 17:52
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Phoenix!
Если я правильно понял ваш вопрос, то всё действительно просто.

Цитата:

Но, к сожалению, динамическое имя это фантастика

А вот и нет, совсем не фантастика :-) У формы (TForm) есть метод FindComponent(), который позволяет по имени компонента обратиться к нему. Параметр единственный - имя компонента. Это обычная текстовая строка, которую вы можете формировать любым известным способом. Например, чтобы обратиться ко кнопкам SpeedButton1 .. SpeedButton5, можно написать такой цикл:
for i:=1 to 5 do
  TSpeedButton(FindComponent('SpeedButton'+IntToStr(i))).Glyph:=...;
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 25 апреля 2008, 19:03
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Хороший метод, буду знать!

Ответ #2. Отвечает эксперт: Николай Рубан

Здравствуйте, Phoenix!

Да это можно с использование соответствующего цикла. Достаточно используя соответствующую функцию объекта по имени FindComponent() перечислить все объекты одного типа, а далее просто изменить нужное свойство.
Смотрите код процедуры:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    bmp:TBitmap;
begin
  for i:=1 to 5 do begin  //цикл в котором "пробегаем все компоненты"
     bmp:=TBitmap.Create; //творим битмап
     ImageList1.GetBitmap(i,bmp); //кидаем в него соответствующую картинку
     TSpeedButton(FindComponent(Format('SpeedButton%d',[i]))).Glyph:=bmp; //отдаем битмап кнопке
     bmp.Free; //разрушаем битмап
  end;
end;

Good Luck!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 25 апреля 2008, 19:04
Оценка за ответ: 5

Комментарий к оценке: Благодарен за подробнейшее разъяснение!

Ответ #3. Отвечает эксперт: Feniks

Здравствуйте, Phoenix!
Добавлю ко всему выше изложенному...
Если вам прийдется в ходе работы приложения часто менять картинки этих кнопок, имхо, постоянный циклы по перебору компонентов - не очень есть хорошо. Может вам тут лучше использовать массивы с указателями на эти компки ? Т.е. в событии крит формы вы сначало один раз ищите все эти кнопки и заносите их в массив и уже в дальнейшем обращаетесь в массив.
Сначало делаем переменную:

var aMySpeedBtn : array [1 .. 10] of TSpeedButton;
Далее ищим кнопки и заносим их в массив:
for i:=1 to 10 do
   aMySpeedBtn[i] := FindComponent(Format('SpeedButton%d',[i])) as TSpeedButton;
И уже далее, где это вам необходимо по коду пишите:
aMySpeedBtn[0].Glyph := ... ;
А индексы массива можно соглосовать с номерами картинок в листе для удобства.
P.S. Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 30 апреля 2008, 13:26
Оценка за ответ: 5

Комментарий к оценке: отлично! так действительно лучше

Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 26 апреля 2008, 15:26; участников в обсуждении: 4.
Phoenix

Phoenix (статус: Посетитель), 25 апреля 2008, 19:20 [#1]:

низкий поклон вам, эксперты =)
Dron

Dron (статус: Студент), 25 апреля 2008, 19:28 [#2]:

А можно впридачу к поклону оценки? ;-)
С уважением.
Phoenix

Phoenix (статус: Посетитель), 25 апреля 2008, 20:58 [#3]:

да хотелось бы оценки, да вот по нажатию на "отправить" выдает "К сожалению, ответ, который Вы оцениваете, удалён."
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 25 апреля 2008, 21:06 [#4]:

Цитата:

по нажатию на "отправить" выдает "К сожалению, ответ, который Вы оцениваете, удалён."

Проблема решена. Теперь оценки за ответы можно выставить. Приносим извинения за неудобства.
Phoenix

Phoenix (статус: Посетитель), 25 апреля 2008, 21:15 [#5]:

Спасибо и тебе, Администратор!
Вадим К

Вадим К (статус: Академик), 26 апреля 2008, 15:26 [#6]:

К Phoenix.
Предчувствую, что этим всем кнопкам ещё и обработчики назначены. В таком случае лучше использовать TActionList/TActionManager.
Галочка "подтверждения прочтения" - вселенское зло.

31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.03 сек.