Forum Replies Created
-
AuthorPosts
-
ShepardParticipant'TCount' wrote:
У меня просто привычка однотипные процедуры объединять в одну и уже внутри одной определять итем по Sender(в делфи) или, насколько я знаю, This (в C++).
То есть, событие OnCreateFrame всех итемов ведет в одну процедуру.
Ну, по-хорошему-то, так и нужно делать)
ShepardParticipantДа, то что нужно, спасибо!
На C++ это выглядит примерно так в onFrameCreate:
Code:Frame = new TMainFrame(NULL);
static_cast(Frame)->sButton1->Tag = 1;Можно и без нумерации итемов в дизайнере обойтись, этого вполне достаточно)
ShepardParticipant'Support' wrote:Спасибо
В этой строке фрейм создается:
Code:sLabel1->Caption = TFrameMy(sFrameBar1->Items->Items[0]->Frame).sButton1->Caption;Правильный кастинг, лучше делать наверное так:
Code:sLabel1->Caption = static_cast(sFrameBar1->Items->Items[0]->Frame)->sButton1->Caption;Ура, работает! Спасибо! Проверил и на исходном рабочем проекте тоже.
Code:sLabel1->Caption = static_cast(sFrameBar1->Items->Items[0]->Frame)->sButton1->Caption;Code:static_cast(sFrameBar1->Items->Items[0]->Frame)->sButton1->Caption = “1”;Чтение и запись сколько угодно раз – всё работает. Разумеется, когда фрейм активен и не уничтожен. И теперь только когда фрейм закрыт, вылетает ошибка, как и должно быть.
ShepardParticipant'Support' wrote:Опция находится в настройках пакета “C++ Linking”, в XE7 тоже есть, только что посмотрел.
Да, теперь вижу, есть. Не там искал.
Если отрыть сам проект компонентов acntBuilderXE7_r.cbproj то уже в нём, в свойствах пакета acntBuilderXE7_r.bpl есть пункт “Generate static package library”. У меня отмечен как true.
ShepardParticipant'Support' wrote:Обычно эта проблема решается, если включить генерацию файла Lib библиотекой при установке.
Пробовался такой вариант?
Я видел этот совет в интернете, но такого пункта в версии XE7 так и не нашёл.
ShepardParticipant'Support' wrote:Добрый день. А можно посмотреть этот новый чистый проект?
Да, конечно.
ShepardParticipantQuote:Последний вариант – обозвать Frame13 как-то иначе, например: MyBarFrame.Ну, новый и так уже назывался Frame15, но на всякий случай переименовал его во FrameMy. Результат тот же.
ShepardParticipantQuote:А вообще, попробуйте все тоже самое, что вы делаете, но в пустом проекте. В котором будет только Frame13 и FrameBar.Попробовал. Воссоздал ситуацию в чистом проекте – беда та же. Даже фрейм новый сделал.
Quote:А еще что подумал…Ну так, чтобы попробовать теорию…Если у вас выдает ошибку “A component named Frame13 already exists”, то может стоит при создании фрейма внутри итема делать проверку на существование фрейма?
например:
if Frame<>NIL then FreeAndNIL(Frame);
на C++ что-то вроде:
if (Frame!=NULL) Frame->Destroy;
Проверил условие при создании итема “if (Frame!=NULL)”, и Frame таки при создании равен NULL.
ShepardParticipantСделал:
Code:void __fastcall TForm9::sFrameBar1Items0CreateFrame(TObject *Sender, TCustomFrame *&Frame)
{
Frame = new TFrame13(NULL);
}Проблема осталась.
Заметил ещё одну странную вещь. При запуске программы, ни разу не открывая 1й фрейм, если нажать на кнопку с запросом к компонентам внутри 1го фрейма FrameBar с кодом:
Code:sLabel1->Caption = TFrame13(sFrameBar1->Items->Items[0]->Frame).sButton1->Caption;
sLabel2->Caption = TFrame13(sFrameBar1->Items->Items[0]->Frame).sLabel1->Caption;То выполняются обе строки и считываются оба значения… с компонентов внутри первого итема FrameBar, который, по идее, ещё не создан.
Если открыть фрейм и снова нажать на кнопку, то снова вылезет “A component named Frame13 already exists”.
ShepardParticipantQuote:Так вот, сами фрейиы, которые принадлежат итемам, они не создаются по умолчанию. OnCreateFrame вызывается только при клике по самому итему, а до этого момента фрейм итема не существует и, соответственно, обращение к нему вызовет ошибку.Более того, фрейм уничтожается сразу после закрытия итема во FrameBar.
Я хочу сказать о том, что к фрейму определенного итема можно обращаться только тогда, когда сам итем FrameBar открыт и видно его содержимое. То есть, когда он существует и не равен NIL (NULL).
Да, об этом я знаю, просто не написал выше. Разумеется попытку обращения к компоненту внутри фрейма я делаю только после того, как на главной форме открыт (и не закрыт снова) первый фрейм из FrameBar и все его компоненты видны и доступны.
Да и первый же раз при обращении к компоненту внутри фрейма значение считывается, а вот проблема возникает при любом повторном обращении к фрейму внутри FrameBar.
Quote:А обращатесь к фрейму вы правильно, но можно чуть короче:TFrame13(sFrameBar1->Items[0]->Frame).sButton1->Caption;
Кстати, при коротком обращении:
Code:sLabel1->Caption = TFrame13(sFrameBar1->Items[0]->Frame).sButton1->Caption;Выдаёт ошибку:
[bcc32 Error] Unit9.cpp(218): E2288 Pointer to structure required on left side of -> or ->*
Длинный изначальный вариант “работает”:
Code:sLabel1->Caption = TFrame13(sFrameBar1->Items->Items[0]->Frame).sButton1->Caption;Но это мелочи. Главный вопрос остаётся открытым.
ShepardParticipantQuote:Каким образом данный фрейм вставляется в FrameBar?В событии OnCreateFrame для 0-го Item-а в sFrameBar1.
Code:void __fastcall TForm9::sFrameBar1Items0CreateFrame(TObject *Sender, TCustomFrame *&Frame)
{
Frame = new TFrame13(this);
}Form9 тут, соответственно, главная форма программы, на которой и расположен сам sFrameBar1.
ShepardParticipantНеужели никто никогда не обращался к компонентам фрейма внутри FrameBar на C++ Builder?
Поставил версию компонентов 12.08 – всё то же самое.
Пожалуйста, кто знает, подскажите как правильно обращаться к компонентам внутри фрейма внутри FrameBar.
Или обращаюсь я правильно, а проблема где-то ещё?
Обнаружилось, что, например, вот такая запись (условия всё те же, обращение при клике на кнопку в основной форме к компоненту внутри фрейма внутри FrameBar):
Code:sLabel1->Caption = TFrame13(sFrameBar1->Items->Items[0]->Frame).sButton1->Caption;Таки считывает sButton1.Caption. Но любое повторное обращение к подобной конструкции TFrame13(sFrameBar1->Items->Items[0]->Frame) тут же вызывает ошибку “A component named Frame13 already exists”.
Ну или, если эта проблема в принципе не решаема, то подскажите что ли, чем можно заменить FrameBar? Наколхозить sRollOutPanel-ей и вручную менять им высоту, чтобы подгонять друг под друга?
-
AuthorPosts