Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > проблемы с указателями на TImage


Автор: artsb 15.1.2009, 00:11
Всем привет!

Я, так сказать, балуюсь...
Так баловался, что запутался в указателях smile

Код

TForm1 *Form1;
TImage *iSender;
bool flag = false;

//---------------------------------------------------------------------------
void __fastcall TForm1::iBtnMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
if(!flag)
{
  iSender = (TImage*)Sender;
  // всякие операции и изменение изображения iSender
  flag = true;
  Timer1->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// получение координат
if(/* проверка: не ушёл ли курсор */)
{
  // изменение картинки обратно
  iSender = NULL;
  flag = false;
  Timer1->Enabled = false;
}
}


На форме панель. На панели 6 объектов типа TImage. У всех у них OnMouseMove = iBtnMouseMove. При наведении на один из Image'ов сохраняю указатель на него в iSender для того, чтобы знать у кого потом менять картинку обратно.
Так вот, при первом наведении всё ОК. При последующих iSender = NULL. Не могу понять почему...

Автор: Romikgy 15.1.2009, 00:35
логически нужны события mouseenter & mouseleave
у тя уж очень не безопасный код , сендер у тя будет формой (или батоном харит перепроверять) а ты его к имаге ....

Автор: mrbrooks 15.1.2009, 09:02
artsb, я так делать бы не стал. Попробуй так.

Код

void __fastcall TForm1::iBtnMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  TImage *img = dynamic_cast<TImage*>(Sender);
  MStatusBar->SimpleText = img->Name;
}


Вот мой пример.

Автор: mrbrooks 15.1.2009, 09:06
Кстати по поводу создание события OnEnter для TImage - хорошая мысль.

Автор: artsb 15.1.2009, 13:31
2Romikgy
Цитата(Romikgy @  15.1.2009,  00:35 Найти цитируемый пост)
логически нужны события mouseenter & mouseleave

Не помешали бы. Кстати, начиная с 2006-го они есть.

Цитата(Romikgy @  15.1.2009,  00:35 Найти цитируемый пост)
у тя уж очень не безопасный код , сендер у тя будет формой (или батоном харит перепроверять) а ты его к имаге .... 

Почему??? Это событие назначено только Image'ам. Как там может быть форма?


2mrbrooks
Хм.. сейчас попробую.

Цитата(mrbrooks @  15.1.2009,  09:06 Найти цитируемый пост)
Кстати по поводу создание события OnEnter для TImage - хорошая мысль.

Мысль хорошая - это точно. Но нужно писать свой компонент. А я не умею (точнее, не нашёл ни каких толковых статей по их написанию), да и времени нет.

Автор: Romikgy 15.1.2009, 14:14
http://www.booksgid.com/programmer/4758-sozdanie-originalnykh-komponent-v-srede.html
http://www.delphimaster.ru/articles/components_gauge.html
http://mportal.narod.ru/Delphi/NewComponent.html
http://www.realcoding.net/article/view/839

Автор: artsb 15.1.2009, 14:16
Решил проблему!

У меня был вот такой кусок:
Код

AnsiString nm = iSender->Name.Delete(1, 4).LowerCase();

Я та думал, что возвращается изменённая строка, а исходная остаётся. А оказывается, исходная тоже меняется. В общем, я сделал так:
Код

AnsiString nm = iSender->Name.LowerCase();
nm.Delete(1, 4);
// теперь использую nm

Теперь всё ОК.

Ещё раз всем спасибо за участие!

Добавлено через 1 минуту и 13 секунд
Мне плюс за мою же глупость! smile

Добавлено через 4 минуты и 1 секунду
Romikgy, всё для Delphi :(

Автор: Romikgy 15.1.2009, 14:48
artsb, билдер очень похож на дельфи , основы можно взять из них а писать и на си
http://www.sysman.ru/index.php?showtopic=8423

Автор: artsb 15.1.2009, 15:30
Цитата(Romikgy @  15.1.2009,  14:48 Найти цитируемый пост)
билдер очень похож на дельфи , основы можно взять из них а писать и на си

Я знаю. Даже писал небольшие программки на Delphi. Но просто, когда начинаю разбирать код, приходится перенапрягаться smile Привычней всё-таки C++.

Добавлено через 21 секунду
Но всё-равно спасибо.

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