Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Private symbol declared but never used / 25 сообщений из 41, страница 1 из 2
14.02.2019, 13:06
    #39773807
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type
  TListener = record
    FName: string;
    FStatus: string;
    FGroupName: string;
  end;

  TListeners = class(TObject)
  private
    FCount: Integer;
    FListeners: array of TListener;
    procedure Add(NewListener: TListener);
    function Get(Index:Integer): TListener;
    procedure Put(Index:Integer; NewListener: TListener); // Пока не используется
    property Listener[Index: Integer]: TListener read Get write Put; default;
  public
    constructor Create;
    Destructor Destroy; override;
  end;


При компилляции выдает предупреждение
автор[dcc32 Hint] Unit1.pas(23): H2219 Private symbol 'Listener' declared but never used
Хотя использование (хотя и неявное, ну для этого и стоит default в описании свойства) в программе есть:
Код: pascal
1.
2.
3.
...
showmessage(Listeners[95000].FName);
...


Как так? Как избавиться от сообщения компиллятора? Или неправильно что-то в классе?
Спасибо :)
...
Рейтинг: 0 / 0
14.02.2019, 13:12
    #39773811
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
afordХотя использование (хотя и неявное, ну для этого и стоит default в описании свойства) в
программе есть

Почувствуй разницу между Listener и Listeners.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2019, 13:32
    #39773822
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Dimitry Sibiryakov, я могу заменить Listener на qqq - результат будет тем же.
...
Рейтинг: 0 / 0
14.02.2019, 13:40
    #39773830
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
У вас Listener в PRIVATE секции и к нему из кода самого TListeners обращений нет.
...
Рейтинг: 0 / 0
14.02.2019, 14:37
    #39773873
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
DimaBr, ну как же это нет, а вот это?
Код: pascal
1.
showmessage(Listeners[95000].FName);



Это равнозначно записи вида (т.к. прописано default, см. векторные свойства)
Код: pascal
1.
showmessage(Listeners.Listener[95000].FName);


Так что все используется...
Вот подробнее:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Btn1Click(Sender: TObject);
var
  Listener: TListener;
  i: Integer;
begin
  Listeners:= TListeners.Create;
  for i:= 0 to 100000 do
  begin
    Listener.FName:= 'ФИО ' + IntToStr(i);
    Listener.FStatus:= 'Статус ' + IntToStr(i);
    Listener.FGroupName:= 'Группа ' + IntToStr(i);
    Listeners.Add(Listener);
  end;
  showmessage(Listeners[95000].FName);
  Listeners.Destroy;
end;
...
Рейтинг: 0 / 0
14.02.2019, 14:39
    #39773874
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Кстати, с записью авторListeners.Listener[95000].FName проблем нет, а если уберу Listener - все работает, но компиллятор выдает предупреждение...
...
Рейтинг: 0 / 0
14.02.2019, 14:41
    #39773876
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Переместил определение свойства в public - предупреждение пропало. Но все равно не понятно почему так...
...
Рейтинг: 0 / 0
14.02.2019, 14:50
    #39773881
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
aford,

ты вообще читаешь, что тебе народ пишет?))))))))))
...
Рейтинг: 0 / 0
14.02.2019, 14:54
    #39773886
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
afordЭто равнозначно

Нет, совсем не равнозначно. Listeners у тебя массив, а не свойство.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2019, 15:01
    #39773890
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
afordDimaBr, ну как же это нет, а вот это?
Код: pascal
1.
showmessage(Listeners[95000].FName);



Это равнозначно записи вида (т.к. прописано default, см. векторные свойства)
Код: pascal
1.
showmessage(Listeners.Listener[95000].FName);


Так что все используется...
Вот подробнее:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Btn1Click(Sender: TObject);
var
  Listener: TListener;
  i: Integer;
begin
  Listeners:= TListeners.Create;
  for i:= 0 to 100000 do
  begin
    Listener.FName:= 'ФИО ' + IntToStr(i);
    Listener.FStatus:= 'Статус ' + IntToStr(i);
    Listener.FGroupName:= 'Группа ' + IntToStr(i);
    Listeners.Add(Listener);
  end;
  showmessage(Listeners[95000].FName);
  Listeners.Destroy;
end;


свойство Listeners не используется в теле TListeners и находится в ПРИВАТ секции.
То что вы используете его ХАКЕРСКИМ способом в том же модуле в другом классе, не говорит о том что делаете правильно.
Перенесите TListener в другой модуль и попробуйте достучаться к Listeners из метода формы
...
Рейтинг: 0 / 0
14.02.2019, 15:04
    #39773892
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Dimitry SibiryakovafordЭто равнозначно

Нет, совсем не равнозначно. Listeners у тебя массив, а не свойство.


