Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=6666078&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 08:28:18 2016
Кодировка: Windows-1251
[Delphi] ActiveX + TListView - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
drunken
Pooh-Bah

Рег.: 17.11.2003
Сообщений: 2006
Рейтинг: 1150
  [Delphi] ActiveX + TListView
      27.09.2007 18:59
1

Приветствую
Я пишу свою компоненту ActiveX (TPanel), на нее кладу PageControl и в одну из закладок кладу ListView. Так вот, при нажатии любой клавишей мыши на этом списке появляется сообщение "Control <ListView.Name> has no parent window". В чем проблема и как ее обойти?
Обработчиков нажатия клавиш нет.
Кусок кода
...
  FListView := TListView.Create(FTabSheet);
  TWinControl(FListView).Name := 'NListView1';
  TWinControl(FListView).Parent := FTabSheet;
  with FListView do begin
// ... описание ...
  end;
...
Спасибо за внимание

VVp
sir

Рег.: 22.05.2003
Сообщений: 1209
Рейтинг: 170
  Re: [Delphi] ActiveX + TListView [re: drunken]
      28.09.2007 08:45
 

Надо созавать TListView , указывая в качестве owner не TabSheet а форму:
FListView := TListView.Create(MyForm);



Абонент временно забанен, или находится вне зоны действия сети...
drunken
Pooh-Bah

Рег.: 17.11.2003
Сообщений: 2006
Рейтинг: 1150
  Re: [Delphi] ActiveX + TListView [re: VVp]
      28.09.2007 11:58
 

Не совсем понял, я ведь пишу ActiveX, а формы (TForm) в ActiveX что-то я найти не могу.
Насколько я понимаю, мне надо будет писать еще одну ActiveX на основе TStringGrid и использовать ее. Но это я всегда успею сделать. Хотелось бы без лишних заморочек, потому как уже есть TListView. Помогите, пожалуйста.

VVp
sir

Рег.: 22.05.2003
Сообщений: 1209
Рейтинг: 170
  Re: [Delphi] ActiveX + TListView [re: drunken]
      28.09.2007 13:43
 

Хм.. да, сорри, не заметил.
А пробовал временно закоментить создание TListView и все что с ним связано?
TabSheet создается подобным образом? С ним есть проблемы?



Абонент временно забанен, или находится вне зоны действия сети...
_Seti
Добрые руки

Рег.: 18.10.2003
Сообщений: 3164
Рейтинг: 2131
  Re: [Delphi] ActiveX + TListView [re: drunken]
      28.09.2007 14:43
 

В ответ на:

Control <ListView.Name> has no parent window



Можешь выложить минимальный код, в котором появляется ошибка? (файлы проектов, чтобы можно было посмотреть из дельфи)

drunken
Pooh-Bah

Рег.: 17.11.2003
Сообщений: 2006
Рейтинг: 1150
  Re: [Delphi] ActiveX + TListView [re: VVp]
      28.09.2007 16:54
 

Quote:

TabSheet создается подобным образом? С ним есть проблемы?



Все нормально создается, никаких проблем. Даже есть обработчик при прорисовке элементов списка (изменение шрифта, цвета и тп), но при клике на списке вылезает ошибка

drunken
Pooh-Bah

Рег.: 17.11.2003
Сообщений: 2006
Рейтинг: 1150
  Re: [Delphi] ActiveX + TListView [re: _Seti]
      28.09.2007 17:06
 

Quote:

Можешь выложить минимальный код, в котором появляется ошибка? (файлы проектов, чтобы можно было посмотреть из дельфи)



Если создавал ActiveX, то вот процедура инициализации компонента
procedure TNPanelX.InitializeControl;
var
  FPageControl: TPageControl;
  FTabSheet: TTabSheet;
  FWebBrowser: TWebBrowser;
  FListView: TListView;
  FPanel: TPanel;
  FBitBtn: TBitBtn;
begin
  FDelphiControl := Control as TPanel;
  with FDelphiControl do begin
    OnCanResize := CanResizeEvent;
    OnClick := ClickEvent;
    OnConstrainedResize := ConstrainedResizeEvent;
    OnDblClick := DblClickEvent;
    OnResize := ResizeEvent;
    BevelOuter := TBevelCut(bvNone);
  end;
// page control
  FPageControl := TPageControl.Create(FDelphiControl);
  TWinControl(FPageControl).Name := 'NPageControl';
  TWinControl(FPageControl).Parent := FDelphiControl;
  FPageControl.Align := alClient;
