Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Есть определение класса
Код:

TNode=class
private
  FValue:string;
  FLeft,FRight:TNode;
public
  property Left: TNode read FLeft write FLeft;
  property Right: TNode read FRight write FRight;
  property Value: string read FValue write FValue;
end;


Есть определение другого класса
Код:

//класс "Дерево"
  TTree = class
  private
   Froot: TNode;
  public
    //Процедура добавления узла в дерево
    Procedure Add(var root: TNode; s:string);
    //свойство для получения значения Froot
    property Value: TNode read Froot write Froot;
  end;{TTree}


И вот при вызове метода Add класса TTree выскакивает следующая ошибка: constant object cannot be passed as var parameter
Как решить данную проблему?
4 янв 19, 15:53    [21778419]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 5004
Не ясно зачем тебе var.

Сделай add функцией возвращающей TNode..
4 янв 19, 15:58    [21778421]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57003
Блог
Pokli
Как решить данную проблему?

Проще всего её решить выкидыванием ненужного и вредного метода Add. Но в любом случае, в ходе решения более важных и насущных проблем этого кода данная проблема исчезнет сама собой.
4 янв 19, 16:18    [21778430]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Pokli,

И покажи как метод вызываешь.
4 янв 19, 16:18    [21778432]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Vlad F
Pokli,

И покажи как метод вызываешь.

Небось вон то свойство Value передает.
4 янв 19, 16:21    [21778435]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Фэйтл Эра,

Не спугни, пусть сам расколется.))
4 янв 19, 16:49    [21778454]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Vlad F,

Tree.Add(Tree.Value, sl);

Это нужно, чтобы рекурсивно добавлять элементы.

Код метода:
//метод добавления элемента в дерево
Function TTree.Add(root: TNode; s:string):TNode;
Begin
   //если корень пуст то
  if root = nil then
  Begin
    //создаём его
    Result:=TNode.Create(s);
    exit;//выходим
  End;
  //если добавляемое значение меньше чем значение root.GetValue то
  //добавляем его в левое поддерево
  if AnsiLowerCase(s)<AnsiLowerCase(root.GetValue) then Result:=Add(root.Fleft,s)
  //иначе добавляем в правое поддерево
  else Result:=Add(root.FRight,s);
End;
4 янв 19, 17:15    [21778476]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Вернее вот
//метод добавления элемента в дерево
Procedure TTree.Add(Var root: TNode; s:string):TNode;
Begin
   //если корень пуст то
  if root = nil then
  Begin
    //создаём его
    root:=TNode.Create(s);
    exit;//выходим
  End;
  //если добавляемое значение меньше чем значение root.GetValue то
  //добавляем его в левое поддерево
  if AnsiLowerCase(s)<AnsiLowerCase(root.GetValue) then Add(root.Fleft,s)
  //иначе добавляем в правое поддерево
  else Add(root.FRight,s);
End;
4 янв 19, 17:17    [21778477]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Pokli
Вернее вот
//метод добавления элемента в дерево
Procedure TTree.Add(Var root: TNode; s:string):TNode;

Жжош.
4 янв 19, 17:23    [21778478]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Фэйтл Эра,

Да я пробовал сделать функцией, от неё осталось.
4 янв 19, 17:27    [21778479]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 5004
program Project6;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type

  TNode=class
  private
    FValue:string;
    FLeft,FRight:TNode;
  public
    constructor Create(s: string);
    property Left: TNode read FLeft write FLeft;
    property Right: TNode read FRight write FRight;
    property Value: string read FValue write FValue;
  end;

  TTree = class
  private
   Froot: TNode;
  public
    //Процедура добавления узла в дерево
    Procedure Add(var root: TNode; s:string);
    //свойство для получения значения Froot
    property Value: TNode read Froot write Froot;
  end;

{ TTree }

procedure TTree.Add(var root: TNode; s: string);
begin
  if root = nil then
  Begin
    //создаём его
    root:=TNode.Create(s);
    exit;//выходим
  End;
  //если добавляемое значение меньше чем значение root.GetValue то
  //добавляем его в левое поддерево
  if AnsiLowerCase(s)<AnsiLowerCase(root.Value) then Add(root.Fleft,s)
  //иначе добавляем в правое поддерево
  else Add(root.FRight,s);
end;

{ TNode }

constructor TNode.Create(s: string);
begin
  Value:=s;
end;

begin
end.


Все компилиться.
4 янв 19, 17:45    [21778481]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
rgreat
Все компилиться.

Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.
4 янв 19, 18:06    [21778490]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Pokli
rgreat
Все компилиться.

Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.

Это у тебя ручонки кривые, в комплекте к косым глазонькам.
4 янв 19, 18:17    [21778495]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Фэйтл Эра
Pokli
пропущено...

Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.

Это у тебя ручонки кривые, в комплекте к косым глазонькам.

Когда они в одном модуле то компилится, не спорю, а когда в разных - нет.
4 янв 19, 18:29    [21778499]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 5004
Pokli,

Ты справишься! Мы в тебя верим!
4 янв 19, 18:44    [21778508]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Pokli
Member

Откуда:
Сообщений: 7
Переделал метод. Сделал без рекурсии.
Всем спасибо.
4 янв 19, 19:42    [21778522]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Pokli,

А мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство, то ничего бы и не пришлось переделывать на "безрекурсии".))
4 янв 19, 20:38    [21778539]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10926
Vlad F
А мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство поле
Затем, что свойство может обрасти впоследствии сеттереом и/или геттером
8 янв 19, 17:47    [21780022]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
_Vasilisk_
Vlad F
А мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство поле
Затем, что свойство может обрасти впоследствии сеттереом и/или геттером

Дичь какая-то.
8 янв 19, 18:00    [21780030]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
_Vasilisk_,

Может и оборасти. Но ведь может и не обрасти. А пока что, совершенно очевидно, что оно ему мешает воспарить к самым вершинам в иссскустве программирования. Жертвой чего пала даже технологически полезная рекурсия.))
8 янв 19, 18:04    [21780033]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57003
Блог
_Vasilisk_
Затем, что свойство может обрасти впоследствии сеттереом и/или геттером

Не вижу проблемы. Когда обрастёт - тогда и можно сделать свойством, на код это не повлияет (а в тех редких случаях, когда повлияет - хорошо, что проблема станет видна).
8 янв 19, 18:05    [21780034]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Фэйтл Эра,

Дикий народ, - изумлялись туристы. Дети гор!))
8 янв 19, 18:07    [21780035]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Beltar
Member

Откуда:
Сообщений: 199
var - передача параметра по ссылке с возможностью записи.
константа - не предполагает записи.

Я один вижу тут взаимоисключающие параграфы?

А вообще все давно в TTreeList или как там этот класс дерева для TTreeView сделано.
10 янв 19, 08:55    [21781241]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Beltar,

Поднимите мне веки, - где там константа?))
10 янв 19, 09:02    [21781255]     Ответить | Цитировать Сообщить модератору
 Re: Классы Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Vlad F,

а что, по-твоему, есть использование метода в качестве аргумента? А сипипишнвх ссылок в дельфях пока что нетути. Указатели только.
10 янв 19, 10:13    [21781302]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить