Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2012, 00:10   #1
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию [Решено] Delphi => Builder или как двигать объекты

Помогите перевести две эти строчки из Delphi на Builder C++. Я в ООП нуб.
Код:
releasecapture;
sendmessage((sender as twincontrol).Handle, wm_syscommand,$f012, 0);
=>>>
ReleaseCapture;
SendMessage((Sender-> as TWinControl)->Handle, wm_syscommand,$f012, 0);
Что вместо конструкции с "as" поставить?

СПОЙЛЕР:
Цитата:
P.S. все началось с того что панели по форме не хотят "двигаться мышкой". Дельфисты говорят что выше написанный код хорош. http://www.programmersforum.ru/showthread.php?t=36548 А то что ниже работает, но как-то туго. (указатель передаю для универсальности, проблемы с коорд. панель двигается "слабо" да еще и "невидимо")
Код:
void __fastcall TF_frontend::Panel1MouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{	if(!Shift.Contains(ssLeft))return;
	dx=X-Panel1->Left;
	dy=Y-Panel1->Top;
	p=Panel1;
}
void __fastcall TF_frontend::Panel1MouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
{	if(!Shift.Contains(ssLeft))return;
	p->Left=X-dx;
	p->Top=Y-dy;
}
Решения:
http://www.programmersforum.ru/showp...74&postcount=2
http://www.programmersforum.ru/showp...22&postcount=5
http://www.programmersforum.ru/showp...81&postcount=6
Пишу на чистом С, плюсы спилил.

Последний раз редактировалось Вадим Мошев; 15.05.2018 в 19:26.
LynXzp вне форума Ответить с цитированием
Старый 06.10.2012, 01:02   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

ReleaseCapture применяют, когда нужно двигать всю форму приложения по экрану. А если нужно перемещать панель в пределах формы, используйте такую конструкцию__
Код:
//---------------------------------------------------------------------------
     int mx, my;
//---------------------------------------------------------------------------

void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{ 
//      ReleaseCapture();
//      Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
//      Perform(WM_SYSCOMMAND, 0xF012, 0);
      mx = X; my = Y; 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    if (Shift.Contains(ssLeft))
     { Panel1->Left += X-mx; Panel1->Top += Y-my; }
}
//---------------------------------------------------------------------------
nick42 вне форума Ответить с цитированием
Старый 06.10.2012, 01:28   #3
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Спасибо, работает!

Тогда не понял чего мой код не работает. Видимо утро вечера мудренее. Еще раз спасибо.
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 06.10.2012, 01:41   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Цитата:
Сообщение от LynXzp Посмотреть сообщение
Спасибо, работает!

Тогда не понял чего мой код не работает. Видимо утро вечера мудренее. Еще раз спасибо.
А я и утром вряд ли пойму..., но ключевым моментом здесь - операция += . Если через простое равенство, то панель на время перемещения нужно делать Enabled - false и возвращать Enabled - true после отжатия левой кнопки.
nick42 вне форума Ответить с цитированием
Старый 09.10.2012, 17:37   #5
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Тема уже решена, но для тех кто сюда попадет за подобным решением:
nick42, Про утро это я думал про себя
//Panel1 стала GroupBox4.
Все работало красиво, спасибо, но решил сделать чтобы не уплывало за границы формы, а чтобы избавится от "=" и оставить только "+=" сделал так:
if(GroupBox4->Left+X-px4<=0) GroupBox4->Left-=GroupBox4->Left;
(Из-за enabled/false терялся фокус при уплывании мышки за границы формы, а при возвращении фокус мог вернутся любому другому "плавающему" элементу)


Полный код красиво плавающей, не заезжающей панельки:
Код:
void __fastcall TF_frontend::GroupBox4MouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{	px4 = X; py4 = Y;}
void __fastcall TF_frontend::GroupBox4MouseMove(TObject *Sender,TShiftState Shift, int X, int Y)
{	if ((Shift.Contains(ssLeft))&(Editmode1->Checked))
		{	if(GroupBox4->Left+X-px4<=0)GroupBox4->Left-=GroupBox4->Left;
			else if (GroupBox4->Left+X-px4+GroupBox4->Width +8 >F_frontend->Width )GroupBox4->Left+=F_frontend->Width -GroupBox4->Width -8 -GroupBox4->Left;
			else GroupBox4->Left+=X-px4;
			if(GroupBox4->Top +Y-py4<=0)GroupBox4->Top -=GroupBox4->Top;
			else if (GroupBox4->Top +Y-py4+GroupBox4->Height+35>F_frontend->Height)GroupBox4->Top +=F_frontend->Height-GroupBox4->Height-35-GroupBox4->Top;
			else GroupBox4->Top +=Y-py4;
		}
}
Еще бы сделать чтобы она на другие панельки не заезжала, а "стыковалась" к ним ))
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 09.10.2012, 21:26   #6
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию Не библиотека, но полезная функция.

