Поиск TImage по свойству Tag - PullRequest
2 голосов
/ 09 июля 2020

Я использую C ++ Builder, и у меня есть 64 TImage элементов управления с разными Tag значениями. Могу ли я как-нибудь найти изображение по его тегу? Мне это нужно, потому что моя функция должна перемещаться между двумя объектами (которые являются изображениями), добавляя 1 к их Tag s. Я использую библиотеку VCL.

1 Ответ

3 голосов
/ 09 июля 2020

В VCL нет функции, которая могла бы сделать это за вас. Вам нужно будет вручную l oop через свойство Components[] владельца TForm или свойство Controls[] Parent элементов управления TImage, проверяя каждый компонент / элемент управления на TImage перед доступ к их Tag, например:

TImage* TMyForm::FindImageByTag(NativeInt ATag)
{
    for(int i = 0; i < ComponentCount /* or: SomeParent->ControlCount */; ++i)
    {
        if (TImage *img = dynamic_cast<TImage*>(Components[i] /* or: SomeParent->Controls[i] */))
        {
            if (img->Tag == ATag)
                return img;
        }
    }
    return NULL;
}
TImage *img = FindImageByTag(...);
if (img)
    img->Tag = img->Tag + 1;

В качестве альтернативы вы должны хранить указатели на свои TImage элементы управления в своем собственном массиве, который затем можно индексировать в / l oop через, когда необходимо, например:

private:
    TImage* Images[64];

...

__fastcall TMyForm::TMyForm(TComponent *Owner)
    : TForm(Owner)
{
    Images[0] = Image1;
    Images[1] = Image2;
    Images[2] = Image3;
    ...
    Images[63] = Image64;
}

TImage* TMyForm::FindImageByTag(NativeInt ATag)
{
    for(int i = 0; i < 64; ++i)
    {
        if (Images[i]->Tag == ATag)
            return Images[i];
    }
    return NULL;
}

При заполнении массива, если вы не хотите жестко кодировать 64 указателя по отдельности, вы можете вместо этого использовать al oop:

__fastcall TMyForm::TMyForm(TComponent *Owner)
    : TForm(Owner)
{
    int idx = 0;
    for(int i = 0; (i < ComponentCount /* or: SomeParent->ControlCount */) && (idx < 64); ++i)
    {
        TImage *img = dynamic_cast<TImage*>(Components[i] /* or: SomeParent->Controls[i] */)
        if (img)
            Images[idx++] = img;
    }
}

В качестве альтернативы, используя метод формы FindComponent():

__fastcall TMyForm::TMyForm(TComponent *Owner)
    : TForm(Owner)
{
    int idx = 0;
    for(int i = 1; i <= 64; ++i)
    {
        TImage *img = dynamic_cast<TImage*>(FindComponent(_D("Image")+String(i)));
        if (img)
            Images[idx++] = img;
    }
}
...