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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка Caption у потомка TCustomControl, Установка Caption у потомка TCustomContr 
V
    Опции темы
matveev
  Дата 30.1.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста со следующей проблемой.
Есть класс:
Код
TCodeButton = class(TCustomControl)
  private
    { Private declarations }
    FBar: TBar;
end;


Второй класс:
Код
  TBar = class(TPersistent)
   private
    FCaption          : TCaption;
   public
     constructor Create(AParent: TControl);
     property Caption: TCaption read FCaption write SetCaption;
  end;


1. Создаю экземпляр класса TCodeButton.
2. В constructor'е класса TCodeButton создаю экземпляр класса TBar,
FBar := TBar.Create(Self)

Задача:
Мне просто нужно (НЕОБХОДИМО!!!), чтобы при создании экземпляра класса TBar,
свойство Caption получало значение равное AParent.Name!!!

Делаю так:
В констракторе класса TBar, в который я передаю родительский контрол,
пытаюсь получить его имя:
AParent.Name --- ???

А оно пустое... что делать??!??
Как решить проблему?
PM MAIL   Вверх
Rennigth
Дата 30.1.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



я что-то наверное не так понял...
Чем тебя не устраивает Owner? он передается в конструкторе... или можешь в конструктор добавить параметр с Parent-ом, что-то вроде:
Код

  TBar = class(TPersistent)
   private
    FCaption          : TCaption;
   public
     constructor Create(AOwner: TControl; AParent: TWinControl); reintroduce:
     property Caption: TCaption read FCaption write SetCaption;
  end;


а вообще Name у родителя есть? ты его точно задаешь?




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Yanis
Дата 30.1.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



А разве у "Self" есть свойство Name?
Добавлено @ 10:58
ты передаешь в конструкторе TBar и принимаешь его за TCustomControl


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 30.1.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Yanis @ 30.1.2006, 10:57 Найти цитируемый пост)

А разве у "Self" есть свойство Name?

есть



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Yanis
Дата 30.1.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Rennigth
Self, который он передаёт в конструктор есть наследник от TPersistent!
Добавлено @ 11:03
разве нет?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
matveev
Дата 30.1.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

а вообще Name у родителя есть? ты его точно задаешь?

Да. Имя я задаю. Проблема видимо в том, что я пытаюсь получить имя когда оно еще не присвоено?!?!
Смотрю сейчас на реализацию TControl (controls.pas), смутно понимаю, что на установку имени там весится какое - то событие посредством TControlActionLink.

Никак не могу разобраться. КТо нибудь знает как это сделано у TControl?
PM MAIL   Вверх
Rennigth
Дата 30.1.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Yanis
а ну да...
Я непонимаю в принципе в чем проблема у matveev. Родитель TCustonControl, нужно передать имя родителя в конструкторе для поля Caption... что не выходит? smile
Добавлено @ 11:11
ну а ты и у TCodeButton сделай конструктор с передачей имени.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
matveev
Дата 30.1.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

TCodeButton = class(TCustomControl)
  private
    { Private declarations }
    FBar: TBar;
end;


Код

 TBar = class(TPersistent)
   private
    FCaption          : TCaption;
    FParent: TControl;
   public
     constructor Create(AParent: TControl);
     property Caption: TCaption read FCaption write SetCaption;
  end;


constructor TCodeButton.Create(...)
begin
FBar := TBar.Create(Self);
end;

constructor TBar.Create(AParent: TControl)
begin
FParent := AParent;
FCaption := FParent.Name;
// ВОТ ТУТ В РЕЗУЛЬТАТЕ FCaption - ПУСТОЙ!!!
// А В НЕМ ДОЛЖНО БЫТЬ AParent.Name
// ПОЧЕМУ ТАК??
end;

Цитата

ну а ты и у TCodeButton сделай конструктор с передачей имени.


Так я знаю, что так можно сделать, но к сожалению это не удовлетворяет условиям моей задачи.
Нужно получать имя AParent.Name именно из TBar.

Это сообщение отредактировал(а) matveev - 30.1.2006, 11:15
PM MAIL   Вверх
Yanis
Дата 30.1.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Ты понимаешь, что
Цитата(matveev @ 30.1.2006, 11:12 Найти цитируемый пост)

