Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Передача класса в функцию.


Автор: CynicRus 12.7.2012, 08:54
Есть класс, в котором находятся некие данные в виде динамического массива:
Код

TSimbaComponentList = class
  private
    SimbaList: array of TSimbaComponent; // Simba components storage
  public
  constructor Create;
  destructor Destroy; override;
  procedure AddItem(Item: TSimbaComponent;index: integer);
  procedure RemoveItem(Index: Integer);
  function GetComponent(Idx: integer): TSimbaComponent;
  function Count: integer;
end;

implementation

{ TSimbaComponentList }

constructor TSimbaComponentList.Create;
begin
  setlength(SimbaList,1);
  inherited Create;
end;

destructor TSimbaComponentList.Destroy;
begin
  SimbaList := nil; //free storage
  inherited Destroy;
end;

procedure TSimbaComponentList.AddItem(Item: TSimbaComponent;index: integer);
var
  len: integer;
begin
  Len:= Length(SimbaList);
  if Index >= Len then Index := Len+1;
   setLength( SimbaList, Len+1);
   move( SimbaList[Index],SimbaList[ Index+1 ],
         (Len-Index) * sizeof( SimbaList[Index] ));
   SimbaList[Index] := Item;
end;

procedure TSimbaComponentList.RemoveItem(Index: Integer);
var
  last: integer;
begin
  last := high(SimbaList);
  if Index <  Last then move( SimbaList[Index+1], SimbaList[Index],
       (Last-Index) * sizeof( SimbaList[Index] )  );
   setLength(SimbaList, Last );
end;

function TSimbaComponentList.GetComponent(Idx: integer): TSimbaComponent;
begin
  result:= SimbaList[Idx];
end;


function TSimbaComponentList.Count: integer;
begin
  Result := Length(SimbaList);
end;

Создаю экземпляр этого класса, перед передачей в функцию - смотрю, он заполнен. Затем передаю в процедуру:
Код

procedure TCodeGen.CreateScript(list: TSimbaComponentList);
var
  i: integer;
begin
  for i:=0 to list.Count -1 do begin
    CmpList.AddItem(list.GetComponent(i),i);
  end;
  GenerateFormCode(list);
  SynEdit1.Lines.AddStrings(ScriptCode);
end;                                
 - проверяю экземпляр класса, который должен был принять переданное - а он стабильно имеет 1 элемент. Как тут быть?

Автор: Frees 12.7.2012, 09:03
А если не мудрить с индексом а добавлять в конц?


Код

procedure TSimbaComponentList.AddItem(Item: TSimbaComponent);
var
  len: integer;
begin
   Len:= Length(SimbaList);
   if Index >= Len then 
     Index := Len+1;
   Inc(Len);
   setLength( SimbaList, Len);
   SimbaList[Len - 1] := Item;
end;


Точно не помню но какая то проблема была с похожим кодам
Цитата(CynicRus @  12.7.2012,  11:54 Найти цитируемый пост)
   move( SimbaList[Index],SimbaList[ Index+1 ],         (Len-Index) * sizeof( SimbaList[Index] ));


Автор: CynicRus 12.7.2012, 09:06
Тоже, как вариант. Но тем не менее - при передачи класса в процедуру, экземпляр класса из процедуры имеет 1 элемент-(

Автор: Frees 12.7.2012, 09:17
Код

GenerateFormCode(CmpList);

а не 
Код

GenerateFormCode(list);


Добавлено через 4 минуты и 35 секунд
Цитата(CynicRus @  12.7.2012,  11:54 Найти цитируемый пост)
- а он стабильно имеет 1 элемент.

А сколько должно быть?

Автор: CynicRus 12.7.2012, 09:24
Оу, спасибо.

Автор: Frees 12.7.2012, 09:33
Цитата(CynicRus @  12.7.2012,  11:54 Найти цитируемый пост)
он стабильно имеет 1 элемент

в только что созданном экземпляре  у тебя всегда есть 1 элемент
Код

constructor TSimbaComponentList.Create;
begin
  setlength(SimbaList, 1);//может 1 на 0 поменять.
  inherited Create;
end;

Автор: CynicRus 12.7.2012, 09:57
Да, я уже разобрался-))) Спасибо ещё раз-)

Автор: gesper 19.8.2012, 14:40
Очень часто такое бывает, что сидишь тупишь, почему ошибка вылазит или не получается что то. Создашь тему с вопросом, а пока ждешь хорошего ответа ил подсказки, то сам находишь решение. ИМХО, общение нужно больше чем ответы на вопросы. Жаль что чатов сейчас мало smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)