Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
1

Удалить Timage не затронув Tlabel ?

15.01.2013, 22:58. Показов 873. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
На форме есть карта района помещенная в ScrollBox1.
динамически создаю TImage (100-200....)количество всегда меняется. и помещаю их на карту

C++
1
2
3
4
5
6
7
8
9
10
11
12
    for (int i = 0; i < StringGrid1->RowCount; i++)
    {
         TImage *image;
     if (StringGrid1->Cells[8][i]=="")// если нет фото места то обозначить красным
         {
         image = new TImage(point_red);
         image->Parent = Karta_rajona->Parent;
         image->AutoSize    = point_red->AutoSize;
         image->Transparent = point_red->Transparent;
         image->Picture     = point_red->Picture;
         }
              }
и точно так-же динамически создаю Tlabel и тоже помещаю на карту района.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
for (int i = 0; i < ComboBox_node_range->Items->Count; i++)
 { 
    TLabel* LN= new TLabel(Karta_rajona);
 
    LN->Name = "Label_Pos"+IntToStr(ComboBox_node_range->ItemIndex+1);
        //LN = dynamic_cast <TLabel *> ( this );
    LN->Parent = Karta_rajona->Parent;
    LN->AutoSize = false;
    LN->Caption = "";
    LN->Enabled = true;
    LN->Visible = true;
    LN->Font->Style = TFontStyles() << fsBold;
    LN->Font->Size = 9;
    LN->Color = clInfoBk;
    LN->Transparent = true;
    LN->Width = 25;
    LN->Height = 25;
 
    LN->OnMouseMove = showinfo;
    LN->OnClick = Label_NodClick;
    LN->OnMouseLeave=Label_NodMouseLeave;
 
ScrollBox1->HorzScrollBar->Position =
StrToInt(StringGrid_node_range->Cells [ComboBox_node_range->ItemIndex*4+2][4]); // запомненные координаты
ScrollBox1->VertScrollBar->Position =
StrToInt(StringGrid_node_range->Cells [ComboBox_node_range->ItemIndex*4+3][4]); // запомненные координаты
LN->Left =
StrToInt(StringGrid_node_range->Cells [ComboBox_node_range->ItemIndex*4+2][3]);// установка центра картинки
LN->Top  =
StrToInt(StringGrid_node_range->Cells [ComboBox_node_range->ItemIndex*4+3][3]);// на точке карты
  }
при наведении мышки на лейбл
C++
1
LN->OnMouseMove = showinfo;
получаю информацию (о месте частота и другие данные)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//------------------------------------------------------------------------------
//                        OnMouseMove
//  Показ информации о Ноде при наведении мышки на Labelxx
//
//##############################################################################
void __fastcall TForm2::showinfo(TObject *Sender, TShiftState Shift, int X, int Y)
//##############################################################################
{
 
// находим имя Label при наведении на нее мышкой
                static TLabel *label = new TLabel(label); //   NULL Form2
                label = dynamic_cast <TLabel *> ( Sender );
if (CheckBox2->Checked == false)label->Enabled=false;//выключение информации о абонате
if (CheckBox2->Checked == true)
 {
  AnsiString InfoNode, LabelName = ((TLabel*) Sender)->Name;
        // удаляем из полученного имени "Label_Nod" и остается сам номер лейбы
        LabelName.Delete(1, 9);// удаляю с 1 по 9 символ в имени "Label_Nod1"
        int index = (LabelName.ToInt())-1+lat;
        ComboBox3->ItemIndex = index;//NODE
        ComboBox8->ItemIndex = index;//CUDA
        ComboBox4->ItemIndex = index;//DownStream
        ComboBox6->ItemIndex = index;//Canal
        InfoNode = "Node - "+(ComboBox3->Text)+"\n\r""CUDA - "+(ComboBox8->Text)+
"\n\r""DownStream - "+(ComboBox4->Text)+"\n\r""Canal - "+(ComboBox6->Text);
   label->Enabled = true;
   label->AutoSize=true;
   label->Transparent=false;
   label->Caption= InfoNode;
  }
 
}
когда мышка покидает лейбл
C++
1
LN->OnMouseLeave=Label_NodMouseLeave;
и информация исчезает с экрана.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//---------------------------------------------------------------------------
//                 OnMouseLeave
//  сброс информации из Caption на Node флажках
//
//##############################################################################
void __fastcall TForm2::Label_NodMouseLeave(TObject *Sender)
//##############################################################################
{
               //   static TLabel *label = NULL;
                //LN = dynamic_cast <TLabel *> ( Sender );  LN
                TLabel * label = (TLabel*)Sender;
 
label->Caption ="";
label->Height = 25;
label->Width = 25;
label->Transparent=true;
label->AutoSize = false;
 
}

