Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Уменьшение кода.Компоненты с похожими именами.


Автор: SkyAngel 13.2.2009, 00:11
В общем такая проблема: по воле судьбы мне необходимо 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 строк кода, почти идентичным мне не нравяться...

Автор: Poseidon 13.2.2009, 00:27
Используй свойство tag. В цикле проверяй это свой свойство. Твои XX - это и будет tag.

Автор: SkyAngel 13.2.2009, 00:55
Пример из просторов Интернета:

 
Код
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]) - это непосредственно имя компонента? или как?

Автор: Poseidon 13.2.2009, 01:29
Чего ты пристал к имени? Указываешь каждому компоненту свой 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;

Автор: StingWINg 13.2.2009, 10:03
Я бы посоветовал задать массив 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 

Автор: THandle 13.2.2009, 10:48
StingWINg, зачем какой то массив?

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

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

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

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

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

То очень может быть, что удобней объявить их массивом. Как пример - они ведь врядли по форме разбросаны, т.е. они как-нибудь все выравнены, так вот можно положение связать с индексом или вручную кидать на форму и расставлять. В общем вопрос удобства  и личных предпочтений. Исходники я не видел, поэтому судить о том, что лучше не буду! smile 

Автор: THandle 13.2.2009, 12:43
Тогда лучше массива использовать TList. Можно и в случае с динамическим созданием использовать и с просто накиданными на форму TImag'ами smile

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

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

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


Да, так и есть. Мне дейстивтельно надо к ним часто обращаться. А поподробнее про функцию FindComponent? Какое значение она отдаёт? Какова сигнатура? Маленький примерчик, если не сложно =)

Автор: THandle 13.2.2009, 16:36
SkyAngel, поиск рулит:

http://forum.vingrad.ru/act-Search/CODE/show/searchid-95abac04666d7dbc67808e2a5422c5f5/search_in-posts/result_type/topics/flag/search/highlite/findcomponent/index.html

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

http://forum.vingrad.ru/index.php?showtopic=247357&view=findpost&p=1784111

Если часто, то я бы сначала заполнял бы(в OnCreate например) некий TList этими TImage'ми, а потом с ним работал, наверное smile

Автор: SkyAngel 13.2.2009, 16:39
По сути написал - и параллельно нашёл всё что надо. Большое спасибо. Вот это действительно  то, что мне надо было!

Автор: SkyAngel 13.2.2009, 17:07
Чтобы не создавать новую тему - может кто-нибудь ответит - как создать маленькую кнопочку типа TbitBtn в заголовке страниц TPageControl? Очень необходимо маленькая кнопочка "Обновить" =)

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

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

Создай новую тему, незачем смешивать вопросы. Будущему поколению неудобно будет искать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)