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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2017, 11:35   #21
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Падает где? При запуске с отладчиком обычно показывает место.

Я не вижу тут создания Levels например.
Цитата:
Сообщение от Ship_1 Посмотреть сообщение
сделал из ID property
где?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.07.2017, 11:48   #22
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Levels и Segms:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ....
  Levels:=TLevels.Create(true);
  Segms:=TSegms.Create(true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Levels.Free;
  Segms.Free;
end;
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
где?
Хотел сказать, из MaxID

Падает где-то в районе создания компонента. У меня портативная Дельфи, без отладчика... Я добавил ShowMessage в Add
Код:
function TNomList.Add(AObject: TNomObject; CreateNew: boolean = true): Integer;
begin
  if CreateNew then
  begin
    ShowMessage('creating');
    AObject := TNomObject.Create(getMaxID);
    ShowMessage('created');
    SetMaxID(GetNextMaxID);
  end;
  Result := inherited Add(AObject);
//  Items[Result].ID:=FindEmptyID;
end;
creating показывает, а до created не доходит...

Последний раз редактировалось Ship_1; 03.07.2017 в 11:51.
Ship_1 вне форума Ответить с цитированием
Старый 03.07.2017, 12:38   #23
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
У меня портативная Дельфи, без отладчика
Это как?оО

Ну так добавляйте дальше вывод пока не найдете где )
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.07.2017, 12:47   #24
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну как-как... Например, как-то так
http://delfcode.ru/load/delphi/kompi...able/9-1-0-577

Докопался.
Код:
constructor TNomObject.Create(NewID: integer);
begin
  ShowMessage('new creating');
  ID := NewID;
  ShowMessage('new created');
end;
Почему-то входит в бесконечный цикл. Всё время появляется окно
Цитата:
MID getting 60648456
Видимо, число случайное: при втором запуске оно уже было 61893640.

Последний раз редактировалось Ship_1; 03.07.2017 в 12:49.
Ship_1 вне форума Ответить с цитированием
Старый 03.07.2017, 13:08   #25
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
procedure TNomList.setMaxID(const Value: Integer);
begin
  MaxID:=Value; // И ЧТО вы здесь устанавливаете??? 
end;
свойство MaxID ?... И получаете StackOver. (P.S. тот самый бесконечный цикл)

А здесь надо устанавливать глобальную переменную. (ту которой у вас не наблюдается).

TNomList вообще по моему разумению не должен заниматься "внутренностями" TNumObject.

Код:
TNumObject =class
protected
  class function GetNextGlobalID: integer;  
private 
  FID: integer; //чтобы отличать  имена свойства(property ID) рекомендуется имена соответсвующих полей(переменных) начинать с F(ID)
  function GetID: integer;
  procedure SetID(Avalue: integer);
protected
  property ID: integer read GetID write SetID;
public
  constructor Create;
 end;

var
   GlobalCurrentID: integer; // глобальная переменная "счетчик" выданных идентификаторов.

class function GetNextID: integer; // все конструкторы будут использовать эту функцию (если конечно вызыовут её) 
begin
   result:=GlobalCurrentID; //прочитали глобальную переменную
   Inc(GlobalCurrentID); // И ТУТ же задали ей новое значение.
// больше НЕ НАДО заботиться о возможном дублировании 
end;

constructor TnumObject.Create;
begin
  inherited Create; //по хорошему надо ВСЕГДА вызывать конструктор родительского класса
  ID:=GetNextGlobalID; // теперь TnumObject САМ следит за правильным распределением идентификаторов 
end;
теперь TNomList может быть избавлен от SetMaxID, GetMaxID, GetNextMAxID.
Да и property MaxID тоже не к чему.

