Поиск:

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


Новичок



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

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



Здравствуйте. Делаю учебное задание: есть несколько объектов некоторого класса, каждый содержит несколько полей. Нужно занести в StringGrid (1 строка = 1 объект) мои объекты. Казалось бы, ничего сложного, но! На одном требовании я заступорился. Цитирую: "для отображения полей объектов не использовать свойства Cells, Cols, Rows". Есть ли другие способы обращения к ячейкам StringGrid-а?

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


Эксперт
****


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

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



Может ещё и Билдером пользоваться нельзя? smile

По теме: я других способов не знаю.


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


Шустрый
*


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

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



Может DBGrid нужен? Или объекты не из базы данных?
PM MAIL   Вверх
alexgorbach
Дата 11.12.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Riviero, именно StringGrid, точнее, даже его наследник, собственноручно разработанный. Объекты из текстовых файлов, предварително должны быть считаны в объекты класса.
PM MAIL   Вверх
artsb
Дата 11.12.2012, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexgorbach @  11.12.2012,  10:38 Найти цитируемый пост)
именно StringGrid, точнее, даже его наследник, собственноручно разработанный. Объекты из текстовых файлов, предварително должны быть считаны в объекты класса. 

Так бы сразу и сказали.
Сделайте обёртки над Cells, Cols, Rows и будет вам счастье )


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


Новичок



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

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



Цитата(artsb @  11.12.2012,  10:44 Найти цитируемый пост)
Сделайте обёртки над Cells, Cols, Rows и будет вам счастье )

Хм, я думал об этом, но мне казалось, что это тоже считается за использование)
PM MAIL   Вверх
xvr
Дата 11.12.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Видимо вам нужно сделать Owndraw производную от StringGrid. Правда непонятно, зачем тогда именно StringGrid - делали бы сразу от его родителя (не помню, как он назывался)

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


Эксперт
****


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

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



Цитата(alexgorbach @  11.12.2012,  10:48 Найти цитируемый пост)
мне казалось, что это тоже считается за использование) 

Это использование внутри класса. Будем надеяться, что никто не узнает smile


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


Новичок



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

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



Сделал обертку в моем классе. Заполняет, естественно, но теперь отчего-то вылетать программа начала. Сейчас будет немного оффтопа, простите:
в конструкторе всё того же грида пишу:
Код

__fastcall TOwnThingGrid::TOwnThingGrid(TComponent* Owner)
    : TStringGrid(Owner)
{
    fTitles = new TStringList();
}


а в деструкторе:
Код

__fastcall TOwnThingGrid::~TOwnThingGrid()
{
    delete fTitles;
}

fTitles - поле класса типа TStringList*. В деструкторе вылетает программа - Access Violation. Вроде бы, 3 строчки кода, но где-то что-то упустил.
PM MAIL   Вверх
artsb
Дата 11.12.2012, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



fTitles член класса TOwnThingGrid?
Деструктор ~TOwnThingGrid() виртуальный?
Как создаёте объект TOwnThingGrid?
Не удаляете ли вы fTitles ещё где-нибудь?


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


Новичок



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

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



Хм. Обнаружил, что если закомментировать удаление моих объектов, то не вылетает. Но когда вылетает - все равно почему-то на удалении fTitles. 
Регистрирую компонент, кидаю на форму в design-tme. Деструктор же вроде в TCustomGrid еще виртуальным объявлен, стало быть, у меня тоже виртуальный. 
.h
Код

class PACKAGE TOwnThingGrid : public TStringGrid
{
private:
    TStringList* fTitles;
    char fPath[50];
protected:
    void __fastcall SetTitles(TStringList* t);
    void            SetPath(char* p);
    char*           GetPath();
public:
    __fastcall TOwnThingGrid(TComponent* Owner);
    virtual __fastcall ~TOwnThingGrid();
    __property char* Path = {read=GetPath, write=SetPath};
    void AppendThing(OwnThing* obj);
    void AppendPlacedThing(OwnThing* obj);
__published:
    __property TStringList* Titles = {read=fTitles, write=SetTitles};
};

.cpp
Код

#include <vcl.h>
#pragma hdrstop
#include "OwnThingGrid.h"
#pragma package(smart_init)

static inline void ValidCtrCheck(TOwnThingGrid *)
{
    new TOwnThingGrid(NULL);
}

__fastcall TOwnThingGrid::TOwnThingGrid(TComponent* Owner)
    : TStringGrid(Owner)
{
    fTitles = new TStringList();
    FixedCols = 0;
    RowCount = 2;
}

