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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свойства объектов.... Не знаю как это умно назвать... 
:(
    Опции темы
altarasjuk
Дата 19.6.2003, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



Народ, что я тут не так делаю?
Код

 TCell = class (TObject)
 private
   fAttachment: TObject;
   fCellType: TCellType;
   fImageID: Integer;
   fOnValueChanged: TNotifyEvent;
   fValue: String;
   procedure SetValue(const aValue: String);
 public
   property Attachment: TObject read fAttachment write fAttachment;
   property CellType: TCellType read fCellType write fCellType;
   property ImageID: Integer read fImageID write fImageID;
   property OnValueChanged: TNotifyEvent read fOnValueChanged write
           fOnValueChanged;
   property Value: String read fValue write SetValue;
 end;

 TCells = class (TObject)
 private
   fCells: TList;
 protected
   function AddCell(aOnValueChanged: TNotifyEvent): TCell;
 end;

==============================================

function TCells.AddCell(aOnValueChanged: TNotifyEvent): TCell;
var
 cell: TCell;
begin
 cell:= TCell.Create;
 cell.OnValueChanged:= aOnValueChanged;
 fCells.Add(cell);
 Result:= cell;
end;


После вызова SomeCell:= AddCell(SomeMethod); SomeCell.OnValueChanged == nil!!!! Что тут не так?


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



ИМХО, это их области ошибки в 17-й строке... Но у меня вот так всё работает.

Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure G (Sender : TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.G (Sender : TObject);
begin
  ShowMessage ('All is OK!')
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SS : TCells;
  S  : TCell;
begin
  SS := TCells.Create;
  S := SS.AddCell (Form1.G);
  S.OnValueChanged (Sender);
  SS.Free;
end;

end.


Код
unit Unit2;

interface

uses
  Classes;

type
  TCellType = Byte;

  TCell = class (TObject)
  private
     fAttachment: TObject;
     fCellType: TCellType;
     fImageID: Integer;
     fOnValueChanged: TNotifyEvent;
     fValue: String;
     procedure SetValue(const aValue: String);
  public
     property Attachment: TObject read fAttachment write fAttachment;
     property CellType: TCellType read fCellType write fCellType;
     property ImageID: Integer read fImageID write fImageID;
     property OnValueChanged: TNotifyEvent read fOnValueChanged write fOnValueChanged;
     property Value: String read fValue write SetValue;
  end;

  TCells = class (TObject)
  private
     fCells: TList;
  public {!!!!!!!!!}
     function AddCell(aOnValueChanged: TNotifyEvent): TCell;
  end;

implementation

procedure TCell.SetValue(const aValue: String);
begin
  fValue := aValue;
end;

function TCells.AddCell(aOnValueChanged: TNotifyEvent): TCell;
var
  cell: TCell;
begin
  cell:= TCell.Create;
  cell.OnValueChanged:= aOnValueChanged;
  Result:= cell;
end;

end.


Пришлось, правда, protected заменить на public.

Хотя, может, я что-то недопонял?
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



у того метода действительно модификатор protected т.к. его там хватает(его вызывает наследник). Просто там цирк твориться. Насколько я знаю это событие передаётся по ссылке. т.е. есть переменная которой уже присвоен метод. для всех cell присваивается эта переменная, но в одних cell она правильна, а в других nil. Они ж как бы должны все быть одинаковыми? я ж правильно понимаю?


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Не совсем понял, честно говоря. Ты хочешь сказать, что для всех переменных типа TCell должен ставиться одинаковый обработчик? Если ты в ф-ции AddCell указываешь одинаковый обработчик, так и будет... По крайней мере, должно быть так. Но это гадание. Я ж говорю - ошибка в 17-й строке. smile.gif Весь код давай.

PS Орфография и пунктуация forever smile.gif
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



Цитата
хочешь сказать, что для всех переменных типа TCell должен ставиться одинаковый обработчик?
именно так.
Цитата
Если ты в ф-ции AddCell указываешь одинаковый обработчик, так и будет...
т.е. если я правильно тебя понял, то ты хочешь сказать, что обработчик передаётся по значениюconfused.gif
Цитата
Я ж говорю - ошибка в 17-й строке
Модификатор доступа там должен быть протектыд. Этот метод никто извне не вызывает.
Цитата
Весь код давай
ну смотри:
Код
unit SCGClasses;

interface

uses Classes;

type
 TCellType = (sctNormal, sctButton);

 TRowType = (scrNormal);

 TCell = class (TObject)
 private
   fAttachment: TObject;
   fCellType: TCellType;
   fImageID: Integer;
   fOnValueChanged: TNotifyEvent;
   fValue: String;
   procedure SetValue(const aValue: String);
 public
   property Attachment: TObject read fAttachment write fAttachment;
   property CellType: TCellType read fCellType write fCellType;
   property ImageID: Integer read fImageID write fImageID;
   property OnValueChanged: TNotifyEvent read fOnValueChanged write
           fOnValueChanged;
   property Value: String read fValue write SetValue;
 end;
 
 TCells = class (TObject)
 private
   fCells: TList;
   function GetCell(Index: Integer): TCell;
   function GetCount: Integer;
 protected
   function AddCell(aOnValueChanged: TNotifyEvent): TCell;
   procedure DeleteCell(Index: Integer);
 public
   constructor Create(aCellCount: Integer);
   destructor Destroy; override;
   property Cell[Index: Integer]: TCell read GetCell; default;
   property Count: Integer read GetCount;
 end;
 
 TRow = class (TObject)
 private
   fAttachment: Integer;
   fCells: TCells;
   fRowType: TRowType;
 public
   constructor Create(aColumns: Integer);
   destructor Destroy; override;
   property Cells: TCells read fCells;
 end;
 
 TRows = class (TObject)
 private
   fRows: TList;
   function GetCount: Integer;
   function GetRow(Index: Integer): TRow;
 protected
   function AddRow(aColumnCount: Integer): TRow;
   procedure DeleteRow(Index: Integer);
 public
   constructor Create(aRowCount, aColumnCount: Integer);
   destructor Destroy; override;
   property Count: Integer read GetCount;
   property Row[Index: Integer]: TRow read GetRow; default;
 end;
 
 TGrid = class (TObject)
 private
   fColumnCount: Integer;
   fOnValueChanged: TNotifyEvent;
   fRowCount: Integer;
   fRows: TRows;
   function GetCell(aRow, aColumn: Integer): TCell;
   function GetColumnCount: Integer;
   function GetRowCount: Integer;
   procedure SetColumnCount(aValue: Integer);
   procedure SetRowCount(aValue: Integer);
 public
   constructor Create(aRowCount, aColumnCount: Integer);
   destructor Destroy; override;
   property Cell[aRow, aColumn: Integer]: TCell read GetCell;
   property ColumnCount: Integer read GetColumnCount write SetColumnCount;
   property OnValueChanged: TNotifyEvent read fOnValueChanged write
           fOnValueChanged;
   property RowCount: Integer read GetRowCount write SetRowCount;
   property Rows: TRows read fRows;
 end;
 

implementation


{
************************************ TCell *************************************
}
procedure TCell.SetValue(const aValue: String);
begin
 fValue:= aValue;
 if Assigned(fOnValueChanged) then
   fOnValueChanged(Self);
end;

{
************************************ TCells ************************************
}
constructor TCells.Create(aCellCount: Integer);
var
 i: Integer;
begin
 inherited Create;
 fCells:= TList.Create;
 for i:= 1 to aCellCount do
   fCells.Add(TCell.Create);
end;

destructor TCells.Destroy;
var
 obj: TObject;
begin
 while (fCells.Count <> 0) do begin
   obj:= TObject(fCells.First);
   fCells.Remove(obj);
   obj.Free;
 end;
 fCells.Free;
 inherited Destroy;
end;

function TCells.AddCell(aOnValueChanged: TNotifyEvent): TCell;
var
 cell: TCell;
begin
 cell:= TCell.Create;
 cell.OnValueChanged:= aOnValueChanged;
 fCells.Add(cell);
 //  Result:= cell;
end;

procedure TCells.DeleteCell(Index: Integer);
begin
 TObject(fCells[Index]).Free;
end;

function TCells.GetCell(Index: Integer): TCell;
begin
 Result:= TCell(fCells[Index]);
end;

function TCells.GetCount: Integer;
begin
 Result:= fCells.Count;
end;

{
************************************* TRow *************************************
}
constructor TRow.Create(aColumns: Integer);
begin
 inherited Create;
 fCells:= TCells.Create(aColumns);
end;

destructor TRow.Destroy;
begin
 fCells.Free;
 inherited Destroy;
end;

{
************************************ TRows *************************************
}
constructor TRows.Create(aRowCount, aColumnCount: Integer);
var
 i: Integer;
begin
 inherited Create;
 fRows:= TList.Create;
 for i:= 1 to aRowCount do
   fRows.Add(TRow.Create(aColumnCount));
end;

destructor TRows.Destroy;
var
 obj: TObject;
begin
 while (fRows.Count <> 0) do begin
   obj:= TObject(fRows.First);
   fRows.Remove(obj);
   obj.Free;
 end;
 fRows.Free;
 inherited Destroy;
end;

function TRows.AddRow(aColumnCount: Integer): TRow;
begin
 Result:= TRow.Create(aColumnCount);
 fRows.Add(Result);
end;

procedure TRows.DeleteRow(Index: Integer);
var
 obj: TObject;
begin
 obj:= TObject(fRows[Index]);
 fRows.Remove(obj);
 obj.Free;
end;

function TRows.GetCount: Integer;
begin
 Result:= fRows.Count;
end;

function TRows.GetRow(Index: Integer): TRow;
begin
 Result:= TRow(fRows[Index]);
end;

{
************************************ TGrid *************************************
}
constructor TGrid.Create(aRowCount, aColumnCount: Integer);
begin
 inherited Create;
 fRows:=TRows.Create(aRowCount, aColumnCount);
 fRowCount:= aRowCount;
 fColumnCount:= aColumnCount;
end;

destructor TGrid.Destroy;
begin
 fRows.Free;
 inherited Destroy;
end;

function TGrid.GetCell(aRow, aColumn: Integer): TCell;
begin
 Result:= fRows[aRow].Cells[aColumn];
end;

function TGrid.GetColumnCount: Integer;
begin
 Result:= fColumnCount;
end;

function TGrid.GetRowCount: Integer;
begin
 Result:= fRowCount;
end;

procedure TGrid.SetColumnCount(aValue: Integer);
var
 i: Integer;
 ii: Integer;
 c: TCell;
begin
 fColumnCount:= aValue;
 
 for ii:= 0 to fRowCount -1 do
   if aValue > fRows[ii].Cells.Count then
     for i:= fRows[ii].Cells.Count + 1 to aValue do begin
       c:= fRows[ii].Cells.AddCell(fOnValueChanged);
     end
   else
     for i:= fRows[ii].Cells.Count - 1 downto aValue do
       fRows[ii].Cells.DeleteCell(fRows[ii].Cells.Count - 1);
end;

procedure TGrid.SetRowCount(aValue: Integer);
var
 i: Integer;
begin
 fRowCount:= aValue;
 
 if aValue > fRows.Count then
   for i:= fRows.Count + 1 to aValue do
     fRows.AddRow(fColumnCount)
 else
   for i:= fRows.Count - 1 downto aValue do
     fRows.DeleteRow(fRows.Count - 1);
end;


end.



--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



dm9, это мы с тобой спорили по поводу дин. массивов? Если так, то это как раз тот случай когда имеет смысл их использовать....... (Это так, чтобы ты меня не считал противником рациональности). Я щас попробую переделать это под массив, но всё равно интересно, пчему такое твориться.....


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



>>Я ж говорю - ошибка в 17-й строке

>Модификатор доступа там должен быть протектыд. Этот метод никто извне не вызывает.

Это прикол такой smile.gif Типа давай весь код показывай smile.gif


>т.е. если я правильно тебя понял, то ты хочешь сказать, что обработчик передаётся по значению

ИМХО, да


>ну смотри:

Завтра посмотрю код, сейчас времени нет. Может, найду что интересное...

Это сообщение отредактировал(а) dm9 - 19.6.2003, 22:20
PM MAIL ICQ   Вверх
altarasjuk
Дата 20.6.2003, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



Цитата
>т.е. если я правильно тебя понял, то ты хочешь сказать, что обработчик передаётся по значению
Я хоче сказать, что получается по значению! хотя по всем правилам должен передаваться по ссылке


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Fantasist
Дата 20.6.2003, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
т.е. если я правильно тебя понял, то ты хочешь сказать, что обработчик передаётся по значению


Что в твоем понимании означает, "обработчик передаётся по значению"? Обработчик - это восьмибайтовый указатель. То есть это, можно сказать, целое число поделенная на две части - в первых четырех байтах храниться указатель на объект, к которому пренадлежит метод, адрес которого храниться во вторых четырех байтах. Как ты его не передавай, хоть по ссылке, хоть по значению, его значение останеться тем же.


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


Лентяй
***


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

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



Цитата
procedure TGrid.SetColumnCount(aValue: Integer);
var
i: Integer;
ii: Integer;
c: TCell;
begin
fColumnCount:= aValue;

for ii:= 0 to fRowCount -1 do
  if aValue > fRows[ii].Cells.Count then
    for i:= fRows[ii].Cells.Count + 1 to aValue do begin
      c:= fRows[ii].Cells.AddCell(fOnValueChanged);
    end
  else
    for i:= fRows[ii].Cells.Count - 1 downto aValue do
      fRows[ii].Cells.DeleteCell(fRows[ii].Cells.Count - 1);
end;


Здесь fOnValueChanged используется, а где инициализируется? Хотя вообще спрашивать тут не о чем. Тут дебаггер в зубы и вперед.

P.S. Есть такой класс TObjectList, удобнее для хранения объектов.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



Fantasist, знаю о таком классе, но я тут использовал Tlist на случай, если надо будет перейти на интерфейсы (тогда на TInterfaceList переход будет неощутим)


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
altarasjuk
Дата 21.6.2003, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

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



Fantasistб по поводу по значению: Тут получается прикол:
Вот есть переменная onEvent: TNotifyEvent. и уже cell.onEvent:= onEvent. т.е. если мы изменяем onEvent, то по идее и cell.onEvent изменится так жеж? а этого не происходит.....


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

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

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

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

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


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

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


 




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


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

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