Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уменьшение кода.Компоненты с похожими именами. Как же обратиться к компонентам? 
V
    Опции темы
SkyAngel
Дата 13.2.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.1.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



В общем такая проблема: по воле судьбы мне необходимо 15 компонентов TImage. По сути их задачи практичеки похожи. Точнее обработчик почти один и тот же. В общем названия каждого компоненты - ImageIDXX ( где XX - номер Timage. При числах от 1 до 9 пишеться 01-09). 
В коде есть момент, где каждому компоненту необходимо присвоить свою картинку, в зависимости от условий. Картинки могут повторяться. 
Мне очень хотелось бы организовать цикл с оператором "For". Однако вся проблема в том, что я не знаю как обратиться к компоненту с другим именем в цикле.
 То есть логично должно выглядеть так:
For i:= 1 to 15 do begin
Image+i.picture.loadFromFile:=x;
end;

Мне необходим рабочий вариант, потому что каждому TImage необходимо придать не одно значение... И 45 строк кода, почти идентичным мне не нравяться...
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 13.2.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Используй свойство tag. В цикле проверяй это свой свойство. Твои XX - это и будет tag.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
SkyAngel
Дата 13.2.2009, 00:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.1.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Пример из просторов Интернета:

 
Код
var
  i: integer;
begin
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TEdit then
    begin
      TEdit(Components[i]).Text := PString(Components[i].Tag)^;
      DisposeStr(PString(Components[i].Tag));
    end;
end;




Однако я не разобрался - как мне обратиться к этому объекту? TEdit(Components[i]) - это непосредственно имя компонента? или как?

Это сообщение отредактировал(а) SkyAngel - 13.2.2009, 01:23
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 13.2.2009, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Чего ты пристал к имени? Указываешь каждому компоненту свой tag по порядку. Затем циклом проходишься по всем компонентам и ищешь нужный тебе. Вот допустим у тебя 15 TImage. Тебе нужно первые 5 скрыть. Делаешь:

Код

var
  i: integer;
begin
  for i := 0 to ComponentCount - 1 do //  проходимся по всем компонентам
    if Components[i] is TImage then // если нам попался TImage
      if (TImage(Components[i]).Tag >= 1) and (TImage(Components[i]).Tag <= 5 )  // и у него tag от 1 до 5 
      then TImage(Components[i]).Hide;  // то скрываем Image
end;


Это сообщение отредактировал(а) Poseidon - 13.2.2009, 01:29


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
StingWINg
Дата 13.2.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.11.2008

Репутация: нет
Всего: нет



Я бы посоветовал задать массив TImage`й. Как они создаются в программе? Динамически или на форму вытаскиваешь?
Код

Img: array[1..15] of TImage;
..................
//Создание имэджей на OnCreate, например
for i:=1 to 15 do begin
  Img[i]:=TImage.Create(MainForm);
    with Img[i] do begin
      Parent:=MainForm;
      Left:=...;
      //etc. все необходимые свойства
    end;
end;

А дальше как обращатся с массивом, думаю известно. smile 
PM MAIL ICQ   Вверх
THandle
Дата 13.2.2009, 10:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



StingWINg, зачем какой то массив?

Можно либо с тегами, как показал Poseidon, или же можно поиграться и через имя с помощью FindComponent.
PM   Вверх
JSinx
Дата 13.2.2009, 11:00 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.12.2006

Репутация: нет
Всего: 1



Цитата(THandle @ 13.2.2009,  10:48)
StingWINg, зачем какой то массив?

Можно либо с тегами, как показал Poseidon, или же можно поиграться и через имя с помощью FindComponent.

Как вариант, если часто нужно обращаться к этим картинкам,то это будет работать быстрее, чем перебирать все компоненты приложения.
PM MAIL   Вверх
StingWINg
Дата 13.2.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.11.2008

Репутация: нет
Всего: нет



THandle, так как 
Цитата(SkyAngel @  13.2.2009,  00:11 Найти цитируемый пост)
В общем такая проблема: по воле судьбы мне необходимо 15 компонентов TImage. По сути их задачи практичеки похожи. Точнее обработчик почти один и тот же.

То очень может быть, что удобней объявить их массивом. Как пример - они ведь врядли по форме разбросаны, т.е. они как-нибудь все выравнены, так вот можно положение связать с индексом или вручную кидать на форму и расставлять. В общем вопрос удобства  и личных предпочтений. Исходники я не видел, поэтому судить о том, что лучше не буду! smile 
PM MAIL ICQ   Вверх
THandle
Дата 13.2.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Тогда лучше массива использовать TList. Можно и в случае с динамическим созданием использовать и с просто накиданными на форму TImag'ами smile
PM   Вверх
SkyAngel
Дата 13.2.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.1.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Цитата(JSinx @  13.2.2009,  11:00 Найти цитируемый пост)
Цитата(THandle @ 13.2.2009,  10:48)
StingWINg, зачем какой то массив?

Можно либо с тегами, как показал Poseidon, или же можно поиграться и через имя с помощью FindComponent.

Как вариант, если часто нужно обращаться к этим картинкам,то это будет работать быстрее, чем перебирать все компоненты приложения. 


Да, так и есть. Мне дейстивтельно надо к ним часто обращаться. А поподробнее про функцию FindComponent? Какое значение она отдаёт? Какова сигнатура? Маленький примерчик, если не сложно =)
PM MAIL ICQ Skype   Вверх
THandle
Дата 13.2.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



SkyAngel, поиск рулит:

http://forum.vingrad.ru/act-Search/CODE/sh...nent/index.html

Буквально вчера:

http://forum.vingrad.ru/index.php?showtopi...t&p=1784111

Если часто, то я бы сначала заполнял бы(в OnCreate например) некий TList этими TImage'ми, а потом с ним работал, наверное smile
PM   Вверх
SkyAngel
Дата 13.2.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.1.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



По сути написал - и параллельно нашёл всё что надо. Большое спасибо. Вот это действительно  то, что мне надо было!
PM MAIL ICQ Skype   Вверх
SkyAngel
Дата 13.2.2009, 17:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.1.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Чтобы не создавать новую тему - может кто-нибудь ответит - как создать маленькую кнопочку типа TbitBtn в заголовке страниц TPageControl? Очень необходимо маленькая кнопочка "Обновить" =)
PM MAIL ICQ Skype   Вверх
THandle
Дата 13.2.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



SkyAngel, в правилах вроде бы ясно написано... но... повторюсь:

Модератор: Пожалуйста, один топик - один вопрос.

Создай новую тему, незачем смешивать вопросы. Будущему поколению неудобно будет искать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0899 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.