21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 641
1

Передача свойств одного компонента другому

10.08.2015, 10:58. Показов 1064. Ответов 8
Метки нет (Все метки)

Добрый день. Не подскажите - вопрос такой.
Есть эталонный StringGrid1 с кучей свойств - кооличество столбцов, их размеры, размеры его самого, координаты места положения и так далее, плюс восемь его обработчиков.
По ходу программы создается динамически новый StringGrid
C++
1
2
SG1[NumPanel]=new TStringGrid(Form1);
        SG1[NumPanel]->Parent=Form1;
Как правильно передать ему ВСЕ свойства и обработчики эталонного грида? И вообще, можно ли это?
Или расписывать вручную все это при создании. Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2015, 10:58
Ответы с готовыми решениями:

передача нажатой клавиши с одного компонента другому
Доброй ночи. требуется при нажатии клавиш на одном компоненте передавать нажатую клавишу другому...

Присваивание значения одного компонента другому
Здравствуйте! Как я могу присвоить компоненту TBEdit (в него можно записать только тип данных дата)...

Передача файла из одного ПК к другому
Мне нужно, чтоб я мог передавать файлы через com порт на другой комп'ютер через програму, но не...

Обновление пользовательского компонента WinForms при изменении одного из его свойств
Добрый день! Я создаю внешний .Net Control компонент для Scada системы. Компонент имеет свойство...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32244 / 20884 / 8086
Регистрация: 22.10.2011
Сообщений: 36,119
Записей в блоге: 7
10.08.2015, 11:46 2
Зачем же вручную?
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
33
34
35
36
void __fastcall CopyProperties(TComponent *Src, TComponent *Dst)
{
    String name;
    std::auto_ptr<TMemoryStream>ms(new TMemoryStream); // #include <memory>
 
    TWriter *wr = new TWriter(ms.get(), 1024);
    wr->Root = Form1; // Это Owner компонента-источника (Src)
    name = Src->Name;
    Src->Name = "";
    wr->WriteComponent(Src);
    Src->Name = name;
    delete wr;
 
    ms->Position = 0;
 
    TReader *rd = new TReader(ms.get(), 1024);
    name = Dst->Name;
    rd->Root = Form1; // Это Owner компонента-приемника (Dst)
    rd->BeginReferences();
    rd->ReadComponent(Dst);
    rd->FixupReferences();
    rd->EndReferences();
    Dst->Name = name;
    delete rd;
 
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    //
    TStringGrid *g = new TStringGrid(this); // создаешь новый объект
    g->Name = "Grid001"; // даешь ему имя
    CopyProperties(MyGrid, g); // копируешь все свойства/обработчики из MyGrid
    g->Parent = this; // и потом настраиваешь родителя и положение
    g->Top = 10;
}
Проверил только что, все обработчики прекрасно скопировались, равно как и свойства...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 641
10.08.2015, 12:14  [ТС] 3
Ошибка при компиляции
C++
1
[ILINK32 Error] Error: Unresolved external '__fastcall TForm1::CopyProperties(Classes::TComponent *, Classes::TComponent *)' referenced from C:\USERS\MT\DESKTOP\CONFIG\RELEASE\UNIT1.OBJ
если добавить TForm1::
то компилится, но не работает передача...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32244 / 20884 / 8086
Регистрация: 22.10.2011
Сообщений: 36,119
Записей в блоге: 7
10.08.2015, 13:16 4
А где ты видел, что у меня это метод? Это отдельная функция, вообще-то...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 641
10.08.2015, 13:20  [ТС] 5
Я это понял. Просто проверил. У меня 2009. Наверно из за этого ошибка. Я так понял, никак не починить?
0
Практикантроп
4754 / 2659 / 512
Регистрация: 23.09.2011
Сообщений: 5,690
10.08.2015, 13:32 6
У меня BCB 5 и в аналогичном случае я делал так:__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
    TMemoryStream *ms = new TMemoryStream;
    TStringGrid *sgT = new TStringGrid(Form1);
    sgT->Parent = Form1;
    ms->WriteComponent(StringGrid1);
    StringGrid1->Name = "";
    ms->Position = 0;
    try { ms->ReadComponent((TComponent*)sgT); } catch(...) {};
    sgT->Left = 352;
    sgT->OnSelectCell=StringGrid1SelectCell;
    delete ms;
}
Местоположение и имя, конечно, нужно сменить на новые. Конструкционно таблицу повторяет, а надписи и обработчики пришлось вручную (в примере это OnSelectCell ).
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32244 / 20884 / 8086
Регистрация: 22.10.2011
Сообщений: 36,119
Записей в блоге: 7
10.08.2015, 13:42 7
Тьфу... Вот и зачем надо было вообще отвечать, знал же, что обязательно все пойдет не так с этими доисторическими версиями...
1
Практикантроп
4754 / 2659 / 512
Регистрация: 23.09.2011
Сообщений: 5,690
10.08.2015, 13:51 8
"Программирование - это всегда выбор; не всегда, к сожалению, из наилучших вариантов".
(C) Практикантроп
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 641
10.08.2015, 14:39  [ТС] 9
...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2015, 14:39
Помогаю со студенческими работами здесь

Передача значения переменных одного класса другому
Всем привет. Нужно передать значения одного класса другому, при этом семантика методов класса...

Передача значимого типа от одного List<T> другому
Добрый день, уважаемые форумчане! Прошу помочь в передаче значений от одного List&lt;T&gt; другому: дело...

SignalR v2: передача данных от одного пользователя другому
Нужна помощь по SignalR v2, конкретно: Передача данных от js приложения одного пользователя к js...

Передача двумерного динамического массива от одного окна другому
Добрый день. Дело вот в чём. Не могу передать двумерный дин. массив от одного дочернего окна...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru