C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как это сделать? Подскажите пожалуйста.
Wasabi
Отправлено: 16.07.2004, 13:26


Не зарегистрирован







Есть форма. На ней несколько Label-ов и ComboBox cо списком фонтов (Arial и т.п.)

Как "выделить" по нажатию мышки Label чтобы поменять именно ЕМУ фонт?

Спасибо
AVC
Отправлено: 16.07.2004, 13:40


Ветеран

Группа: Модератор
Сообщений: 1583



Label не имеет фокуса ввода.
Вариант: запомните по OnClick этот Label (+ для наглядности егму можно изменить цвет или что то еще) а затем меняйте ему фонт.
Guest
Отправлено: 16.07.2004, 14:20


Не зарегистрирован







QUOTE (AVC @ 16/07/2004, 14:42)
запомните по OnClick этот Label (+ для наглядности егму можно изменить цвет или что то еще) а затем меняйте ему фонт.

А как его "запомнить"?

Просто если на форме помимо Лйблов есть другие объекты (например Edit, Memo и т.п.), как запоминать? Что для каждого объекта создать указатель?
А нельзя ли создать универсальную ссылку?
Типа на он клик:

TLabel &ref = *Label2;


А в обработчике ComboBox1Change

ref->Font->Name = ComboBox1->Text;


Спасибо



AVC
Отправлено: 16.07.2004, 14:56


Ветеран

Группа: Модератор
Сообщений: 1583



Например
CODE

// ваш_файл.h
class ... : public TForm
__published:
void __fastcall AnyLabelClick(TObject *Sender);
__protected:
TLabel *FMyLabel;

// ваш_файл.cpp
любой_констуктор_формы
FMyLabel = NULL;

void __fastcall ваша_форма::AnyLabelClick(TObject *Sender)
{ FMyLabel = dynamic_cast<TLabel*>(Sender); }

... __fastcall ваша_форма::SetFont(...)
{ if(FMyLabel) назначаем фонт;
// ?? Нужно предусмотреть сброс FMyLabel
}

Размещаем на форме нужное кол-во Label'ов. Выбираем их всех с объединением.
В инспекторе объектов на вкладке Events событию OnClick назначаем AnyLabelClick (из раскрывающегося списка).
timson
Отправлено: 16.07.2004, 21:28


Станционный диспетчер

Группа: Участник
Сообщений: 82



ну короче надо делать проще..
укзатель на TFont юзать напрамую..

надо всем объектам (у котроых может быть фонт изменен) на клик одну обработку события повесить (в примере LAbel1Click на Label1, Edit1, ComboBox1 и т.д)

ну дальше смотри:

//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TFont *pFont; // указатель на фонт..

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
pFont = Label1->Font; // так как может быть клика не было, а фонт выбран.. и error...
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1Click(TObject *Sender)
{
pFont = ((TLabel*) Sender)->Font; // а здесь побарабану какой класс (в данном случае TLabel), просто в классе TControl свойство TFont *Font закрыто в protected...
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
pFont->Name = "Times New Roman";
}
//---------------------------------------------------------------------------


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

и вообще это же ООП, надо иерархию класов смотреть и юзать, все они от TControl, а тем более от TObject, это может пригодится... smile.gif
Guest
Отправлено: 19.07.2004, 15:38


Не зарегистрирован







Большое спасибо всем кто откликнулся! Разобрался.

Но возник другой вопрос:

В FAQ-е прочитал как распознать объект на форме
[CODE]
TControl *ChildControl;
for (int I = 0; I < Form1->ControlCount; I++)
{
ChildControl=Form1->Controls[I];
// Получите имя класса
AnsiString S=ChildControl->ClassName();
//Сравните с классом и получите свойства
if(!S.AnsiCompare("TEdit"))
Memo1->Lines->Add( ((TEdit *)ChildControl)->Text);

}
[CODE]

Все отлично. Но как распознать объекты которые валяются не на форме самой, а в другом слою?
Например есть форма, на ней валяется Panel, а на панели уже лежит допустим Label.
Использую код указанный выше, я смогу распознать что на форме есть Панель, но не смогу добраться до компонентов лежащих НА Panel.
Кто виновать и что делать? biggrin.gif
Guest
Отправлено: 19.07.2004, 15:44


Не зарегистрирован







Форма представляет собой ДЕРЕВО объектов. Встретели контрол с потомками — обойдите всех потомков. И так рекурсивно.
Guest
Отправлено: 19.07.2004, 15:57


Не зарегистрирован







QUOTE (Guest @ 19/07/2004, 16:46)
Форма представляет собой ДЕРЕВО объектов. Встретели контрол с потомками — обойдите всех потомков. И так рекурсивно.

Поступил проще.
Пошел через класс TComponent.


Вернуться в Вопросы программирования в C++Builder