НО теперь оно НО!
если я удаляю динамически созданные Timage
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//                 CheckBox1Click (покажи все адреса на карте)
//
//    постановка всех абонатов на карту и - обратно удаление всех установленных
//
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//##############################################################################
void __fastcall TForm2::CheckBox1Click(TObject *Sender)
//##############################################################################
// удаление установленых на карту меток абонатов  //////////////////////////////
////////////////////////////////////////////////////////////////////////////////
{   //  if ( foto == true) return; // если выведено фото то ничего не делать
if (CheckBox1->Checked == false)
   { // metka = false;
     for(int i=0;i<Form2->ComponentCount; i++)  //
 {
  if(Components[i]->ClassNameIs("TImage"))// Form2->
   ((TImage*)Form2->Components[i])->DestroyComponents();
 }
ТО и исчезают и TLabel-ы
когда еще в начале я пользовал обычные лейбелы установленные непосредственно на карте в самом буилдере - то все работает! (и сейчас те старые лейблы еще которые я не убрал - прекрасно активируются и им не мешает
C++
1
((TImage*)Form2->Components[i])->DestroyComponents();
Подскажите : как мне удалить Timage и при этом Tlabel остануться не тронутыми?
уже совсем запутался . может и есть что-то очень простое которое ятак и не нашел.
гугле мне сказал что при удалении - удаляются все динамические объекты? мало мне верится.
может я не неправильно все создаю?
примеры я показал.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2013, 22:58
Ответы с готовыми решениями:

Как удалить TImage* зная только его Hint?
Всем Привет!:senor: Появилась задачка. есть динамически созданные объекты типа TImage у них есть...

Timage, создание TLabel
1. Загрузка PNG в TImage сохранением прозрачности.. до сих пор, у кого не спрашивал, никто ничего...

Связь между динамически созданными компонентами (TImage и TLabel)
Здравствуйте! У меня возникла проблема при попытке связи динамически созданных TImage и TLabel....

Как программно удалить весь текст из TLabel?
Здравствуйте, пожалуйста подскажите, как программно удалить весь текст из компонента TLabel, если у...

8
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.01.2013, 01:15 2
Цитата Сообщение от lifeforce Посмотреть сообщение
image = new TImage(point_red);
Цитата Сообщение от lifeforce Посмотреть сообщение
TLabel* LN= new TLabel(Karta_rajona);
Зачем разные владельцы?
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
16.01.2013, 01:20  [ТС] 3
BRcr,

Цитата Сообщение от BRcr Посмотреть сообщение
Зачем разные владельцы?
не знаю как это может повлиять? вот поэтому и прошу помощи.
совсем заблудился во всех этих выражениях кто владелец , кто динамический , кто к кому относится и т.д.
но если установлены обыкновенные лейболы (непосредвственно из буилдера) то никаких проблем нет.
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
16.01.2013, 01:34  [ТС] 4
лейбл находится поверх флага и при наведении на него мышки появляется вот такое сообщение.
все другие флаги не активны в этот момент.
Миниатюры
Удалить Timage не затронув Tlabel ?  
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
16.01.2013, 01:40  [ТС] 5
маленькие красные точки это и есть TImage (динамически созданные) их я и убираю с карты когда захочу.
но вместе с ними и пропадают Tlabel . хотя я задаю найти все Timage и их удалить. но в результате получаю что удаляются все динамически созданные объекты
где-то я что-то упустил и не могу второпить.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.01.2013, 12:57 6
Лучше всего, конечно, не использовать тучи TImage и лейблов, это лишнее, а все отрисовывать на битмап в памяти и его потом уже выводить... это так, на будущее.

За каким вообще DestroyComponents() использовать? Выделил память оператором new - освободи оператором delete, все остальное ни к чему.
По хорошему надо просто пару массивов указателей для картинок и лейблов, чтоб ничего потом не искать.

Вот это в объявлении класса формы:
C++
1
2
vector<TImage *> red_points;
vector<TLabel *> some_labels;
Далее поправки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TImage *img;
    for (int i = 0, k = 0; i < StringGrid1->RowCount; ++i)
    {
        if (StringGrid1->Cells[8][i]=="")// если нет фото места то обозначить красным
         {
             img = new TImage( this );  
             img->Name = "red_point_" + IntToStr( k++ );
             img->Parent = Karta_rajona->Parent;
             img->AutoSize    = point_red->AutoSize;
             img->Transparent = point_red->Transparent;
             img->Picture     = point_red->Picture;
             red_points.push_back( img );
         }
    }
C++
1
2
3
4
5
6
7
    TLabel* LN
    for (int i = 0; i < ComboBox_node_range->Items->Count; i++)
 { 
    LN = new TLabel( this ); 
    //...
    some_labels.push_back( LN );
  }
Тут утечка памяти. Зачем здесь память выделять?
C++
1
2
3
  // находим имя Label при наведении на нее мышкой
                //static TLabel *label = new TLabel(label);           <--- это бред
                TLabel *label = dynamic_cast <TLabel *> ( Sender );
C++
1
2
3
4
5
6
7
if (CheckBox1->Checked == false)
   { // metka = false;              
    for ( std::vector <TImage *> ::iterator it = red_points.begin( ), end = red_points.end( ); it != end; ++it )
    {
        delete *it;
    }
    red_points.clear( );
1
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
16.01.2013, 13:24  [ТС] 7
BRcr,
Спасибо!
Очень интересное решение . сейчас начну ваять.

Добавлено через 19 минут
чёт с этим у меня не получается
C++
1
2
vector<TImage *> red_points;
vector<TLabel *> some_labels;
[BCC32 Error] MSMama.cpp(711): E2451 Undefined symbol 'vector'
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.01.2013, 13:59 8
#include <vector>
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
20.01.2013, 13:01  [ТС] 9
Так ничего у меня с классами не получилось. все время одна и тажа ошибка.
Но решение оказалось куда более простым!
все было связано с владельцами.
вот эта строчка все поставила на место!
C++
1
2
TLabel* LN= new TLabel(Form2);
LN->Parent = Karta_rajona->Parent;
0
20.01.2013, 13:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2013, 13:01
Помогаю со студенческими работами здесь

Удалить пиксели в Timage
хочу вместо кнопки использовать Timage. Но проблема в том, что по краям картинки идет белое поле...

Как настроить RAID-1 не затронув системный диск?
Мне необходимо настроить RAID-1 уже на установленной ОС. Один диск стоит под систему 120 гб далее...

Можно ли поставить Arch не затронув уже установленную Windows?
Можно ли поставить Arch не затронув уже установленную Windows?

Как по нажатию мыши менять TImage и перерисовывать на него bmp с другого TImage?
Есть два TImage. На Image1 картинка TBitmap, Image1 растянут на всю форму. При нажатии на Image1 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru