Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 079

/ вопрос открыт /

Добрый день, прошу помощи по созданию компонента.
Необходим компонент Shape, а над ним Label. И чтобы впоследствии эта конструкция при перемещении Shape по форме двигалась синхронно. Переделал код из LabelEdit (просто заменил Edit на Shape), с LabelEdit перетаскивания работают отлично.
В моем компоненте при установке компонента LabelShape на форме появляется и Shape и Label, но отдельно (т.е. Label в левом верхнем углу), и при перемещении Shape не двигается Label. В чем ошибка ?
Заранее спасибо.

Приложение:
  1. unit Lbshape;
  2.  
  3. interface
  4.  
  5. uses
  6. SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7. Forms, Dialogs, StdCtrls, ExtCtrls;
  8.  
  9. type
  10. TLabelShape = class(TShape)
  11. private
  12. FLabel: TLabel;
  13. procedure WMMove(var Msg: TWMMove); message WM_MOVE;
  14. protected
  15. procedure SetParent(Value: TWinControl); override;
  16. function GetLabelCaption: string; virtual;
  17. procedure SetLabelCaption(const Value: string); virtual;
  18. public
  19. constructor Create(AOwner: TComponent); override;
  20. destructor Destroy; override;
  21. published
  22. property LabelCaption: string read GetLabelCaption write
  23. SetLabelCaption;
  24.  
  25. end;
  26.  
  27. procedure Register;
  28.  
  29. implementation
  30.  
  31. constructor TLabelShape.Create(AOwner: TComponent);
  32.  
  33. begin
  34. inherited Create(AOwner);
  35.  
  36.  
  37. FLabel := TLabel.Create(nil);
  38. FLabel.Caption := 'Edit label';
  39. end;
  40.  
  41. procedure TLabelShape.SetParent(Value: TWinControl);
  42.  
  43. begin
  44.  
  45. if (Owner = nil) or not (csDestroying in Owner.ComponentState) then
  46. FLabel.Parent := Value;
  47. inherited SetParent(Value);
  48. end;
  49.  
  50. destructor TLabelShape.Destroy;
  51.  
  52. begin
  53. if (FLabel <> nil) and (FLabel.Parent = nil) then
  54. FLabel.Free;
  55. inherited Destroy;
  56. end;
  57.  
  58. function TLabelShape.GetLabelCaption: string;
  59.  
  60. begin
  61. Result := FLabel.Caption;
  62. end;
  63.  
  64. procedure TLabelShape.SetLabelCaption(const Value: string);
  65.  
  66. begin
  67. FLabel.Caption := Value;
  68. end;
  69.  
  70. procedure TLabelShape.WMMove(var Msg: TWMMove);
  71.  
  72. begin
  73. inherited;
  74.  
  75.  
  76. if FLabel <> nil then
  77. with FLabel do
  78. SetBounds(Msg.XPos, Msg.YPos - Height, Width, Height);
  79. end;
  80.  
  81. procedure Register;
  82. begin
  83. RegisterComponents('MyComponents', [TLabelShape]);
  84. end;
  85.  
  86. initialization
  87.  
  88.  
  89. RegisterClass(TLabel);
  90. end.
  91.  


Snitus Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Snitus (статус: Посетитель)
Вопрос отправлен: 10 марта 2011, 20:42
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ну, вроде набросал я тебе компонентик. Прицепляю к ответу вместе с программой тестирования.
Если чо не так - доработай напильником сам.
Ахтунг! Отлаживал в run-time, в палитру НЕ СТАВИЛ!
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 11 марта 2011, 09:55


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 12 марта 2011, 09:09; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 20:52 [#1]:

Не нужен тебе Label на TShape. Если нужна надпись на TShape, напиши его наследник, в котором перекрой (override) метод Paint и рисуй нужную надпись. Можно (нужно) добавить такие свойства, как Caption, Font, Alignment, Layout и т.д.
Сам справишься или помочь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Snitus

Snitus (статус: Посетитель), 10 марта 2011, 22:20 [#2]:

От помощи не откажусь. В написании компонент совсем слабоват.
min@y™

min@y™ (статус: Доктор наук), 11 марта 2011, 09:07 [#3]:

Цитата (Snitus):

От помощи не откажусь. В написании компонент совсем слабоват.

Ну чо, я пришёл на работу и сел писать компонент.
Самому интересно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Snitus

Snitus (статус: Посетитель), 11 марта 2011, 20:50 [#4]:

Спасибо ! Первое впечатление очень хорошее.
Последовав вашим вчерашним советам сам с утра на работе создал компонент, что то даже получилось. Ну а с помощью вашего кода создам то, что нужно.
min@y™

min@y™ (статус: Доктор наук), 12 марта 2011, 09:09 [#5]:

Цитата (Snitus):

Спасибо !

И это всё? Знал бы - даже не начинал бы писать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.02 сек.