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, это может пригодится...
|
|
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.
Кто виновать и что делать? |
|
Guest |
Отправлено: 19.07.2004, 15:44 |
|
Не зарегистрирован
|
Форма представляет собой ДЕРЕВО объектов. Встретели контрол с потомками — обойдите всех потомков. И так рекурсивно. |
|
Guest |
Отправлено: 19.07.2004, 15:57 |
|
Не зарегистрирован
|
QUOTE (Guest @ 19/07/2004, 16:46) | Форма представляет собой ДЕРЕВО объектов. Встретели контрол с потомками — обойдите всех потомков. И так рекурсивно. |
Поступил проще.
Пошел через класс TComponent.
|
|