&(Label1->Caption)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString s = "aaa", *ps, *pCaption;
ps = &s;
pCaption = &(Label1->Caption);
}
Ставим бряк-пойнт на }. Делаем run. Когда вываливаемся на бряк-пойнте, смотрим инспектором значения *ps и *pCaption. Первый - "aaa", а второй - NULL.
Почему?!
Форма с кнопкой и лэйблом. Пишем:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString s = "aaa", *ps, *pCaption;
ps = &s;
pCaption = &(Label1->Caption);
}
Ставим бряк-пойнт на }. Делаем run. Когда вываливаемся на бряк-пойнте, смотрим инспектором значения *ps и *pCaption. Первый - "aaa", а второй - NULL.
Почему?!
Хо-Хо...
А и не выйдент ничего у тебя так...
Когда ты обращаешься к публичному свойству компонента Label1->Caption то на самом деле ты не String-переменную считываешь а получаешь значение которое тебе возвращает функция ну например что то вроде String GetCaption(); когда записываешь может вызываться что то вроде void SetCaption(String ACaption);
Для тебя это специально реализовали абсолютно прозрачно что бы у тебя создавалось впечатление что ты работаешь непосредственно с самой строкой а на самом деле может стоять проверочка
void SetCaption(String ACaption)
{
if (ACaption=="Дурак") FCaption="Сам дурак";
else FCaption=ACaption;
}
И твое Caption в классе TLabel на самом деле будет к примеру FCaption и находится будет в описании класса возможно в разделе
private:
и помучаться еще прийдется что бы на этот самый FCaption указатель навести :-))))
но если тебе очень хочется попробуй....
только учти вся эта катавасия специально затеяна для того что бы оградить от тебя внутренности компонента ... если ты напрямую запишешь что либо в FCaption то компонент об этом может узнать не сразу и не сразу отобразит твой заголовок а если там есть какие то дополнительные переменные которые меняются вместе с FCaption???
Вобщем не лезь ремонтировать часы топором...
Это мой совет...
Хотя если быть точным то лучше так:
Возьми книжку по билдеру...
Напиши компонент по образцу из этой книги... минут за 40 управишься...
потом посмотри исходный текст компонента TLabel
и уже потом возможно по этой теме будешь давать советы мне так как в этот компонент я еще не залезал :-)))))
...
Когда ты обращаешься к публичному свойству компонента Label1->Caption то на самом деле ты не String-переменную считываешь а получаешь значение которое тебе возвращает функция ну например что то вроде String GetCaption(); когда записываешь может вызываться что то вроде void SetCaption(String ACaption);
Для тебя это специально реализовали абсолютно прозрачно что бы у тебя создавалось впечатление что ты работаешь непосредственно с самой строкой...
Проведи подобный эксперимент с &(Label1->Top). Там картина другая. Что свойства типа AnsiString какие-то особенные?
...а на самом деле может стоять проверочка
void SetCaption(String ACaption)
{
if (ACaption=="Дурак") FCaption="Сам дурак";
else FCaption=ACaption;
}
И твое Caption в классе TLabel на самом деле будет к примеру FCaption и находится будет в описании класса возможно в разделе
private: ...
Ты точно знаешь или это догадки? Как-то нелогично... В классе AnsiString и так можно было реализовать (и/или уже реализовано) и проверочки, и фигерочки, и всё что приспичет.
...и помучаться еще прийдется что бы на этот самый FCaption указатель навести :-))))
но если тебе очень хочется попробуй....
только учти вся эта катавасия специально затеяна для того что бы оградить от тебя внутренности компонента ... если ты напрямую запишешь что либо в FCaption то компонент об этом может узнать не сразу и не сразу отобразит твой заголовок а если там есть какие то дополнительные переменные которые меняются вместе с FCaption???
Вобщем не лезь ремонтировать часы топором...
Это мой совет...
Хотя если быть точным то лучше так:
Возьми книжку по билдеру...
Напиши компонент по образцу из этой книги... минут за 40 управишься...
потом посмотри исходный текст компонента TLabel
и уже потом возможно по этой теме будешь давать советы мне так как в этот компонент я еще не залезал :-)))))
Мы рождены (я по крайней мере), чтоб сказку сделать былью!... а не чтоб чужие компоненты переписывать :) . Так что, это ты сам: книга, 40 минут и все такое...:D
А если серьезно, то не упёрлось оно мне. Каждое решение должно быть оправдано в смысле затрат ресурсов (в нашем случае - рабочего времени). Так что, по-моему, лучше найти открытую дверь, чем ломиться в закрытую, используя лом, автоген, перфоратор и другие полезные утилиты :)
class A
{
public:
__property AnsiString cap = {read=GetText, write=SetText};
private:
AnsiString str;
AnsiString GetText();
void SetText(AnsiString text);
};
Здесь значение самой строки свойства cap хранится в str, а __property как раз позволяет реализовать тот механизм, на который так туманно намекал HexoGenus, хотя натолкнул на мысль...
:)
механизм, на который так туманно намекал HexoGenus :)
Вот спасибо :D
Туманно немекал? Мне казалось что открытым текстом сказал :)
Кстати еще раз... Очень рекомендую попробовать создать компонент по образцу... Там все очень прикольно реализовано ... Тебе понравится :)
И как раз разбираться со всем самому без книжек это и называется
А перед тем как искать другую дверь иногда сначала стоит прочитать плакатик возле ручки в какую сторону дверь открывается :D
Вот спасибо :D
Туманно немекал? Мне казалось что открытым текстом сказал :)
Если бы написал кусок кода (или что смотреть, или где смотреть, или как смотреть), тогда было бы открытым текстом. А то абстрактное "книжки читай" - это совет на все случаи жизни.
Кстати еще раз... Очень рекомендую попробовать создать компонент по образцу... Там все очень прикольно реализовано ... Тебе понравится :)
И как раз разбираться со всем самому без книжек это и называется
А перед тем как искать другую дверь иногда сначала стоит прочитать плакатик возле ручки в какую сторону дверь открывается :D
Чего ты пристал со своим компонентом...
А про то, что книжки читать не надо, я тебе не говорил! И про то что, всё самому разбирать надо, тоже! Всю идею переврал...
Так вот (направляя диалог в конструктивное русло) додумать надо было совсем немного: открывам хелп, находим, например, TTable и смотрим свойство, например, TableName. И видим:
__property AnsiString TableName = {read=FTableName, write=SetTableName};
То есть хитрого тут ничего нет, действительно надо было вспомнить, что из себя представляет свойство, о чем ты, собственно, и говорил.
Чего ты пристал со своим компонентом...
А про то, что книжки читать не надо, я тебе не говорил! И про то что, всё самому разбирать надо, тоже! Всю идею переврал...
:) Да не сердись ты...
Это у меня чувство юмора такое...
Если бы ты книжки не читал ты бы не в форуме сидел а в чате :D
По поводу конструктивности...
Конструкцию которую ты написал я много раз сам видел... и если честно то толи я дуб толи ясень...
но толку мне от нее не было пока я своими руками компонент не собрал...
Мне казалось что сборка компонентов мне не нужна и эту главу во всех и даже детских книжках я упорно пропускал :)
Но то как я заблуждался я понял только после того как попробовал собрать компонент по образцу и убедился насколько это доступно и просто...
И понимаю ведь что выгляжу как папуас который европейцу настойчиво предлагает попробовать на вкус местную гусеницу... но собственный опыт просто кричит мне что это нужно любому программисту на билдере...