powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ClassName
25 сообщений из 33, страница 1 из 2
ClassName
    #39518246
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Есть вот такой класс

Код: 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.
  TClass0 = class
    function MyClassName: string;
    procedure ShowName0;
  end;

  TClass1 = class (TClass0)
    procedure ShowName1;
  end;

  TClass2 = class (TClass1)
    procedure ShowName2;
  end;

implementation

function TClass0.MyClassName: string;
begin
  Result := ClassName;
end;

procedure TClass0.ShowName0;
begin
  ShowMessage(MyClassName);
end;

procedure TClass1.ShowName1;
begin
  ShowMessage(MyClassName);
end;

procedure TClass2.ShowName2;
begin
  ShowMessage(MyClassName);
end;



Чем можно заменить ClassName, в MyClassName чтобы всегда отображалось имя родителя, в котором находится вызов?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  with TClass2.Create do
  try
    ShowName2;
    ShowName1;
    ShowName0;
  finally
    Free;
  end;



Т.е. должно показать TClass2, TClass1, TClass0. Сейчас всегда будет TClass2

У меня есть иерархия форм, вложенность достаточно большая.
Хочу знать в каком из родителей находится вызванный метод.

З.Ы. Я изобретаю свой велосипед с локализацией, но в вопросу это имеет мало отношения.
...
Рейтинг: 0 / 0
ClassName
    #39518269
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про override слышал?
...
Рейтинг: 0 / 0
ClassName
    #39518272
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже еще проще: не нужно перекрывать ничего. В любом классе ClassName это имя его класса.
...
Рейтинг: 0 / 0
ClassName
    #39518282
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Как может сосуществовать "иерархия форм, вложенность достаточно большая" и "Про override слышал?" ?
Конечно слышал.
Да, я понимаю, что в методе ShowName1 вместо ShowMessage(MyClassName) можно написать ShowMessage('TClass1').
Можно ли константу заменить какой-либо функцией?
...
Рейтинг: 0 / 0
ClassName
    #39518284
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийМожно ли константу заменить какой-либо функцией?
В любом месте любого класса напиши ShowMessage(ClassName) и всё.

Документация не врёт.
авторReturns a string indicating the type of the object instance (as opposed to the type of the variable passed as an argument).
...
Рейтинг: 0 / 0
ClassName
    #39518288
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
Я хочу при вызове TClass2.ShowName1 - получить "TClass1", а не "TClass2"
...
Рейтинг: 0 / 0
ClassName
    #39518292
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
08.09.2017 15:37, Шавлюк Евгений пишет:
> Я хочу при вызове TClass2.ShowName1 - получить "TClass1", а не "TClass2"

зачем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ClassName
    #39518294
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийЯ хочу при вызове TClass2.ShowName1 - получить "TClass1", а не "TClass2"
Зачем? Сам не в курсе, что от чего наследуется?
...
Рейтинг: 0 / 0
ClassName
    #39518310
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийзачем?
Цель - велосипед для локализации
1. Есть большая иерархия форм. Упрощенно так: Форма-без-DBGrid > Форма-C-DBGrid > Форма-C-DBGrid-и-Detail
Простой-справочник = class(Форма-C-DBGrid)
Документ = class(Форма-C-DBGrid-и-Detail)
Приходная-накладная = class(Документ)
и т.д.

2. В каждой из родительских форм есть сообщения, общие для наследников.
3. Я хочу переводить эти сообщения не для каждой формы, а только для конкретного класса.
4. При формировании строки мне важно откуда она вызвана, из родительского класса, или уже в наследнике

Во всех формах вместо
Код: pascal
1.
ShowMessage('Сообщение для пользователя')

я заменил на
Код: pascal
1.
ShowMessage(lc('Сообщение для пользователя'))

Где lc - функция, объявленная "Форма-без-DBGrid" для локализации
Код: pascal
1.
function lc(Str: string): string; virtual;

она подменяет сообщения на нужный язык.
Кроме того, неизвестные тексты, lc записывает в базу, как не переведенные.
Мне было бы удобнее знать откуда был вызов этой функции.
В реальности немного сложнее, но в общем так.
...
Рейтинг: 0 / 0
ClassName
    #39518314
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийМне было бы удобнее знать откуда был вызов этой функции.
Ставлю на то, что
Шавлюк ЕвгенийФорма-без-DBGrid > Форма-C-DBGrid > Форма-C-DBGrid-и-Detail
у каждой формы своё имя класса.
...
Рейтинг: 0 / 0
ClassName
    #39518322
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanу каждой формы своё имя класса.146%
Но есть одно но...
1. Я вызываю в самом последнем "наследнике" метод "сохранить"
И мне из голос Родителя0 говорит - "Введи данные", Ввожу, еще раз сохраняю, и уже голос из Родителя1 говорит "А туда нельзя, период закрыт". Метод "Сохранить" - объявлен как virtual и в наследниках переопределяется.

Я хочу получать табличку вида:
"Введи данные" - Родитель0
"А туда нельзя, период закрыт" - Родитель1

ClassName даст всегда имя "Наследник", а надо в зависимости от места вызова.
Я мог бы вместо
Код: pascal
1.
ShowMessage(lc('Сообщение для пользователя'))

писать
Код: pascal
1.
ShowMessage(lc('Сообщение для пользователя', 'TФорма-C-DBGrid'))

и это был бы тот результат, что мне нужен, но в этом случае код очень сильно замусоривается.
...
Рейтинг: 0 / 0
ClassName
    #39518325
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
весьма велосипедный способ локализации.
ну да Бог с ним.
смотри сюда:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  ClassRef: TClass;
begin
  ListBox1.Clear;
  ClassRef := Sender.ClassType;
  while ClassRef <> nil do
  begin
    ListBox1.Items.Add(ClassRef.ClassName);
    ClassRef := ClassRef.ClassParent;
  end;
end;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ClassName
    #39518341
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так не подойдет?
Код: 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.
  TClass0 = class
    function MyClassName: string;
    procedure ShowName0;
  end;

  TClass1 = class (TClass0)
    function MyClassName: string;
    procedure ShowName1;
  end;

  TClass2 = class (TClass1)
    function MyClassName: string;
    procedure ShowName2;
  end;

implementation

function TClass0.MyClassName: string;
begin
  Result := 'TClass0';
end;

procedure TClass0.ShowName0;
begin
  ShowMessage(MyClassName);
end;

function TClass1.MyClassName: string;
begin
  Result := 'TClass1';
end;

procedure TClass1.ShowName1;
begin
  ShowMessage(MyClassName);
end;

function TClass2.MyClassName: string;
begin
  Result := 'TClass2';
end;

procedure TClass2.ShowName2;
begin
  ShowMessage(MyClassName);
end;
...
Рейтинг: 0 / 0
ClassName
    #39518346
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Так не подойдет?Или даже так, чтобы при забывчивости отгрести от компилятора
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  TClass0 = class
  strict private
    function MyClassName: string;
  public
    procedure ShowName0;
  end;

  TClass1 = class (TClass0)
  strict private
    function MyClassName: string;
  public
    procedure ShowName1;
  end;

  TClass2 = class (TClass1)
  strict private
    function MyClassName: string;
  public
    procedure ShowName2;
  end;
...
Рейтинг: 0 / 0
ClassName
    #39518351
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воистину неистощима фантазия человеков.
...
Рейтинг: 0 / 0
ClassName
    #39518355
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Так не подойдет?
Нет, не подойдет.
Моя функция локализации находится базовом классе, и соответственно TClass2.MyClassName видеть не будет, только свой
...
Рейтинг: 0 / 0
ClassName
    #39518358
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiВоистину неистощима фантазия человеков.Неистощимая фантазия - это подключить JclDebug и через адрес метода, при помощи map-файла получить имя класса.

Кстати, Шавлюк Евгений, вы попробуйте, вдруг понравится?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
uses JclDebug;

function GetLocationInfoStr: string;
var
  LAddr: Pointer;
  LInfo: TJclLocationInfo;
begin
  LAddr := Caller(2, True);
  if GetLocationInfo(LAddr, LInfo) then 
    Result := LInfo.ProcedureName
  else
    Result := 'Не узнали :((('
end;
...
Рейтинг: 0 / 0
ClassName
    #39518362
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийМоя функция локализации находится базовом классеВы же пишете
Шавлюк ЕвгенийМетод "Сохранить" - объявлен как virtual и в наследниках переопределяется.

Как Вы хотели видеть работу? В базовом классе попросить: "Эй-ты, дай мне имя третьего класса в иерархии?"

Из произвольного места в классе можно вызвать только три типа метода
1. Метод, объявленный в этом классе
2. Последнюю переопределенную версию метода в иерархии наследования
3. Последнюю переопределенную, до этого класса, версию метода в иерархии наследования
...
Рейтинг: 0 / 0
ClassName
    #39518369
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

авторНе узнали
...
Рейтинг: 0 / 0
ClassName
    #39518370
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгенийписать
Код: pascal
1.
ShowMessage(lc('Сообщение для пользователя', 'TФорма-C-DBGrid'))


и это был бы тот результат, что мне нужен, но в этом случае код очень сильно замусоривается.Т.е. пойти по самому простому и очевидному пути - это замусоривание, а лепить костыли и извращения - это нормально?
...
Рейтинг: 0 / 0
ClassName
    #39518371
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Как Вы хотели видеть работу?
Мне было бы достаточно узнать модуль, из которого сейчас вызвана функция.
...
Рейтинг: 0 / 0
ClassName
    #39518373
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
08.09.2017 17:29, _Vasilisk_ пишет:
> Из произвольного места в классе можно вызвать только три типа метода
> 1. Метод, объявленный в этом классе
> 2. Последнюю переопределенную версию метода в иерархии наследования
> 3. Последнюю переопределенную, до этого класса, версию метода в иерархии наследования

я же показал ему как достучаться до любого предка в иерархии через ClassParent.
но видимо он меня не понял.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ClassName
    #39518379
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийМне было бы достаточно узнать модуль
Код: pascal
1.
Result := LInfo.ProcedureName

Здесь есть все
Шавлюк Евгенийиз которого сейчас вызвана функция.Какая функция? В базовом классе? Т.е. Вам нужны координаты вызвавшего метода?
_Vasilisk_подключить JclDebug и через адрес метода, при помощи map-файла получить имя класса.Другого способа реализовать Вашу извращенную фантазию нет
...
Рейтинг: 0 / 0
ClassName
    #39518382
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Мне не нужно знать список родителей. Я их знаю.
Я хочу знать в каком из родителей вызван метод (как альтернатива в каком из модулей).
Это ведь совсем другое?
...
Рейтинг: 0 / 0
ClassName
    #39518383
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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


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