2013-09-24 1 views
0

В этом коде:«Контроль не имеет родителя» Создать ComboBox

unit MSEC; 

interface 

uses 
    Winapi.Windows, Vcl.Dialogs, Vcl.ExtCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls; 

type 
    TMSEC = class(TWinControl) 
    private 
    FOpr     :TComboBox; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

implementation 

const 
    DEF_OPERATIONS :array[0..3] of Char = ('+', '-', '*', '/'); 

constructor TMSEC.Create(AOwner: TComponent); 
var i   :Integer; 
begin 
    inherited; 
    FOpr:= TComboBox.Create(Self); 
    with FOpr do begin 
    Parent:= Self; 
    Align:= alLeft; 
    Width:= DEF_OPERATIONS_WIDTH; 
    Style:= csDropDownList; 
    //error in next lines : 
    Items.Clear; 
    for i := Low(DEF_OPERATIONS) to High(DEF_OPERATIONS) do Items.Add(DEF_OPERATIONS[i]); 
    ItemIndex:= 0; 
    end; 
end; 

end. 

При изменении элементов ComboBox, программа порывает с сообщением:
«контроль» не имеет родителя.
Как я могу исправить эту ошибку или инициализировать элементы ComboBox по-другому?

ответ

9

TComboBox Требуется выделенный HWND для хранения строк в свой Items. Для того, чтобы получить TComboBox, чтобы получить HWND, его Parent необходимо сначала HWND, а его Parent нужен HWND и т. Д. Проблема заключается в том, что ваш объект TMSEC не имеет назначенного значения Parent, когда его конструктор работает, поэтому для TComboBox невозможно получить HWND, судить об ошибке.

Попробуйте вместо этого:

type 
    TMSEC = class(TWinControl) 
    private 
    FOpr: TComboBox; 
    protected 
    procedure CreateWnd; override; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

constructor TMSEC.Create(AOwner: TComponent); 
begin 
    inherited; 
    FOpr := TComboBox.Create(Self); 
    with FOpr do begin 
    Parent := Self; 
    Align := alLeft; 
    Width := DEF_OPERATIONS_WIDTH; 
    Style := csDropDownList; 
    Tag := 1; 
    end; 
end; 

procedure TMSEC.CreateWnd; 
var 
    i :Integer; 
begin 
    inherited; 
    if FOpr.Tag = 1 then 
    begin 
    FOpr.Tag := 0; 
    for i := Low(DEF_OPERATIONS) to High(DEF_OPERATIONS) do 
     FOpr.Items.Add(DEF_OPERATIONS[i]); 
    FOpr.ItemIndex := 0; 
    end; 
end; 
+0

Это упругая к окну отдыха? Это то, что касается использования Tag? –

+0

@DavidHeffernan, для инициализации элементов только один time.but, когда я тестировал его без использования тега, его работа правильно! – MohsenB

+1

Нет, если окно воссоздано. Реми должен был объяснить. –

Смежные вопросы