Самодельный компонент

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Самодельный компонент

Сообщение qivi »

Делаю компонент наподобе комбобокса. Как реализовать список в развёрнутом состоянии так что он отображался не только на родители а перекрывал всё что есть на экране?
Примерно так:
111.jpg


П.С.: Из идей только использование TForm... что ни будь луче посоветуете?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Re: Самодельный компонент

Сообщение alexs »

qivi писал(а):П.С.: Из идей только использование TForm...

Правильная идея...
Для образца глянь как CodeCompletion в самом Lazarus сделан. Ну или PopUp окно в RX
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

А не подскажете как можно уловить событие щелчка мыши за пределами формы или потерю фокуса формой? (чтоб закрыть список в случае если щёлкают не по нему)
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

Кто ни будь может подсказать
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Re: Самодельный компонент

Сообщение Nik »

qivi писал(а):А не подскажете как можно уловить событие щелчка мыши за пределами формы или потерю фокуса формой? (чтоб закрыть список в случае если щёлкают не по нему)


FormMouseLeave пробовали ловить?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Самодельный компонент

Сообщение Brainenjii »

OnDeactivate + Application.OnDeactivate разве не оно? 0.о
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

А как создать событие, что бы потом при использовании компонента назначать этому событию процедуру? В частности нужно создать компоненту потомку TWinControl событие OnChange, сам контрол как я и говорил выше это специфический список, нужно активировать это свойство на каждое его изменение.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Re: Самодельный компонент

Сообщение iskander »

Если список строк в вашем компоненте - наследник TStringList, то у него уже есть
public property OnChange. Просто оберните его в published property вашего контрола.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

А если мой список это динамический массив, можно всё самому сделать? Как это делается?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Re: Самодельный компонент

Сообщение iskander »

Тогда что-нибудь вроде

Код: Выделить всё

  TMyControl = class(TWinControl)
  private
    ...
    FOnChange: TNotifyEvent;
    ...
    function GetOnChange: TNotifyEvent;
    procedure SetOnChange(AValue: TNotifyEvent);
    procedure ListChanged;
  public
    ...
    procedure AddItem(const AValue: string);//Delete, Insert ,Edit и т.д.
    ...
  published
    ...
    property OnChange: TNotifyEvent read GetOnChange write SetOnChange;
  end;

implementation
    ....
function TMyControl.GetOnChange: TNotifyEvent;
begin
  Result := FOnChange;
end;

procedure TMyControl.SetOnChange(AValue: TNotifyEvent);
begin
  FOnChange := AValue;
end;

procedure TMyControl.ListChanged;
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TMyControl.AddItem(const AValue: string);
begin
  ...
  ListChanged;
end;
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

iskander спасибо огромное!
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Re: Самодельный компонент

Сообщение Light13 »

qivi писал(а):А не подскажете как можно уловить событие щелчка мыши за пределами формы или потерю фокуса формой? (чтоб закрыть список в случае если щёлкают не по нему)


По идее достаточно перекрыть
procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
для вашего компонента

Код: Выделить всё

Procedure TCustomControl.WMKillFocus(Var Message: TLMKillFocus);
Begin
  inherited WMKillFocus(Message);
  <закрываем список>
  Repaint;
End;

Допускаю, что перерисовка может не понадобиться.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

Есть некоторый тип данных (record), этим типом данных представлен массив списка, хочу создать свойство возвращающие элемент списка, соответственно создаю пропертя типа этой рекорд, создаю соответствующую функцию возвращающую значение данному свойству... компилятор говорит данные типа рекорд публиковать нельзя...
Можно ли хоть как то опубликовать данные типа record? Или как реализовать свойство возвращающее данные данного типа?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Самодельный компонент

Сообщение Brainenjii »

А обязательно объявлять свойство в Published секции? Может быть будет достаточно Public?
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: Самодельный компонент

Сообщение qivi »

Наследую самодельные компоненты от: TCustomControl, TCustomPanel, TGraphicControl, во всех трёх случаях один и тот же баг: у результирующих компонентов в редакторе привязок выставляю привязки и отступы, в дизайнере всё работает, в откомпилированной программе привязки работаю отступы игнорируются (обнуляются).

Без отступов ни как, подскажите пожалуйста что я не учитываю или делаю не так?

Пример компонента:
RUS_Controls.7z
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить