|
Вопрос # 1 526/ вопрос решён / |
|
Здравствуйте! Уважаемые эксперты! У меня такой вопрос:
Есть очень много кнопок SpeedButton, мне хотелось бы организовать быстрое и удобное присвоение картинки каждой кнопки из имейдж-листа. Ниже приведу код "через >|<опу".
Конечно для вас вопрос слишком простой, но меня он поставил в ступор. Хотелось бы всё зделать все в цикле, что-то типа:
for i:=0 to 5 do
ImageList1.GetBitmap( i, SpeedButton[i].Glyph );
Но, к сожалению, динамическое имя это фантастика =). Надеюсь суть вопроса понятна, надеюсь на помощь.
Приложение: Переключить в обычный режим- with ImageList1 do begin
- GetBitmap( 1, SpeedButton1.Glyph );
- GetBitmap( 2, SpeedButton2.Glyph );
- GetBitmap( 3, SpeedButton3.Glyph );
- GetBitmap( 4, SpeedButton4.Glyph );
- GetBitmap( 5, SpeedButton5.Glyph );
- GetBitmap( 6, SpeedButton6.Glyph );
-
- end;
 |
Вопрос задал: 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 (статус: Посетитель), 25 апреля 2008, 19:20 [#1]:
низкий поклон вам, эксперты =)
|
|
Dron (статус: Студент), 25 апреля 2008, 19:28 [#2]:
А можно впридачу к поклону оценки?
С уважением.
|
|
Phoenix (статус: Посетитель), 25 апреля 2008, 20:58 [#3]:
да хотелось бы оценки, да вот по нажатию на "отправить" выдает "К сожалению, ответ, который Вы оцениваете, удалён."
|
|
Ерёмин А.А. (статус: *Администратор), 25 апреля 2008, 21:06 [#4]:
Цитата:
по нажатию на "отправить" выдает "К сожалению, ответ, который Вы оцениваете, удалён."
Проблема решена. Теперь оценки за ответы можно выставить. Приносим извинения за неудобства.
|
|
Phoenix (статус: Посетитель), 25 апреля 2008, 21:15 [#5]:
Спасибо и тебе, Администратор!
|
|
Вадим К (статус: Академик), 26 апреля 2008, 15:26 [#6]:
К Phoenix.
Предчувствую, что этим всем кнопкам ещё и обработчики назначены. В таком случае лучше использовать TActionList/TActionManager.
Галочка "подтверждения прочтения" - вселенское зло.
|
31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|