Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2013, 01:27   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Указатели. Объект из списка, добавление в него через указатель.

Доброго времени суток!

Есть список объектов - список очередей.
В очередь юзер добавляет элементы, затем очередь передается менеджеру очередей и этой очереди юзер выставляет задание для объектов, затем очередь пускается в ход и передается форме отображения процесса работы.

Моя идея в том, чтобы очередь не передавалась как объект от переменой к переменной, а как указатель на одно и тоже место. Очередь существует пока не отработает или пока не будет прервана пользователем.

Вот что я придумал:
Код:
type
  TQueue = class;
  pQueue = ^TQueue;

  ...

  TQueue = class(TObjectList)
  public
    //Добавление элемента в очередь
    function AddData(aData: Pointer): Integer; overload;
    //Получение указателя на себя
    function GetPtr: pQueue;
  end;

...

  TQueuesMngr = class(TObjectList)
...
  public
...
    function CreateQueue: pQueue; overload;
    function CreateQueue(aMode: TFormMode): pQueue; overload;
  end;

...

{ TQueue }

function TQueue.AddData(aData: Pointer): Integer;
begin
  Result := Add(TQueueItem.Create(Self, aData));
end;

function TQueue.GetPtr: pQueue;
begin
  Result := Addr(Self);
end;

{ TQueuesMngr }

function TQueuesMngr.CreateQueue(aMode: TFormMode): pQueue;
begin
  Result := CreateQueue;
  Result.Mode := aMode;
end;

function TQueuesMngr.CreateQueue: pQueue;
begin
  Result := Self[Add(TQueue.Create(Self))].GetPtr;
end;
Далее в теле формы объявил переменную:
Код:
Queue:pQueue;
Вот постановка элементов на очередь:
Код:
 var
  Form: TExportTemplatesMngrView;
  Data: TNodeData;
  Node: PVirtualNode;
begin
  Form := TExportTemplatesMngrView.Create(self);
  try
    if Tree.SelectedCount > 0 then
    begin
      {Создается объект очереди, ставится в менеджер очередей, СЮДА передается указатель этот этот объект}
      Queue := MM.Queues.CreateQueue(fmExportQueue);

      Node := Tree.GetFirstSelected;
      while (Node <> nil) do
      begin
        if NodeHaveObject(Tree, Node, Data) then
        begin
          if (Data.Kind = dkRouterUser) then
            Queue.AddData(Data.P);  //ОШИБКА ВОЗНИКАЕТ ЗДЕСЬ
        end;
        Node := Tree.GetNextSelected(Node);
      end;
      Form.Queue := Queue;
    end;
    Form.ShowModal;
Возникает Access Violation, имеется след. стэк вызова(читать снизу-вверх):
Код:
System.Classes.TList.Add($3CB6080) <- ОШИБКА здесь.
clQueuesMngr.TQueue.Add($3CB6080) <-Добавление элемента в очередь
clQueuesMngr.TQueue.AddData($3CBDD90) < - Создание TQueueItem для указателя Data.P, передача в очередь
frmMainView.TMainForm.MFileExportTplMngrBtnClick($3C79780)  < - Метод
Ошибка здесь:
Код:
function TList.Add(Item: Pointer): Integer;
begin
  Result := FCount;
  if Result = FCapacity then
    Grow;
  FList[Result] := Item;
  Inc(FCount);
  if (Item <> nil) and (ClassType <> TList) then
    Notify(Item, lnAdded);
end;

Не зависимо, как я обращаюсь к указателю, так:
Код:
Queue^.<>
или без знака ^.
Ошибка возникает.

Если я вместо указателя верну сам объект - проблемы нет, но это не катит совсем. Очередей может быть несколько.
И гонять объект по формам, классам вместо указателя на одно и тоже место - как-то совсем проблематично.


Как быть?
Человек_Борща вне форума Ответить с цитированием
Старый 27.07.2013, 01:52   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Как быть?
Это академический вопрос или практический?
Имеет ли он отношение к вопросу http://programmersforum.ru/showthread.php?t=241230 ?
northener вне форума Ответить с цитированием
Старый 27.07.2013, 02:02   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Это академический вопрос или практический?
практический. Не понимаю почему происходит ошибка при добавлении элемента в список объектов "Очередь" через указатель. А если через объект, то все нормально.

Объект по указателю существует и не равен nil.

Цитата:
Имеет ли он отношение к вопросу
Нет, тут другое.
У каждой очереди свой поток конечно же есть. Чтобы пользователь мог несколько раз разные данные, печатать и экспортировать через разные устройства, в разные форматы.
С ним проблем нет.

Последний раз редактировалось Человек_Борща; 27.07.2013 в 02:06.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы. Указатель на объект в классе. Son Помощь студентам 2 21.05.2013 18:45
Указатель на объект внутри класса WildTaburet Visual C++ 1 01.10.2012 14:34
TFileStream есть ли у него указатель на данные? Warn Общие вопросы Delphi 8 19.11.2011 18:46
Как можно закрепить за окном класс(указатель на него) Warn Общие вопросы Delphi 7 06.11.2011 15:05
При присваивании копируется объект или ссылка на него? KiL0z Общие вопросы Delphi 2 11.06.2011 19:57