Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2012, 16:14
Velz Velz вне форума
Прохожий
 
Регистрация: 02.04.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Добавление записи в динамический массив

Здравствуйте.
Столкнулся с некоторыми проблемами при создании объекта и массива этого-же объекта, конкретно - с манипуляцией элементов в массиве.
Объект содержит только энный набор данных и несколько функций "одиночной" обработки.
Код:
type

  TCommand = class (TObject)
    ComList: TStringList;
    Error: Cardinal;
  public
    procedure AssignObjects (ObjArray: array of TObject) ;
    procedure AssignStrings (Str: TStrings);
    procedure AssignObjectsStrings (Str: TStrings);
    constructor Create;
    destructor Free;
  end;
Далее формируются запчасти для массива и сам массив:
Код:
  TCommandStackElement= record
  Command: TCommand;
  Time: TDateTime;
  end;

  TCommandStackElmt = array of TCommandStackElement;
  PCommandStackElmt = ^TCommandStackElmt;


  TCommandStack = class (TObject)
  private
    PCommandStack: PCommandStackElmt;
    Created: Boolean;  //проверка на "созданность"
    FSize: Cardinal;     //под сколько элементов уже выделено памяти
    FCount: Cardinal;  //количество занятых элементов
  public
    function AddNew (ICommand: TCommand): Boolean;
//и остальные функции обработки
На данный момент выделение памяти делаю по блочно (FSize всегда кратно 256 и не меньше FCount)
Код:
ReallocMem(PCommandStack,(FSize)*SizeOf(TCommandStackElement));
Вот здесь возникает 1я проблема - при быстром добавлении элементов, программа не успевает выделить очередной блок памяти и обработать текущую, что ведет к ошибкам. Как можно реанимировать пациента? (вводить в клас дополнительный буллин на состояние ReallocMem, или есть другие методы?)

2я проблема в добавлении элемента - для этого вызывается AddNew (ICommand: TCommand):
Код:
function TCommandStack.AddNew (ICommand: TCommand): Boolean;
var OldLength: Cardinal;
begin
 try
  Result:=True;
  if FSetSize(Self.FCount+1) then
  begin
    Inc(FCount);
    try
      PCommandStack^[Self.FCount].Time:=Now;
      PCommandStack^[Self.FCount].@Command:=@ICommand;
    except
      Result:=False;
      PCommandStack^[Self.FCount].Command:= TCommand.create;
      PCommandStack^[Self.FCount].Command:=ICommand;
    end;
  end;
 except
 end;
end;
Собственно конкретно эта конструкция неверна - PCommandStack^[Self.FCount].@Command:=@ICommand; явно дико воспринимается компилятором (аналог в эксепте - работает). Задумка передачи указателя - после передачи элемента в массив, он все равно тут-же освобождается. Соответственно проще отдать "руль", а не создавать с 0ля. Весь вопрос как это сделать - создавать массив указателей:
Код:
  PCommandStackElement = ^TCommandStackElement;
  TCommandStackElmt = array of ^PCommandStackElement;
  PCommandStackElmt = ^TCommandStackElmt;


  TCommandStack = class (TObject)
  private
    PCommandStack: PCommandStackElmt;
или есть какая-нибудь хитрая функция/процедура?

Последний раз редактировалось Velz, 02.04.2012 в 16:19.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:55.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025