![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование "не-com" интерфейсов
Як © (2006-07-10 14:50:00)Мне казалось, что раньше получалось.... может я что-то неправильно указал? Кто-то подобное делал? Или это недоброе влияние C#?
IXMLWinControl = interface
function GetXmlNodeName:string;
property XmlNodeName: string read GetXmlNodeName;
end;
TXMLEdit = class(TEdit,IXMLWinControl)
protected
function GetXmlNodeName:string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TXMLEdit }
function TXMLEdit.GetXmlNodeName: string;
begin
Result := 'xxxxx';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
XMLEdit : TXMLEdit;
begin
XMLEdit := TXMLEdit.Create(Self);
if XMLEdit is IXMLWinControl then
MessageDlg((XMLEdit as IXMLWinControl).XmlNodeName , mtWarning, [mbOK], 0);
XMLEdit.Free;
end;
Такое описание типов проглатывает без проблем. Однако функцию Button1Click() не компилит. Утверждает, что is и as использовать нельзя.
Як (2006-07-10 19:12:00) [1]ОК, спасибо, получилось
Джо (2006-07-10 16:00:00) [2]
if Controls[i].GetInterface(...) then
Як (2006-07-10 15:56:00) [3]Вопрос возобновляется, т.к. в каждом конкретном случае, я не знаю, поддерживает, ли данный WinControl интерфейс IXMLWinControl.
А написать
var
XMLEdit : TWinControl;
pXMLWinControl : IXMLWinControl;
begin
XMLEdit := TXMLEdit.Create(Self);
pXMLWinControl := XMLEdit;
MessageDlg(pXMLWinControl.XmlNodeName , mtWarning, [mbOK], 0);
XMLEdit.Free;
Не дают
Хотелось бы иметь что-то типа
var
i : integer;
begin
for i:=0 to ControlCount-1 do
if Controls[i] is IXMLWinControl then
MessageDlg((Controls[i] as IXMLWinControl).XmlNodeName , mtWarning, [mbOK], 0);
end;
Или это не возможно?
Як (2006-07-10 15:38:00) [4]Вопрос снимается....
Оказывается досточно написать.
var
XMLEdit : TXMLEdit;
pXMLWinControl : IXMLWinControl;
begin
XMLEdit := TXMLEdit.Create(Self);
pXMLWinControl := XMLEdit;
MessageDlg(pXMLWinControl.XmlNodeName , mtWarning, [mbOK], 0);
XMLEdit.Free;