Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в 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   Вверх
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   Вверх
artsb
Дата 18.12.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexgorbach @  18.12.2012,  21:17 Найти цитируемый пост)
а я так подозреваю, здесь кроется подвох

ИМХО, логично попробовать закомментировать эту строку и посмотреть что произойдёт. Я сомневаюсь, что проблема кроется в TextWidth().
Хотя в своё время столкнулся с AV, которое возникало из-за того, что я обращался к одному из объектов базового класса, когда мой объект находился на этапе разрушения. Чтобы этого избежать, нужно оборачивать код в if:
Код

    if(!this->ComponentState.Contains(csDestroying))
    {
        // весь ваш код отрисовки
    }



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


Эксперт
****


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

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



Кстати, проверьте, чему равна this->ComponentState, перед тем, как возникает AV.


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


Новичок



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

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



Вставил в начале отрисовки проверку состояния компонента. Вылетает периодически. на той же строке.
PM MAIL   Вверх
artsb
Дата 19.12.2012, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(artsb @  18.12.2012,  23:19 Найти цитируемый пост)
Кстати, проверьте, чему равна this->ComponentState, перед тем, как возникает AV. 

?


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


Эксперт
****


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

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



Цитата(alexgorbach @  18.12.2012,  21:52 Найти цитируемый пост)
в деструкторе-то грида да, удаляется fTitles, но при новом открытии формы конструктор создает снова грид,

А вы случайно не вызываете форму по указателю на ее первый инстанс? Это вполне может быть, если вы общаетесь с формой через переменную, которую делает для нее Builder (типа extern PACKAGE TForm1 *Form1;) Она не инициализируется в конструкторе!

PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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