Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в StringGrid, Способы доступа к ячейке 
:(
    Опции темы
alexgorbach
Дата 12.12.2012, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Цитата(xvr @  12.12.2012,  20:10 Найти цитируемый пост)
В этом случае вам не придется делать свой компонент - можно воспользоваться оригинальным StringGrid

Как раз сделать свой компонент - обязательное условие  smile 


Цитата(xvr @  12.12.2012,  20:10 Найти цитируемый пост)
туда можно записать все, что угодно

Боюсь, что такое не прокатит - использовать сендер не по назначению...


Цитата(artsb @  12.12.2012,  20:31 Найти цитируемый пост)
Создать второй конструктор с нужным параметром или сделать специальный метод для установки значения.

Так даже если создам, когда компонент на форму ставлю, вызывается же конструктор по умолчанию? И мне нужно, чтобы как только форма с компонентом открылась, выполнились некоторые действия, использующие данные, которые необходимо передать в грид, то есть после создания формы с гридом динамически вызывать метод установки значения уже поздно, если в конструкторе выполнять эти самые действия. Или как достичь нужной последовательности действий?
Upd. Попробовал с перерисовкой. Не работает. Вот почему: я в DrawCell проверяю, считаны ли объекты из файла. Если нет - считываю. При создании формы с гридом вписываю в поле грида путь к файлу, по которому в перерисовке по идее откроется файл и считается информация. Потом рисую. Но дебаггер говорит, что мой DrawCell не выполняется при появлении формы с гридом, таким образом, грид пустой.

Это сообщение отредактировал(а) alexgorbach - 12.12.2012, 21:33
PM MAIL   Вверх
artsb
Дата 12.12.2012, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(alexgorbach @  12.12.2012,  20:44 Найти цитируемый пост)
Боюсь, что такое не прокатит - использовать сендер не по назначению...

А xvr про Sender ничего не говорил smile Речь идёт о TStringGrid::Objects. Каждой клетке в TStringGrid::Cells соответствует свой TObject.

Цитата(alexgorbach @  12.12.2012,  20:44 Найти цитируемый пост)
Так даже если создам, когда компонент на форму ставлю, вызывается же конструктор по умолчанию? И мне нужно, чтобы как только форма с компонентом открылась, выполнились некоторые действия, использующие данные, которые необходимо передать в грид, то есть после создания формы с гридом динамически вызывать метод установки значения уже поздно, если в конструкторе выполнять эти самые действия. Или как достичь нужной последовательности действий? 

Тогда объясните, что за действия вы хотите сделать и какие данные хотите передать.
Нет ли возможности в конструкторе по умолчанию заполнить эти данные значениями по умолчанию, а потом изменить их через ObjectInpector в Design Time или программно через метод во время выполнения программы?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
alexgorbach
Дата 12.12.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Цитата(artsb @  12.12.2012,  21:35 Найти цитируемый пост)
что за действия вы хотите сделать и какие данные хотите передать

Вот полная история:
1) есть программа, в ней главная форма и несколько дочерних, которые создаются динамически
2) двое из дочерних форм - экземпляры одного класса формы, содержат на себе OwnThingGrid - компонент, мною созданный
3) этот компонент должен содержать свойство - адрес отображаемого объекта-коллекции
4) объект-коллекция содержит в себе объекты другого класса (не суть важно)
5) из главной формы по кнопочкам я создаю дочернюю форму с гридом, который уже на ней лежит, и нужно, чтобы при открытии в грид сразу занеслись данные из объекта-коллекции, используя     DrawCell. Для этого я пытаюсь как можно быстрее занести адрес коллекции в соответствующее свойство грида, чтобы оно уже было перед перерисовкой и соответственно данные правильно занеслись в грид. Еще коллекции бывают 2х типов. Поэтому хотелось бы в грид извне наравне с адресом передать также идентификатор типа коллекции.

PM MAIL   Вверх
xvr
Дата 12.12.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(alexgorbach @  12.12.2012,  20:44 Найти цитируемый пост)
Как раз сделать свой компонент - обязательное условие 

Тогда годится  smile 

Цитата(alexgorbach @  12.12.2012,  20:44 Найти цитируемый пост)
И мне нужно, чтобы как только форма с компонентом открылась, выполнились некоторые действия, использующие данные, которые необходимо передать в грид,

Сделайте проперть у вашего контрола. В дезайн тайме поставите в нее что надо. Если же надо именно в run-time, то запишите в нее (проперть) что надо в event'е OnFormCreate формы, куда вы вставляете свой контрол

Добавлено через 4 минуты и 45 секунд
Цитата(alexgorbach @  12.12.2012,  22:20 Найти цитируемый пост)
 и нужно, чтобы при открытии в грид сразу занеслись данные из объекта-коллекции, используя     DrawCell. 

Это обычно делается немного не так. В вашем OwnThingGrid  делаете проперть типа коллекции, которую нужно отображать. Реализация OwnThingGrid  должна нормально показывать грид при отсуствии коллекции (не падать), а так же опознавать присваивание новой коллекции и обновлять свое экранное представление.
При создании дочерней формы вы ее создаете (конструктором), потом присваиваете необходимую коллекцию в проперть OwnThingGrid, а затем вызываете Show() или ShowModal() от созданной формы.

PM MAIL   Вверх
alexgorbach
Дата 12.12.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Цитата(xvr @  12.12.2012,  22:24 Найти цитируемый пост)
При создании дочерней формы вы ее создаете (конструктором), потом присваиваете необходимую коллекцию в проперть OwnThingGrid, а затем вызываете Show() или ShowModal() от созданной формы.

Хм. То есть, можно в метод SetПропертя, отвечающий за установку нового значения свойства-адреса, запихнуть перерисовку грида, так? Это ей какой-то Инвалидейт надо вызвать там, или я не так понял?

PM MAIL   Вверх
artsb
Дата 12.12.2012, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Собственно, xvr уже всё рассказал )

Цитата(alexgorbach @  12.12.2012,  22:34 Найти цитируемый пост)
Хм. То есть, можно в метод SetПропертя, отвечающий за установку нового значения свойства-адреса, запихнуть перерисовку грида, так? Это ей какой-то Инвалидейт надо вызвать там, или я не так понял?

Ога.
Код

SetMyProperty()
{
//...
this->Invalidate();
}

Так же, перерисовка сама вызывается, если вы меняете количество строк или столбцов, или значение в одной из ячеек.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
alexgorbach
Дата 12.12.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Так, вроде заносит данные, как и нужно было, но теперь опять появилась старая ошибка, не знаю даже, как отладить... Попробую проверить пока все очистки памяти.

Это сообщение отредактировал(а) alexgorbach - 12.12.2012, 23:41
PM MAIL   Вверх
Aligofren
Дата 13.12.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.12.2012

Репутация: нет
Всего: нет



Вы передаёте значения в OnCreate?
Я всё правильно понял?
PM MAIL   Вверх
alexgorbach
Дата 18.12.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Возникла очередная проблема. Вывожу в грид данные при перерисовке. Периодически программа падает с сообщением Access Violation на строчке, указанной в листинге. Ничего сомнительного там не вижу.
Код

void __fastcall TOwnThingGrid::DrawCell(int ACol, int ARow, const TRect &ARect, TGridDrawState State)
{
    if(fCol != NULL)
        RowCount = fCol->GetCount() + 1;
    int align = 1, left, halfWidth;
    AnsiString str;
    if(!State.Contains(gdFixed))
    {
        if(fCol != NULL)
        {
            str = fCol->GetField(ARow-1, ACol, align);
            switch(align)
            {
                case -1: Canvas->TextOutA(ARect.Left, ARect.Top, str); break;
                case 0:  Canvas->TextOutA(ARect.Left + ARect.Width()/2 - Canvas->TextWidth(str)/2, ARect.Top, str); break;
                case 1:  Canvas->TextOutA(ARect.Right - Canvas->TextWidth(str), ARect.Top, str); break;
            }
        }    
    }
    else
        if(ACol < fTitles->Count)
        {
            str = fTitles->Strings[ACol];                                    
            halfWidth = Canvas->TextWidth(str)/2;             //в один прекрасный момент падает вот здесь, при обработке последней ячейки из первой строки. str заполняется правильно, моими данными
            left = ARect.Left + ARect.Width()/2 - halfWidth;
            Canvas->TextOutA(left, ARect.Top, str);
        }

}

PM MAIL   Вверх
artsb
Дата 18.12.2012, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(alexgorbach @  18.12.2012,  16:01 Найти цитируемый пост)
Ничего сомнительного там не вижу.

Почему не обрабатывается ситуация, когда строка пустая?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
alexgorbach
Дата 18.12.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Цитата(artsb @  18.12.2012,  17:48 Найти цитируемый пост)
Почему не обрабатывается ситуация, когда строка пустая?

Каюсь, грешен, но отладчиком смотрел ситуацию, когда вылетает - строка не пустая.

PM MAIL   Вверх
artsb
Дата 18.12.2012, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(alexgorbach @  18.12.2012,  16:01 Найти цитируемый пост)
Периодически программа падает с сообщением Access Violation

Можно про эти ситуации поподробнее? Что за ситуации и как часто возникают?

Не может ли ошибка возниать строкой выше? Например по причине выхода индекса за пределы диапозоно?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
alexgorbach
Дата 18.12.2012, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



Цитата(artsb @  18.12.2012,  21:06 Найти цитируемый пост)
Можно про эти ситуации поподробнее?

У меня есть формочка (не главная) с этим мои гридом. У грида есть свойство Titles - заголовки столбцов, заполняется на этапе проектирования. Есть также свойство Col - указатель на коллекцию, которую он, грид, отображает. В DrawCell грида, который выложен выше, вручную рисуются в грид заголовки и данные из коллекции.
Запускаю программу, открываю форму, всё хорошо, отображается. Закрываю. Открываю еще раз - вылетает Access Violation. Опытным путем выявлено, что вылетает именно на той самой строке, при ACol = 4 (последний столбец). За шаг до вылета смотрю отладчиком str - все нормально, он равен нужному заголовку. TextWidth (а я так подозреваю, здесь кроется подвох) использую для выравнивания текста по центру.
PM MAIL   Вверх
xvr
Дата 18.12.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(alexgorbach @  18.12.2012,  21:17 Найти цитируемый пост)
Запускаю программу, открываю форму, всё хорошо, отображается. Закрываю. Открываю еще раз - вылетает Access Violation.

А не может быть так, что при первом закрытии формы этот самый fTitles был удален?

PM MAIL   Вверх
alexgorbach
Дата 18.12.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



xvr, в деструкторе-то грида да, удаляется fTitles, но при новом открытии формы конструктор создает снова грид, в конструкторе которого в свою очередь создается fTitles.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.