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

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

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

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

Сообщение qivi » 06.06.2012 15:43:17

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


П.С.: Из идей только использование TForm... что ни будь луче посоветуете?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение alexs » 07.06.2012 08:20:21

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

Правильная идея...
Для образца глянь как CodeCompletion в самом Lazarus сделан. Ну или PopUp окно в RX
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение qivi » 07.06.2012 15:12:34

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

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

Сообщение qivi » 08.06.2012 17:55:08

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

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

Сообщение Nik » 08.06.2012 18:23:58

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


FormMouseLeave пробовали ловить?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Brainenjii » 08.06.2012 18:32:13

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

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

Сообщение qivi » 02.07.2012 09:34:46

А как создать событие, что бы потом при использовании компонента назначать этому событию процедуру? В частности нужно создать компоненту потомку TWinControl событие OnChange, сам контрол как я и говорил выше это специфический список, нужно активировать это свойство на каждое его изменение.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение iskander » 02.07.2012 18:22:34

Если список строк в вашем компоненте - наследник TStringList, то у него уже есть
public property OnChange. Просто оберните его в published property вашего контрола.
iskander
энтузиаст
 
Сообщения: 626
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение qivi » 03.07.2012 12:15:37

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

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

Сообщение iskander » 03.07.2012 15:58:35

Тогда что-нибудь вроде
Код: Выделить всё
  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;
iskander
энтузиаст
 
Сообщения: 626
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение qivi » 04.07.2012 11:17:32

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

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

Сообщение Light13 » 06.07.2012 08:10:05

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


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

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

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

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

Сообщение qivi » 06.07.2012 12:22:32

Есть некоторый тип данных (record), этим типом данных представлен массив списка, хочу создать свойство возвращающие элемент списка, соответственно создаю пропертя типа этой рекорд, создаю соответствующую функцию возвращающую значение данному свойству... компилятор говорит данные типа рекорд публиковать нельзя...
Можно ли хоть как то опубликовать данные типа record? Или как реализовать свойство возвращающее данные данного типа?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Brainenjii » 06.07.2012 12:23:50

А обязательно объявлять свойство в Published секции? Может быть будет достаточно Public?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение qivi » 21.09.2012 15:52:12

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

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

Пример компонента:
RUS_Controls.7z
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru