Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить принадлежность классу, сложная ситуация 
:(
    Опции темы
volvo877
Дата 10.1.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата(Delphist @  10.1.2011,  14:50 Найти цитируемый пост)
вместо ожидаемого сообщения, будет тишина, хотя когда создавался RawClass в constructor'e TSecondClass, то RawClass.Owner := Self = SecondClass'y
Ты будешь смеяться, но тишины как раз нету (D2009, если что). Если вызывать 
Код
SecondClass.RawClass.Method; 
// или
ThirdClass.RawClass.Method;

, то сообщение есть. Если 
Код
CustomClass.RawClass.Method;

 - то нету. Так что показывай тестовый пример, иллюстрирующий проблему. Как, что и чем ты инициализируешь...
PM MAIL   Вверх
БелАмор
Дата 10.1.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



Попытался из приведённого вами кода сделать рабочий пример.
Всё нормально работает. Привожу полный код. D2006.
Если у вас не заработет - проблема со средой (обновления и т.д.).
Если заработает - ищите отличия со своим кодом.
Если не получится - сделайте минимальный рабочий пример, котрый можно откомпилировать и выложите сюда.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TCustomClass = class;

  TRawClass = class(TObject)
   public
     Owner: TCustomClass;
     constructor Create(AOwner: TCustomClass);
     procedure Method;
  end;

  TCustomClass = class(TObject)
  public
     RawClass: TRawClass;
     constructor Create;
     destructor Destroy; override;
  end;

type
   TFirstClass = class(TCustomClass)
   end;

   TSecondClass = class(TCustomClass)
   end;

   TThirdClass = class(TSecondClass)
   end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TCustomClass }

constructor TCustomClass.Create;
begin
  inherited;
  RawClass  := TRawClass.Create(Self);
end;

destructor TCustomClass.Destroy;
begin
  RawClass.Free;
  inherited;
end;

{ TRawClass }

constructor TRawClass.Create(AOwner: TCustomClass);
begin
  inherited Create;
  Owner := AOwner;
end;

procedure TRawClass.Method;
begin
  //ShowMessage(Owner.ClassName);

  if Owner is TSecondClass  then
    ShowMessage('Это - TSecondClass');

  if Owner is TThirdClass  then
    ShowMessage('Это - TThirdClass');
end;

{ Test }

procedure TForm1.Button1Click(Sender: TObject);
var
  c2: TSecondClass;
begin
  c2 := TSecondClass.Create;
  c2.RawClass.Method;
  c2.Free;
end;

end.


Результат - одно сообщение:

Код

Это - TSecondClass

PM   Вверх
Delphist
Дата 10.1.2011, 21:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(БелАмор @  10.1.2011,  21:13 Найти цитируемый пост)
Если не получится - сделайте минимальный рабочий пример, котрый можно откомпилировать и выложите сюда.

б..я заработало  smile , всем спасибо, а БелАмору отдельное спасибо!

З.Ы. Я так и не понял в чем фигня была, просто тупо перенабрал свой код и все ок, разницы при это не нашел  smile 


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Keeper89
Дата 10.1.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(Delphist @  10.1.2011,  21:01 Найти цитируемый пост)
Я так и не понял в чем фигня была

а это не есть гуд smile


--------------------
PM MAIL WWW   Вверх
БелАмор
Дата 10.1.2011, 21:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



Цитата(Delphist @  10.1.2011,  21:01 Найти цитируемый пост)
Я так и не понял в чем фигня была, просто тупо перенабрал свой код и все ок, разницы при это не нашел  

Вообще, в случае наступления совершенно необъяснимого полтергейста, имеет смысл для начала удалить из каталога проекта все dcu.
Кроме того, нужно тщательно следить, чтобы в каталоге не оставалось устаревших версий файлов pas и удалять их сразу, как только они образуются. Имеет смысл периодически проходить по каталогу и проверять его на наличие таких файлов. Случайно сохранившийся где-нибудь uses на старый файл - страшное дело...
Одной из возможных причин вашей ситуации могло быть сравнительно недавно выполненное сохранение какого-либо файла через Save As
В совсем запущенных случаях рекомендуется удалить всё, кроме pas и dfm (плюс, возможно, чего-то ещё) и создать проект заново, включив в него прежние файлы. Это бывает очень кстати при проблемах в случае открытия проекта в другой версии (особенно - более старой).
PM   Вверх
Delphist
Дата 10.1.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Keeper89 @  10.1.2011,  22:43 Найти цитируемый пост)
а это не есть гуд 

угу smile 


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
БелАмор
Дата 10.1.2011, 22:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



О чём ещё необходимо помнить:
Если в разных местах объявлены разные классы с одинаковыми именами, то это всё равно разные классы.
Если в каком-то месте доступны оба этих класса, то принимается во внимание тот, который упоминается последним. Та ещё засада. Можно создать объект одного типа в одном месте, а потом в другом пытаться проверить его через is на принадлежность к одноимённому, но другому классу, получать закономерный False и недоумевать... В таких случаях полезно вспомнить о полной спецификации: SomeModule.SomeName
PM   Вверх
Delphist
Дата 11.1.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(БелАмор @  10.1.2011,  23:08 Найти цитируемый пост)
 то принимается во внимание тот, который упоминается последним.

угу, спасибо, знаем такую фишку smile 


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
CodeMonkey
Дата 11.1.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



DLL?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Delphist
Дата 29.3.2011, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(CodeMonkey @  11.1.2011,  16:39 Найти цитируемый пост)
DLL? 

Нет, вопрос касался для EXE


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.