но можно и еще лучше (запретить изменение Fid даже чисто теотетически
Код:
TnumObject =class
.......
private
  FID: integer;
  function GetID: integer;
public
  property ID: integer read GetID  write SetID;
  constructor Create;
end;

constructor TnumObject.Create;
begin
  inherited Create;
  FID:=GetNextGlobalID; //конструктор сможет "напрямую" записать в поле
end;
ВСЕ прочее даже теоретически не смогут сделать
Код:
var
  r: TnumObject;

....
r.ID:=45; // компилятор скажет что невозможно(ID) использовать в левой части присвоения.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.07.2017 в 13:18.
evg_m вне форума Ответить с цитированием
Старый 03.07.2017, 13:30   #26
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Здорово... Спасибо!
Только вот хочется уточнить:
Код:
class function GetNextID: integer;
что означает class перед function?
И не опечатка ли здесь?
Код:
class function GetNextID: integer; // все конструкторы будут использовать эту функцию (если конечно вызовут её) 
begin
...
или GetNextGlobalID вместо GetNextID?

UPD: Хм... Только с глобальной переменной не совсем однозначно пойдёт. У меня есть TLevel, TTrace и TSegm, они все - наследники TNumObject, отличаются дополнительными свойствами и у каждого класса - свой счётчик ID. Создать ещё две переменные и как-то модифицировать GetNextGlobalID, или в данном случае имеет смысл вынести счётчик в список этих объектов?

Последний раз редактировалось Ship_1; 03.07.2017 в 13:38.
Ship_1 вне форума Ответить с цитированием
Старый 03.07.2017, 14:17   #27
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
или GetNextGlobalID вместо GetNextID?
конечно же опечатка.

class function // означает что данная функция для своего вызова не требует наличия созданного объекта.
В данном случае это вовсе не требуется, так что смело можно
Код:
class  function
мы все равно используем её только для уже созданных объектов.

Цитата:
отличаются дополнительными свойствами и у каждого класса - свой счётчик ID. Создать ещё две переменные и как-то модифицировать GetNextGlobalID,
три переменных и ТРИ функции в каждый класс TLevel TTrace Tsegm и соответственно ТРИ же РАЗНЫХ конструктора.
P.S. от разных конструкторов можно избавиться путем использования виртуальности функции.

или же подумать и решить что вполне можно обойтись ОДНИМ счетчиком.
ну будет так и что в этом будет плохого.
Код:
Tlevel 1; 3; 5;
TSegm 2; 6; 8;
TTrace 4; 7; 9
пока нет понимания, где и зачем используется данный ID.
Сравнение объектов(поиск идентичных)?
так для этого вполне достаточно того что все объекты это указатели.
Код:
var
  r1, r2: TNumOject; 
  r1:=TLevel.Create;
  r2:=TLevel.Create

  if r1=r2 then
а наличии ТРЕХ счетчиков и без приведения типов
Код:
var
  r1, r2: TnumObject;

  r1:=TLevel.Create;
  r2:=TSegml.Create;

  if r1.ID=r2.ID then  // два разных ТИПА, но ОДИНАКОВЫЙ ID
поиск в списке?
Код:
r:=levels.Add;
j:=levels.IndexOf(r);
x:=levels.items[j];
if r=x then ....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.07.2017 в 14:22.
evg_m вне форума Ответить с цитированием
Старый 03.07.2017, 14:25   #28
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

ID предполагается использовать, возможно, для поиска (не додумал ещё до этого), но в первую очередь для сохранения и загрузки (чтобы после из текстовых файлов обратно составлять списки сегментов, трасс и уровней). Исходя из этого, вроде, и ничего плохого, что счётчик один...
Ship_1 вне форума Ответить с цитированием
Старый 03.07.2017, 15:04   #29
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
но в первую очередь для сохранения и загрузки (чтобы после из текстовых файлов обратно составлять списки сегментов, трасс и уровней).
М-м-дя...
в таком случае потребуется либо ДВА конструктора
Код:
constructor Create(newID: integer );  для чтения сохраненных данных.
constructor Create; // для "программного" создания новых.
///  ну впрочем можно и один
constructor Create(newID: integer =0); // с использованием значения по умолчанию  для создания новых.
так что самое время подумать о том КАК будет выполняться ввод данных из файла.

а еще конструктор с "ручным" вводом потребует и "ручного" изменения глобальной переменной.
Код:
function TnumObject.GetNextGlobalID(currid: integer =0): integer;
begin
  if currid>GlobalMaxID then begin
   GLobalMaxID:=currid +1; //меняем нашу глобальную переменную на новое большее число 
    // если этого не сделать, то потом ПРИ генерации новых пойдут повторы.
   // для следующих мы НЕ можем использовать currID;
  end;
  if currid>0 then // независимо от значения GlobalMaxID мы должны вернуть 
     result:=currid // РОВНО то, что нам передали
  else begin
    result:=GlobalMaxID; 
    Inc(GlobalMaxID);
  end;
end;

constructor TNumObject.Create(newID: integer =0);
begin
  inherited Create;
  FID:=GetNextGlobalID(newID);
end;
P.S. да обычно для инициализации глобальных переменных удобно использовать
Код:
unit  

interface
....
implementation

....
var
  GlobalMaxID: integer;
...

initialization
  GlobalMaxID:=0;

end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.07.2017 в 15:10.
evg_m вне форума Ответить с цитированием
Старый 03.07.2017, 15:48   #30
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
constructor Create(newID: integer =0); // с использованием значения по умолчанию  для создания новых.
Да, я уже подумал об этом, правда, подумал -1 использовать по-умолчанию для создания нового...

Цитата:
Сообщение от evg_m Посмотреть сообщение
так что самое время подумать о том КАК будет выполняться ввод данных из файла.
Примерно так

Спасибо большое за функции, есть о чём подумать...
Ship_1 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
список полиморфных объектов denrubun Общие вопросы C/C++ 4 17.11.2013 14:38
Добавление своих объектов в Добавление своих объектов в двунаправленный кольцевой список voidmain C# (си шарп) 3 21.03.2013 13:08
динамический список объектов tim47 Помощь студентам 0 16.05.2012 16:17
проблема с идентификаторами itwaswritten Помощь студентам 0 08.05.2010 20:34
Список полиморфных объектов kaarb Помощь студентам 0 20.06.2009 11:24