А вот код для прекрасного причаливания панелей и вообще любых VCL компонентов с учетом не наезжания/заползания/заплывания/перекрытия всех остальных компонентов на форме.

Код:
int x,y;
TGroupBox *p; // - у меня плавают GroupBox-ы
// вспомогательная функция которая двигает все боксы
void TF_frontend::move(int X,int Y,int N) //N - "номер" того бокса который я сейчас двигаю
{	int x1[3],x2[3],y1[3],y2[3]; //длина массива = кол. плав. -1
// нижеследующие 3 строчки можно было в цикл, но я даж. не знаю как
// таких строчек нужно столько сколько у нас на форме компонентов
// которые нужно "объезжать" минус один (тот кот. у нас в руках)
	x1[0]=GroupBox1->Left;	y1[0]=GroupBox1->Top;	x2[0]=GroupBox1->Width+x1[0];	y2[0]=GroupBox1->Height+y1[0];
	x1[1]=GroupBox2->Left;	y1[1]=GroupBox2->Top;	x2[1]=GroupBox2->Width+x1[1];	y2[1]=GroupBox2->Height+y1[1];
	x1[2]=GroupBox3->Left;	y1[2]=GroupBox3->Top;	x2[2]=GroupBox3->Width+x1[2];	y2[2]=GroupBox3->Height+y1[2];
	if(N<4)
		{N--;	x1[N]=GroupBox4->Left;	y1[N]=GroupBox4->Top;	x2[N]=GroupBox4->Width+x1[N]; y2[N]=GroupBox4->Height+y1[N];	}

	int nx,ny;	// newX & newY
	if(p->Left+X-x<=0)nx=0;
	else if (p->Left+X-x+p->Width +8 >F_frontend->Width )nx=F_frontend->Width-p->Width-8;
	else nx=p->Left+X-x;
	if(p->Top +Y-y<=0)ny=0;
	else if (p->Top +Y-y+p->Height+35>F_frontend->Height)ny=F_frontend->Height-p->Height-35;
	else ny=p->Top+Y-y;

	#define ox (p->Left)
	bool f=true;
		{int mx=ox+p->Width, my=ny+p->Height; // maxX & maxY
		for(int i=0;i<3;i++)	// расчет входят ли новые координаты хотя бы в один уже существующий прямоугольник
			{	if((ox>=x1[i])&(ox<=x2[i])&(ny>=y1[i])&(ny<=y2[i])){f=false;break;}
				if((mx>=x1[i])&(mx<=x2[i])&(my>=y1[i])&(my<=y2[i])){f=false;break;}
				if((ox>=x1[i])&(ox<=x2[i])&(my>=y1[i])&(my<=y2[i])){f=false;break;}
				if((mx>=x1[i])&(mx<=x2[i])&(ny>=y1[i])&(ny<=y2[i])){f=false;break;}
			}
		}
	#undef ox
	if(f)p->Top +=ny-p->Top;

	#define oy (p->Top)
		{int mx=nx+p->Width, my=oy+p->Height; // maxX & maxY
		for(int i=0;i<3;i++)	// расчет входят ли новые координаты хотя бы в один уже существующий прямоугольник
			{	if((nx>=x1[i])&(nx<=x2[i])&(oy>=y1[i])&(oy<=y2[i])){return;}
				if((mx>=x1[i])&(mx<=x2[i])&(my>=y1[i])&(my<=y2[i])){return;}
				if((nx>=x1[i])&(nx<=x2[i])&(my>=y1[i])&(my<=y2[i])){return;}
				if((mx>=x1[i])&(mx<=x2[i])&(oy>=y1[i])&(oy<=y2[i])){return;}
			}
		}
	#undef oy
	p->Left+=nx-p->Left;
}

// для каждого плавающего компонента по 2 обработчика:
void __fastcall TF_frontend::GroupBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{	x = X; y = Y;}
void __fastcall TF_frontend::GroupBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{	p=GroupBox1;
	if ((Shift.Contains(ssLeft))&(Editmode1->Checked))move(X,Y,1);//"1"
//"1" это номер - каждому плав. компоненту присвоить свой нужно
}
Плавают сказочно хорошо. Есть еще идеи как улучшить, но сложно и мало толку, и так все прекрасно.
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как двигать картинку клавишами Naroto HTML и CSS 2 27.04.2010 15:32
нужно написать программу на delphi или builder kristall Фриланс 5 14.04.2010 19:23
как двигать точку на графике EXCEL? 666buster666 Microsoft Office Excel 6 07.03.2010 00:59
Builder 6. Com объекты. EvoVII Фриланс 1 01.06.2009 12:03
Имитационное моделирование систем массового обслуживания на Delphi или C++Builder Приватная Фриланс 4 04.12.2008 10:39