Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Классы Delphi / 25 сообщений из 30, страница 1 из 2
04.01.2019, 15:53
    #39755883
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Есть определение класса
Код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//класс "Дерево"
  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
Как решить данную проблему?
...
Рейтинг: 0 / 0
04.01.2019, 15:58
    #39755885
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Не ясно зачем тебе var.

Сделай add функцией возвращающей TNode..
...
Рейтинг: 0 / 0
04.01.2019, 16:18
    #39755887
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
PokliКак решить данную проблему?
Проще всего её решить выкидыванием ненужного и вредного метода Add. Но в любом случае, в ходе решения более важных и насущных проблем этого кода данная проблема исчезнет сама собой.
...
Рейтинг: 0 / 0
04.01.2019, 16:18
    #39755888
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Pokli,

И покажи как метод вызываешь.
...
Рейтинг: 0 / 0
04.01.2019, 16:21
    #39755889
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Vlad FPokli,

И покажи как метод вызываешь.
Небось вон то свойство Value передает.
...
Рейтинг: 0 / 0
04.01.2019, 16:49
    #39755897
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Фэйтл Эра,

Не спугни, пусть сам расколется.))
...
Рейтинг: 0 / 0
04.01.2019, 17:15
    #39755908
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Vlad F,

Tree.Add(Tree.Value, sl);

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

Код метода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//метод добавления элемента в дерево
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;
...
Рейтинг: 0 / 0
04.01.2019, 17:17
    #39755909
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Вернее вот
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//метод добавления элемента в дерево
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;
...
Рейтинг: 0 / 0
04.01.2019, 17:23
    #39755910
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
PokliВернее вот
Код: pascal
1.
2.
//метод добавления элемента в дерево
Procedure TTree.Add(Var root: TNode; s:string):TNode;


Жжош.
...
Рейтинг: 0 / 0
04.01.2019, 17:27
    #39755911
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Фэйтл Эра,

Да я пробовал сделать функцией, от неё осталось.
...
Рейтинг: 0 / 0
04.01.2019, 17:45
    #39755913
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
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.



Все компилиться.
...
Рейтинг: 0 / 0
04.01.2019, 18:06
    #39755918
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
rgreatВсе компилиться.
Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.
...
Рейтинг: 0 / 0
04.01.2019, 18:17
    #39755920
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
PoklirgreatВсе компилиться.
Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.
Это у тебя ручонки кривые, в комплекте к косым глазонькам.
...
Рейтинг: 0 / 0
04.01.2019, 18:29
    #39755923
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Фэйтл ЭраPokliпропущено...

Хм, компилиться, а когда на форме не компилится. Ругается что поля закрытые.
Это у тебя ручонки кривые, в комплекте к косым глазонькам.
Когда они в одном модуле то компилится, не спорю, а когда в разных - нет.
...
Рейтинг: 0 / 0
04.01.2019, 18:44
    #39755928
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Pokli,

Ты справишься! Мы в тебя верим!
...
Рейтинг: 0 / 0
04.01.2019, 19:42
    #39755938
Pokli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Переделал метод. Сделал без рекурсии.
Всем спасибо.
...
Рейтинг: 0 / 0
04.01.2019, 20:38
    #39755949
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Pokli,

А мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство, то ничего бы и не пришлось переделывать на "безрекурсии".))
...
Рейтинг: 0 / 0
08.01.2019, 17:47
    #39756824
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Vlad FА мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство полеЗатем, что свойство может обрасти впоследствии сеттереом и/или геттером
...
Рейтинг: 0 / 0
08.01.2019, 18:00
    #39756829
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
_Vasilisk_Vlad FА мне вот другое в этой связи интересно, зачем плодить проперти, все равно открывая в них полный доступ ко внутреннему приватному полю? Что за мода такая? Ведь если это самое Value переопределить как простое публичное свойство полеЗатем, что свойство может обрасти впоследствии сеттереом и/или геттером
Дичь какая-то.
...
Рейтинг: 0 / 0
08.01.2019, 18:04
    #39756831
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
_Vasilisk_,

Может и оборасти. Но ведь может и не обрасти. А пока что, совершенно очевидно, что оно ему мешает воспарить к самым вершинам в иссскустве программирования. Жертвой чего пала даже технологически полезная рекурсия.))
...
Рейтинг: 0 / 0
08.01.2019, 18:05
    #39756832
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
_Vasilisk_Затем, что свойство может обрасти впоследствии сеттереом и/или геттером
Не вижу проблемы. Когда обрастёт - тогда и можно сделать свойством, на код это не повлияет (а в тех редких случаях, когда повлияет - хорошо, что проблема станет видна).
...
Рейтинг: 0 / 0
08.01.2019, 18:07
    #39756833
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Фэйтл Эра,

Дикий народ, - изумлялись туристы. Дети гор!))
...
Рейтинг: 0 / 0
10.01.2019, 08:55
    #39757642
Beltar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
var - передача параметра по ссылке с возможностью записи.
константа - не предполагает записи.

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

А вообще все давно в TTreeList или как там этот класс дерева для TTreeView сделано.
...
Рейтинг: 0 / 0
10.01.2019, 09:02
    #39757653
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Beltar,

Поднимите мне веки, - где там константа?))
...
Рейтинг: 0 / 0
10.01.2019, 10:13
    #39757686
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классы Delphi
Vlad F,

а что, по-твоему, есть использование метода в качестве аргумента? А сипипишнвх ссылок в дельфях пока что нетути. Указатели только.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Классы Delphi / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]