Shepard

Forum Replies Created

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • in reply to: FrameBar и один Frame для всех Items #56745
    Shepard
    Participant
    'TCount' wrote:

    У меня просто привычка однотипные процедуры объединять в одну и уже внутри одной определять итем по Sender(в делфи) или, насколько я знаю, This (в C++).

    То есть, событие OnCreateFrame всех итемов ведет в одну процедуру.

    Ну, по-хорошему-то, так и нужно делать)

    in reply to: FrameBar и один Frame для всех Items #56742
    Shepard
    Participant

    Да, то что нужно, спасибо!

    На C++ это выглядит примерно так в onFrameCreate:

    Code:
    Frame = new TMainFrame(NULL);
    static_cast(Frame)->sButton1->Tag = 1;

    Можно и без нумерации итемов в дизайнере обойтись, этого вполне достаточно)

    in reply to: Проблема с FrameBar #56655
    Shepard
    Participant
    '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”;

    Чтение и запись сколько угодно раз – всё работает. Разумеется, когда фрейм активен и не уничтожен. И теперь только когда фрейм закрыт, вылетает ошибка, как и должно быть.

    in reply to: Fatal: Unable to open file 'ACNTBUILDERXE7.LIB' #56703
    Shepard
    Participant
    'Support' wrote:

    Опция находится в настройках пакета “C++ Linking”, в XE7 тоже есть, только что посмотрел.

    Да, теперь вижу, есть. Не там искал.

    Если отрыть сам проект компонентов acntBuilderXE7_r.cbproj то уже в нём, в свойствах пакета acntBuilderXE7_r.bpl есть пункт “Generate static package library”. У меня отмечен как true.

    in reply to: Fatal: Unable to open file 'ACNTBUILDERXE7.LIB' #56701
    Shepard
    Participant
    'Support' wrote:

    Обычно эта проблема решается, если включить генерацию файла Lib библиотекой при установке.

    Пробовался такой вариант?

    Я видел этот совет в интернете, но такого пункта в версии XE7 так и не нашёл.

    in reply to: Проблема с FrameBar #56699
    Shepard
    Participant
    'Support' wrote:

    Добрый день. А можно посмотреть этот новый чистый проект?

    Да, конечно.

    in reply to: Проблема с FrameBar #56685
    Shepard
    Participant
    Quote:
    Последний вариант – обозвать Frame13 как-то иначе, например: MyBarFrame.

    Ну, новый и так уже назывался Frame15, но на всякий случай переименовал его во FrameMy. Результат тот же.

    in reply to: Проблема с FrameBar #56683
    Shepard
    Participant
    Quote:
    А вообще, попробуйте все тоже самое, что вы делаете, но в пустом проекте. В котором будет только 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.

    in reply to: Проблема с FrameBar #56680
    Shepard
    Participant

    Сделал:

    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”.

    in reply to: Проблема с FrameBar #56678
    Shepard
    Participant
    Quote:
    Так вот, сами фрейиы, которые принадлежат итемам, они не создаются по умолчанию. 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;

    Но это мелочи. Главный вопрос остаётся открытым.

    in reply to: Проблема с FrameBar #56676
    Shepard
    Participant
    Quote:
    Каким образом данный фрейм вставляется в FrameBar?

    В событии OnCreateFrame для 0-го Item-а в sFrameBar1.

    Code:
    void __fastcall TForm9::sFrameBar1Items0CreateFrame(TObject *Sender, TCustomFrame *&Frame)
    {
    Frame = new TFrame13(this);
    }

    Form9 тут, соответственно, главная форма программы, на которой и расположен сам sFrameBar1.

    in reply to: Проблема с FrameBar #56674
    Shepard
    Participant

    Неужели никто никогда не обращался к компонентам фрейма внутри 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-ей и вручную менять им высоту, чтобы подгонять друг под друга?

Viewing 12 posts - 1 through 12 (of 12 total)