constructor TCodeButton.Create(...)
begin
FBar := TBar.Create(Self);
end;

этим кодом ты передаешь TBar?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 30.1.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(matveev @ 30.1.2006, 11:12 Найти цитируемый пост)

Нужно получать имя AParent.Name именно из TBar.

а как ты можешь получить Name в конструкторе если ты его к этому времени еще не задал?
ты можешь перегрузить каккой-нибудь SetName у TCodeButton и в нем присваивать Caption TBar-а.
Добавлено @ 11:28
Цитата(matveev @ 30.1.2006, 11:12 Найти цитируемый пост)

Так я знаю, что так можно сделать, но к сожалению это не удовлетворяет условиям моей задачи.
Почему? если не секрет...



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
matveev
Дата 30.1.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

ты можешь перегрузить каккой-нибудь SetName у TCodeButton и в нем присваивать Caption TBar-а.

Фишку с overrid'om SetName'а я тоже знаю, но она опять - же мне не подходит.
Цитата

а как ты можешь получить Name в конструкторе если ты его к этому времени еще не задал?

Так И я про то - же!
Получить его можно, это реализовано в описании класса TControl (Control.pas), там как я понял
вешается событие на изменение Name, затем оно ловится, с помощью TControlActionLink.
Но примеров по TControlActionLink, я не могу найти, поэтому и разобраться никак не могу.

Посмотрите ведь это - же как то там делается?
PM MAIL   Вверх
Rennigth
Дата 30.1.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(matveev @ 30.1.2006, 11:28 Найти цитируемый пост)

Посмотрите ведь это - же как то там делается?

Посмотрел, помоему никак не делается...
Constructor TControl:
Код

  inherited Create(AOwner);
  FWindowProc := WndProc;
  FControlStyle := [csCaptureMouse, csClickEvents, csSetCaption, csDoubleClicks];
  FFont := TFont.Create;
  FFont.OnChange := FontChanged;
  FAnchors := [akLeft, akTop];
  FConstraints := TSizeConstraints.Create(Self);
  FConstraints.OnChange := DoConstraintsChange;
  FColor := clWindow;
  FVisible := True;
  FEnabled := True;
  FParentFont := True;
  FParentColor := True;
  FParentShowHint := True;
  FParentBiDiMode := True;
  FIsControl := False;
  FDragCursor := crDrag;
  FFloatingDockSiteClass := TCustomDockForm;
  FHelpType := htContext;


Constructor TWINControl:
Код

  inherited Create(AOwner);
  FObjectInstance := Classes.MakeObjectInstance(MainWndProc);
  FBrush := TBrush.Create;
  FBrush.Color := FColor;
  FParentCtl3D := True;
  FTabOrder := -1;
  FImeMode := imDontCare;
  if SysLocale.PriLangID = LANG_JAPANESE then
    FImeName := ''
  else
    FImeName := Screen.DefaultIme;
  FUseDockManager := False;
  FBevelEdges := [beLeft, beTop, beRight, beBottom];
  FBevelInner := bvRaised;
  FBevelOuter := bvLowered;
  FBevelWidth := 1;
  FHelpType := htContext;


Constructor TCustomControl
Код

  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;


ниодного упоминания об ActionLink.
Добавлено @ 11:59
а чем тебе не подходит у TBar сделать GetCaption
Код

 TBar = class(TPersistent)
   private
    FParent: TControl;
   function GetCaption: TCaption;
   public
     constructor Create(AParent: TControl);
     property Caption: TCaption read GetCaption;
  end;

function TBar.GetCaption: TCaption;
begin
  Result := '';
  if  Assigned(FParent) then
    Result := FParent,Name;
end;




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
matveev
Дата 30.1.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Controls.pas

Код

function TControl.IsCaptionStored: Boolean;
begin
  Result := (ActionLink = nil) or not ActionLink.IsCaptionLinked;
end;


PM MAIL   Вверх
Rennigth
Дата 30.1.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



matveev
Это немного не то. IsCaptionStored вообще только для формы в Design-time.
Лутше скажи зачем тебе это нужно? Извени, но помоему ты занимаешься извращениеим...


--------------------
(* Honesta mors turpi vita potior *)
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.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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