Таки свойство.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
Unit1.pas.49: showmessage(Listeners[95000].FName);
004AEB60 8D4DF4           lea ecx,[ebp-$0c]
004AEB63 BA18730100       mov edx,$00017318
004AEB68 A134B84B00       mov eax,[Listeners]
004AEB6D E87A000000       call TListeners.Get
004AEB72 8B45F4           mov eax,[ebp-$0c]
004AEB75 E8B64FFDFF       call ShowMessage
...
Рейтинг: 0 / 0
14.02.2019, 15:11
    #39773897
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Listeners - это вообще-то переменная объекта TListeners или объект (как правильно, или переменная на объект, суть ясна в общем).
Listener - это свойство, которое пишет и читает поле FListener, которое в свою очередь является массивов записей TListener типа record
Запутал вас и себя)))
...
Рейтинг: 0 / 0
14.02.2019, 15:16
    #39773898
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
aford,

это явный баг Delphi. Private член класса не должен быть доступен.
Если же private свойство объявлено default, компилятор должен либо выдать error, либо не выдавать такого warning.

Ну а конкретно тебе - перенеси свойство из private в public, вот и всё решение "проблемы".
...
Рейтинг: 0 / 0
14.02.2019, 15:22
    #39773900
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
DimaBrТо что вы используете его ХАКЕРСКИМ способом в том же модуле в другом классе, не говорит о том что делаете правильно.
Перенесите TListener в другой модуль и попробуйте достучаться к Listeners из метода формы
Все равно доступен. Это баг.
...
Рейтинг: 0 / 0
14.02.2019, 15:23
    #39773901
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Фэйтл Эра, я так уже сделал еще после 2-го сообщения в ветке)
авторэто явный баг Delphi. Private член класса не должен быть доступен.

Почему, в этом же модуле должен быть доступен, или я не дочитался принципов ООП, но спорить тут не стану.
...
Рейтинг: 0 / 0
14.02.2019, 15:25
    #39773903
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
14.02.2019 15:16, Фэйтл Эра пишет:
> это явный баг Delphi. Private член класса не должен быть доступен.

иди азбуку учи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2019, 15:27
    #39773905
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
afordПочему, в этом же модуле должен быть доступен, или я не дочитался принципов ООП, но спорить тут не стану.
В рамках модуля все доступно. В нарушение всех принципов ООП. Дельфийская тупость, но позволяющая обойти другую топость с запретом циклических ссылок модулей друг на друга.
---
Но тут явный баг Delphi: private свойство доступно, если оно default. Как минимум, в D2007.
...
Рейтинг: 0 / 0
14.02.2019, 15:30
    #39773909
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
14.02.2019 15:27, Фэйтл Эра пишет:
> Дельфийская тупость, но позволяющая обойти другую топость

аклинизмы проникли в мозг...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2019, 15:31
    #39773910
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Фэйтл ЭраВсе равно доступен. Это баг.

Это не баг. В справке сказано что в классе может быть лишь одно свойство по умолчанию, и доступ к нему происходит без указания имени свойства.
Про расположение свойства в секциях ни слова

If a class has a default property, you can access that property with the abbreviation object[index], which is equivalent to object.property[index]. For example, given the declaration above, StringArray.Strings[7] can be abbreviated to StringArray[7]. A class can have only one default property with a given signature (array parameter list), but it is possible to overload the default property. Changing or hiding the default property in descendent classes may lead to unexpected behavior, since the compiler always binds to properties statically.
...
Рейтинг: 0 / 0
14.02.2019, 15:33
    #39773911
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
DimaBr,

не согласен. А если ты и прав, то, значит, баг в том, что ворнинг генерируется.
...
Рейтинг: 0 / 0
14.02.2019, 15:36
    #39773913
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
14.02.2019 15:33, Фэйтл Эра пишет:
> не согласен.

в спортлото пиши, кловун.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2019, 15:36
    #39773915
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Фэйтл Эразначит, баг в том, что ворнинг генерируется
Это действительно баг, тут ворнинга быть не должно. А вот видимость приватных членов в рамках модуля не баг. Если хочешь строгой приватности используй strict private.
...
Рейтинг: 0 / 0
14.02.2019, 15:40
    #39773918
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
Даже объявление в другом модуле даёт доступ к privat-default свойству
...
Рейтинг: 0 / 0
14.02.2019, 15:45
    #39773920
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
DimaBrДаже объявление в другом модуле даёт доступ к privat-default свойству
Ох какой лютый жучара
...
Рейтинг: 0 / 0
14.02.2019, 15:49
    #39773924
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Private symbol declared but never used
топикстартеру, либо избавляться от дефолтного свойства, либо его декларацию заключить между дируктивами {$hints off}property...{$hints on} (если не напрягает вылезшая неожиданность)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Private symbol declared but never used / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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