__fastcall TOwnThingGrid::~TOwnThingGrid()
{
    delete fTitles;
}

void __fastcall TOwnThingGrid::SetTitles(TStringList* t)
{
    fTitles->Assign(t);
    ColCount = t->Count;
    for(int i=0; i<ColCount; i++)
        Cells[i][0] = t->Strings[i];
}

void TOwnThingGrid::SetPath(char* p)
{
    strcpy(fPath, p);
}

char* TOwnThingGrid::GetPath()
{
    return fPath; 
}

void TOwnThingGrid::AppendThing(OwnThing* obj)
{
    Rows[RowCount-1]->Append(obj->GetTitle());
    Rows[RowCount-1]->Append(obj->GetType());
    Rows[RowCount-1]->Append(AnsiString(obj->GetAge()));
    Rows[RowCount-1]->Append(AnsiString(obj->GetWeight()));
    RowCount += 1;
}

namespace Ownthinggrid
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(TOwnThingGrid)};
         RegisterComponents("Samples", classes, 0);
    }
}

Вот так заполняю его из формы:
formUnit.cpp
Код

TListEditingForm *ListEditingForm;
//---------------------------------------------------------------------------
__fastcall TListEditingForm::TListEditingForm(TComponent* Owner, char* path)
    : TMyForm(Owner)
{
    editGrid->Path = path;
    col = new SavedCollection();
}
//---------------------------------------------------------------------------
void __fastcall TListEditingForm::FormCreate(TObject *Sender)
{
    col->LoadFromFile(editGrid->Path, true);
    col->Sort();
    for(int i = 0; i < col->GetCount(); i++)
        editGrid->AppendThing(col->GetThing(i));
}
//---------------------------------------------------------------------------

void __fastcall TListEditingForm::FormClose(TObject *Sender,
      TCloseAction &Action)
{
    delete col;    //комментирую эту строку - не вылетает, раскомментирую - вылетает на строке delete fTitles в деструкторе компонента
}
//---------------------------------------------------------------------------



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


Эксперт
****


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

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



Цитата(alexgorbach @  12.12.2012,  08:36 Найти цитируемый пост)
Деструктор в базовом классе же вроде объявлен виртуальным. 

Да, точно.
Вроде бы, всё правильно. А зачем вам вообще нужен fTitles? В вашем случае, можно легко обойтись методом SetTitles(TStringList* t).
Попробуйте в деструкторе дебагером пройтись.


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


Новичок



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

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



artsb, путем нестандартных отладочных работ и с помощью всевозможных ошибок, вылетающих поочередно в разных местах, удалось привести код к работоспособному виду. Ошибки еще каким-то образом зависели от способа вызова формы, на которой мой стринггрид лежит - в немодальном варианте форма удаляется нормально и компонент не вылетает.
Кстати насчет использования Cells и прочего. Узнал подробнее, что требовалось. Оказалось, нужно текст выводить вручную в грид, перекрыв DrawCell. Жуть.
Ага, вопрос все-таки появился. Можно ли в StringGrid передать значение? Пробовал в конструктор ему, но тогда невозможно его во время проектирования поместить на форму - сигнатура конструктора не подходит.

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


Эксперт
****


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

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



Цитата(alexgorbach @  12.12.2012,  18:53 Найти цитируемый пост)
Можно ли в StringGrid передать значение?

Насколько я помню у каждого Cellа в StringGrid кроме строки есть еще указатель на TObject. Сам StringGrid этот указатель никак не использует, так что туда можно записать все, что угодно (конечно размером не больше поинтера)

Цитата(alexgorbach @  12.12.2012,  18:53 Найти цитируемый пост)
Оказалось, нужно текст выводить вручную в грид, перекрыв DrawCell.

Я вам тут и предлагал это сделать. Только не перекрывать DrawCell, а сделать обработчик события OnDrawCell и поставив в пропертях StringGrid соответствующий флаг. В этом случае вам не придется делать свой компонент - можно воспользоваться оригинальным StringGrid

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


Эксперт
****


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

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



Цитата(alexgorbach @  12.12.2012,  18:53 Найти цитируемый пост)
Можно ли в StringGrid передать значение? Пробовал в конструктор ему, но тогда невозможно его во время проектирования поместить на форму - сигнатура конструктора не подходит.

Создать второй конструктор с нужным параметром или сделать специальный метод для установки значения.


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

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

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

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

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


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

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


 




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


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

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