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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2012, 14:12   #1
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию !? Ссылка на класс ?

Доброго времени суток, есть проблемка. Сделал программу с записями, она работает, всё меня устраивает. Теперь надо эту же программу сделать в виде классов, пытался сделать так же как с записями:
Цитата:
unit Unit1;

interface

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

type
TList=TMyList;
TMyList=class
private
Value: integer;
Index: integer;
Previous: TList;
Next: TList;

protected
Procedure Init;
Procedure AddItem(Value: integer);
Procedure InsertItem(i, j: integer);
Procedure DeleteItem(i: integer);
Procedure Exchange(i, j: integer);
Procedure RemoveItem(Value: integer);
Procedure FindValue(Value: integer);
Procedure Sort;
Function GetCount: integer;
Function ListAsStr: string;
end;

TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
FList: TMyList;
public
{ Public declarations }
end;

var
ChoiceItem, CreatItem: TList;
Form1: TForm1;

implementation

{$R *.dfm}

{ TMyList }

procedure TMyList.AddItem(Value: integer);
begin
if (ChoiceItem = nil) then
begin
New(CreatItem);
CreatItem.Index := 1;
CreatItem.Value := Value;
CreatItem.Previous := nil;
CreatItem.Next := nil;
ChoiceItem := CreatItem;
end
else
begin
New(CreatItem);
CreatItem.Value := Value;
CreatItem.Index := ChoiceItem.Index + 1;
While (ChoiceItem.Next <> nil) do
ChoiceItem := ChoiceItem.Next;

CreatItem.Previous := ChoiceItem;
CreatItem.Next := nil;
ChoiceItem.Next := CreatItem;
end;
end;

....
НО начиная перебирать указатели ChoiceItem.Next не меняет значения и все зацикливается. Это не только в этой процедуре, так везде, как будто .Next и .Previous не передаются новозадонному ChoiceItem. Вообщем я так подозреваю что нельзя так делать с классами и придется делать constructor destructor и все переделывать, или я ошибаюсь?
P.S. Я не прошу писать мне программу, просто хочу понять, где я что упустил. Заранее благодарен.
Не забываем про весы.
KooKish вне форума Ответить с цитированием
Старый 18.12.2012, 14:18   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Потому что "крышку" забыл закрыть:

Код:
TList=^TMyList;
Далее: TList - это стандартный класс дельфи, наследующий у TObject. Может случиться конфуз, так что переименуй-ка ты его от греха подальше
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.12.2012, 14:28   #3
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Вообщем у меня крыжик стоял, я просто химичил, назад забыл вернуть, но его добавление и изменение имени TList не привело к положительному результату (( я уже 3 часа по интернету лажу, ничего дельного найти не могу... Я просто понять немогу почему передавая ChoiceItem := ChoiceItem.Next ChoiceItem становится следующим указателем а ChoiceItem.Next так и остается ссылкой, получается уже на этот же указатель и происходит зацикливание...
Не забываем про весы.
KooKish вне форума Ответить с цитированием
Старый 18.12.2012, 14:34   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Естественно, не привело - в коде крыжик тоже надо возвращать на место:

Код:
CreatItem^.Value := Value;
CreatItem^.Index := ChoiceItem.Index + 1;
While (ChoiceItem^.Next <> nil) do
ChoiceItem^ := ChoiceItem^.Next;
CreatItem^.Previous := ChoiceItem;
CreatItem^.Next := nil;
ChoiceItem^.Next := CreatItem;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.12.2012, 14:42   #5
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Код:
ChoiceItem^ := ChoiceItem^.Next;
хм, разве так можно ??? Ругается на разность типов.
Не забываем про весы.
KooKish вне форума Ответить с цитированием
Старый 18.12.2012, 14:44   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
ChoiceItem := ChoiceItem^.Next;
Моя опечатка, так пробуйте
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.12.2012, 14:50   #7
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Вообщем, не помогло. Есть еще идеи? может в описании дело ??? У меня уже крыша ехать начинает) Кстати в списках у меня и без крыжиков работает все
Не забываем про весы.
KooKish вне форума Ответить с цитированием
Старый 18.12.2012, 15:10   #8
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Я тут заметил, при вводе 2 элемента CreatItem^.Next := nil не присваетвает ему nil... что происходит ?))))

Вообщем присваивает, но при выходе из процедуры AddItem CreatItem становится = ChoiceItem, вообщем я вообще запутался, из за чего это происходит ???
Не забываем про весы.

Последний раз редактировалось KooKish; 18.12.2012 в 15:13.
KooKish вне форума Ответить с цитированием
Старый 18.12.2012, 16:00   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Начнём сначала:

1.
Цитата:
Код:
var
ChoiceItem, CreatItem: TList;
если вы используете класс, то все переменные, используемые в процедурах и функциях класса должны быть либо описаны в классе, либо быть локальными для этой процедуры. Иначе при одновременной работе с двумя и более переменными данного класса у вас могут теряться данные.
2. справедливое замечание про TList: во-первых, T указывает, что переменная данного типа - объект, а для указателей (в том числе и на объекты) используются типы начинающиеся на P. Понятно, что это не обязательное требование, но читабельность кода заметно повышается.
3. Нужно быть редким извращенцем, чтобы работать со всем массивом из переменной элемента этого массива. Вы сами себе добавляете головной боли. Сделайте проще - запись или мини-объект для отдельного элемента:
Код:
  PElem = ^TElem;
  TElem = class
     Value : Integer;
     Prev : PElem;
     Next : PElem;
  end;{class}
после чего можно создавать класс списка типа:
Код:
  TMyList = class
     Head : PElem; {голова списка}
     Last : PElem; {конец списка}
     Count : Integer;
  {ну и так дальше}
Здесь же можете хранить и активный элемент списка.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 18.12.2012 в 16:04.
DiemonStar вне форума Ответить с цитированием
Старый 18.12.2012, 16:51   #10
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Уважаемый, побоюсь спросить) В данном случае Указатели создаются New(Last), так ? Просто при таком создании выдает ошибку
Не забываем про весы.

Последний раз редактировалось KooKish; 18.12.2012 в 16:54.
KooKish вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# класс -> Ссылка на объект не указывает на экземпляр объекта. MyXa C# (си шарп) 2 17.06.2012 07:28
Добавить класс в проект2,похожий на класс из проекта1!оба проекта есть! xeops C# (си шарп) 0 15.05.2012 20:31
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Свой класс - ошибка линковки LNK2019: ссылка на неразрешенный внешний символ... Egyptorium Общие вопросы C/C++ 7 11.01.2012 17:48
ссылка на класс adwaer Общие вопросы .NET 3 01.04.2010 23:50