Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не переносится свойство компонента, Свойство из design-time в run-time 
:(
    Опции темы
alexgorbach
Дата 28.11.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Такая проблема: создал компонент, наследник TStringGrid, в нем есть свойство типа TStringList, в конструкторе оно создается. Оно описано как published, в инспекторе объектов появляется соответствующее свойство. Кидаю компонент на форму, заполняю это свойство, оно вполне себе корректно отображается в моем компоненте, но при запуске программы запускается конструктор моего компонента, и в нем это свойство создается заново, таким образом не отображая информацию, введенную на этапе проектирования. Код с комментариями и скриншоты прилагаются. Спасибо.
Код

  TMarkTable = class(TStringGrid)
  private
    FFio  : TStringList;
    FMark : TArray;
  protected
    procedure SetFio(value : TStringList);
    procedure SetMark(value : TArray);
    function  SelectCell(ACol, ARow : Longint) : boolean; override;
    procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);  override;
  public
    constructor Create(AOwner : TComponent); override;
    procedure   MoveData();
    destructor  Destroy();  override;
  published
    property Fio : TStringList read FFio write SetFio;  //вот это свойство
    property Mark : TArray read FMark write SetMark;
  end;

constructor TMarkTable.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FFio := TStringList.Create;       //конструктор при запуске программы этой командой создает новый TStringList, не сохраняя мой
  FMark := TArray.Create;
  ColCount := 2;
  RowCount := 2;
  FixedCols := 0;
  FixedRows := 1;
  Cells[0,0] := 'Фамилия';
  Cells[1,0] := 'Балл';
end;

Вот скрины формы (на этапе проектирования и после запуска):
user posted imageuser posted image
PM MAIL   Вверх
MetalFan
Дата 29.11.2012, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



alexgorbach, попробуй перенести создание FFio до вызова inherited Create...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
alexgorbach
Дата 29.11.2012, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MetalFan, попробовал, ноль эмоций.
PM MAIL   Вверх
kami
Дата 29.11.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



1. Вместо TStringList везде использовать Tstrings. Оставить TStringList только в Create, в создании FFio.
ку?
2. Посмотреть dfm - там нужные значения присутствуют?
PM MAIL WWW   Вверх
alexgorbach
Дата 30.11.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kami, поправил, теперь везде в классе TStrings, только в конструкторе оставил FFio := TStringList.Create;
А вот в .dfm, насколько я понял, не сохраняется: ввожу на этапе проектирования в мое свойство 3 строки, запускаю, потом смотрю .dfm, вот что в нем:
Код

//...
object MarkTable1: TMarkTable
    Left = 8
    Top = 8
    Width = 320
    Height = 120
    ColCount = 2
    FixedCols = 0
    RowCount = 3
    TabOrder = 0
    Fio.Strings = (
      #1055#1077#1088#1074#1099#1081
      #1042#1090#1086#1088#1086#1081)
  end
//...
 
Не подскажете, как это поправить? Записывать явно в файл формы?
PM MAIL   Вверх
kami
Дата 30.11.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Компонент инсталлирован в палитру?
Если да - попробуйте перебилдить пакет с ним, удалить с формы и положить обратно.
И в догонку:
если сделать так:
Код

MarkTable1.FIO.Add('бла-бла-бла');

новая строка ведь не появится, так? Просто в приведенном коде не вижу обработки события TStringList(FFIO).OnChange, хотя оно мне не очень нравится. В дженериках это сделано лучше с событием OnNotify (хотя и с ним не всё гладко при удалении элемента). Имхо, обработка OnChange крайне нужна - Delphi не будет при загрузке делать новый Tstrings и заменять созданный в конструкторе на него.

Добавлено через 3 минуты и 23 секунды
А, у Вас же DrawCell присутствует... 
PM MAIL WWW   Вверх
kami
Дата 30.11.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(alexgorbach @  30.11.2012,  11:11 Найти цитируемый пост)
#1055#1077#1088#1074#1099#1081      
#1042#1090#1086#1088#1086#1081

Эти строки в переводе на русский -  "первый" и "второй"

Это сообщение отредактировал(а) kami - 30.11.2012, 12:56
PM MAIL WWW   Вверх
alexgorbach
Дата 30.11.2012, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  30.11.2012,  12:19 Найти цитируемый пост)
А, у Вас же DrawCell присутствует... 

Я думал, что в нем дело. Закомментировал DrawCell и SelectCell, но ничего опять же не поменялось.
Насчет переноса из свойства в табличку. Я делал вот так (некрасиво, но, как я надеялся, должно бы работать):
Код

procedure TMarkTable.SetFio(value : TStrings);
begin
  FFio.Assign(value);
  MoveData;
end;

procedure TMarkTable.MoveData();
var
  i : integer;
begin
  RowCount := Max(Fio.Count, Mark.Size) + 1;
  for i:=0 to FFio.Count-1 do
    Cells[0,i+1] := Fio.Strings[i];
  for i:=0 to FMark.Size-1 do
    Cells[1,i+1] := IntToStr(Mark.GetValue(i));
end;


То есть, при закрытии редактора в мой грид по идее должны занестись значения и там быть.
PM MAIL   Вверх
kami
Дата 30.11.2012, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



При загрузке компонента SetFIO вызываться не будет, имхо.
Расширяя мое предыдущее сообщение, попробуйте сделать так:
Код

procedure TMarkTable.OnFIOChange(Sender: Tobject); // новый приватный метод
begin
  MoveData;
end;

В конструкторе:
Код

  FFio:=TStringList.Create; // это было
  TStringList(FFio).OnChange:=OnFIOChange;

Чего мы этим добиваемся: реакции компонента на изменение FFIO (не переприсваивание, а именно изменение, пример я показал в предыдущем сообщении). Как только что-то добавляется,удаляется, меняется в FFIO - вызывается MoveData


Цитата(alexgorbach @  30.11.2012,  22:54 Найти цитируемый пост)
Я думал, что в нем дело. Закомментировал DrawCell и SelectCell, но ничего опять же не поменялось.

Да нет, дело не в них. Я сперва подумал, что в этих методах идет реакция на изменение FFIO.
Цитата(alexgorbach @  30.11.2012,  22:54 Найти цитируемый пост)
То есть, при закрытии редактора в мой грид по идее должны занестись значения и там быть.

Это по идее smile
PM MAIL WWW   Вверх
alexgorbach
Дата 1.12.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kami, ух, спасибо, так заработало! А как сделать обработчик для другого свойства, Mark? Оно имеет тип TArray, определенный мной, и OnChange у него нет... 
PM MAIL   Вверх
kami
Дата 1.12.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(alexgorbach @  1.12.2012,  00:30 Найти цитируемый пост)
А как сделать обработчик для другого свойства, Mark? 

Если обратите внимание, то Mark даже не присутствует в dfm. Нужно на что-то его менять.
А почему бы не хранить и FIO и Mark в одном месте - в FIO, используя свойства Names и Values?
PM MAIL WWW   Вверх
alexgorbach
Дата 1.12.2012, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kami, тогда свойство Mark просто пропадет, а в редакторе свойства Fio нужно будет указывать сразу имя и значение? У меня требование - наличие свойства Mark с редактором, аналогичным редактору Fio.
PM MAIL   Вверх
kami
Дата 1.12.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(alexgorbach @  1.12.2012,  11:47 Найти цитируемый пост)
наличие свойства Mark с редактором, аналогичным редактору Fio.

ну так и сделайте полностью аналогичным - используйте в качестве базы TStrings.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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