// first page
  FTabSheet := TTabSheet.Create(FPAgeControl);
  TWinControl(FTabSheet).Name := 'NTabSheet2';
  TWinControl(FTabSheet).Parent := FPageControl;
  FTabSheet.PageControl := FPageControl;
  FTabSheet.Caption := 'Закладка 1';

  FPanel := TPanel.Create(FTabSheet);
  TWinControl(FPanel).Name := 'NPanel1';
  TWinControl(FPanel).Parent := FTabSheet;
  with FPanel do begin
    Align := alTop;
    Caption := '';
    Height := 72;
  end;

  FBitBtn := TBitBtn.Create(FPanel);
  TWinControl(FBitBtn).Name := 'NButton';
  TWinControl(FBitBtn).Parent := FPanel;
  with FBitBtn do begin
    Top := FDatePicker.Top + FDatePicker.Height + 8;
    Left := FDatePicker.Left;
    Caption := 'Вывести';
    Anchors := [akRight, akTop];
    OnClick := NButtonClick;
  end;
  FPanel.InsertControl(FBitBtn);

  FListView := TListView.Create(FTabSheet);
  TWinControl(FListView).Name := 'NListView1';
  TWinControl(FListView).Parent := FTabSheet;
  with FListView do begin
    Parent := FTabSheet;
    ViewStyle := vsReport;
    ReadOnly := true;
    RowSelect := true;
    GridLines := true;
    HideSelection := false;
    Align := alClient;
  end;
// second page
  FTabSheet := TTabSheet.Create(FPAgeControl);
  TWinControl(FTabSheet).Name := 'NTabSheet1';
  TWinControl(FTabSheet).Parent := FPageControl;
  FTabSheet.PageControl := FPageControl;
  FTabSheet.Caption := 'Закладка 2';
  FPageControl.InsertControl(FTabSheet);

  FWebBrowser := TWebBrowser.Create(FTabSheet);
  TWinControl(FWebBrowser).Name := 'NWebBrowser';
  TWinControl(FWebBrowser).Parent := FTabSheet;
  FWebBrowser.Align := alClient;
  FTabSheet.InsertControl(FWebBrowser);

  FDelphiControl.InsertControl(FPageControl);
end;

А если не создавал, то надо будет создать проект ActiveXControl, за основу взять TPanel. Впихнуть этот код в процедуру инициализации. Скомпилировать. Полученный файл <project_name>.ocx зарегистрировать с помощью команды regsvr32 и потом использовать этот ActiveX в любом проекте.



Редактировал drunken (28.09.2007 17:48)
_Seti
Добрые руки

Рег.: 18.10.2003
Сообщений: 3164
Рейтинг: 2131
  Re: [Delphi] ActiveX + TListView [re: drunken]
      28.09.2007 19:26
 

Из хелпа про свойство ParentWindow:
В ответ на:


Description
ParentWindow refers to the window handle that underlies the parent control. To designate a non-VCL control as a parent, assign that control's handle to ParentWindow. This assignment causes the control to be moved into the parent's screen area. Setting ParentWindow has no effect if Parent is not nil (Delphi) or NULL (C++).

TActiveXControl objects use ParentWindow to insert a control in an ActiveX container window.
ParentWindow is set automatically when a control is constructed with a call to CreateParented (Delphi) or the appropriate overloaded constructor (C++).
Use ParentWindow with windowed controls that are packaged in a DLL. This allows references to the control by applications based on other applications.





У тебя в исходниках:
code:
TWinControl(FListView).Parent := FTabSheet;


При клике на TListView код компоненты пытается передать ему фокус. Не знаю почему, но Delphi в этом коде проверяет, является ли самый верхний Parent VCL-контейнером, если нет - генерит исключение.

controls.pas:
code:
procedure TWinControl.SetFocus; var Parent: TCustomForm; begin Parent := GetParentForm(Self); if Parent <> nil then Parent.FocusControl(Self) else if ParentWindow <> 0 then Windows.SetFocus(Handle) else ValidParentForm(Self); end; function GetParentForm(Control: TControl): TCustomForm; begin while Control.Parent <> nil do Control := Control.Parent; if Control is TCustomForm then Result := TCustomForm(Control) else Result := nil; end; function ValidParentForm(Control: TControl): TCustomForm; begin Result := GetParentForm(Control); if Result = nil then raise EInvalidOperation.CreateFmt(SParentRequired, [Control.Name]); //Тут непонятно с какой целью генерится исключение :((((((((((( end;


Исходня из этого, можно решить проблему двумя способами:

1. Перекрыть метод SetFocus класса TListView (а он к счастью виртуальный). Недостатки - этот метод идет вразрез с рекомендациями хелпа, и нет гарантии, что исключение не появится где-нибудь еще.

2. При создании FListView указать
code:
FListView.Parent := nil; FListView.ParentWindow := FTabSheet.Handle;

Недостатки - в этом методе игнорируются свойства Top, Left, Align и т.д. Приходится для определения местоположения использовать дополнительные невидимые контейнеры.

drunken
Pooh-Bah

Рег.: 17.11.2003
Сообщений: 2006
Рейтинг: 1150
  Re: [Delphi] ActiveX + TListView [re: _Seti]
      01.10.2007 12:11
 

Громадное спасибо. С меня пивко. Если вдруг где-нить как-нить пересечемся =)

Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

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

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в