Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 146

/ вопрос открыт /

Уважаемые!
Подскажите, как можно скопировать строки целиком из одного StringGrid-a в другой.
Например я в цикле делаю копирование нужных мне строк, всё копируется, но при дестрое формы я получаю Access Violation. Оба грида - TAdvStringGrid (TMS Software), содержат в ячейках объекты (графику, всплывающие подсказки, цветовое оформление). Понятно, что присваивание происходит только указателей на объекты и Грид при вызове деструктора вызывает Free для своих объектов. А так как у меня после вызова Assign два грида ссылаются на один и тот же объект, убить его попытаются они оба, и второй грид за такую пошлость получит AV. Может кто подскажет, как решить проблему? ИС примерчиком, если можно...

Приложение:
  1.  
  2. for i:= 1 to Grid_1.RowCount -1 do
  3.  
  4. begin
  5. Inc(m);
  6. Grid_2.RowCount:= m;
  7. Grid_2.Rows[m-1].Assign(Grid_1.Rows[i]);
  8. end;


Discorezzz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Discorezzz (статус: Посетитель)
Вопрос отправлен: 27 октября 2006, 19:03
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Discorezzz!
Перед вызовом метода Free необходимо ссылкам
на все oбъекты в одном из гридов присвоть nil.

Приложение:
  1. for i:= 1 to Grid_1.RowCount -1 do
  2. Grid_1.Objects[0,i]:=nil;


Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 30 октября 2006, 11:58
Оценка за ответ: 5

Комментарий к оценке: Спасибо за помощь! Попробую так. Правда я сделал по другому - текст через Assign, а объекты (благо их немного) через промежуточную переменную. Достаточно быстро получается - 46000 позиций одного грида секунды за 2 перелетают в другой.

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 1 ноября 2006, 23:49; участников в обсуждении: 1.
Discorezzz

Discorezzz (статус: Посетитель), 1 ноября 2006, 23:49 [#1]:

С небольшой поправкой заработало так -

procedure TForm1.FormDestroy(Sender: TObject);
var
iCol,iRow: Integer;
begin
for iRow:= 0 to Grid_1.RowCount -1 do
for iCol:= 0 to Grid_1.ColCount -1 do
Grid_1.Rows[iRow].Objects[iCol]:=nil;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.02 сек.