COM高手看过来:怎样用IEnumVARIANT实现类似for each prop in XXX ... next?举一个Delphi的例子(200分)

  • 主题发起人 主题发起人 avant
  • 开始时间 开始时间
在http://msdn.microsoft.com/library/psdk/msagent/microsoftagentver2_83e6.htm上有如下
论述(关于MSAgent的,不过对于所有<font Color="red">ActiveX对象collection类型属性的访问</font>都应如此):

AnimationNames Collection(这是MsAgent的一个属性,是角色可执行动作的集合--Collection?)
The AnimationNames collection is a special collection that contains the list of animation names
compiled for a character. You can use the collection to enumerate the names of the animations
for a character. For example, in Visual Basic or VBScript (2.0 or later) you can access these names
using the For Each…Next statements:
<font color="blue"> For Each Animation in Genie.AnimationNames
Genie.Play Animation
Next</font>
VB中用这么一个简单的循环就把集合里所有的的项都访问了一遍.Delphi里能有类似的方法来操作吗?
 
200大洋,连个灌水的都招不来:(,我已经实现了都:)
那就新提一个问题吧:Office小助手里的Balloon(气球?Delphi里叫Hint),里面不仅可以显示文字,
还能显示<font color="red">按钮选项</font>,谁给讲一讲怎么显示"按钮选项",200分立即奉上!
别又等到我自己实现喽!
 
没有知道的老大吗?
 
到www.ksdev.com下一个founder library 再来信要个crack.
no source
 
我也正在寻找关于MSAgent的中AnimationNames属性怎么取出来的算法,
既然大侠已经实现了,能否贴出来让俺学习学习?
 
gxx:
我可是出乐200分的 ^.*
要不你教我几招?比如怎么在Agent的Balloon气球里显示超级链接,图形,按钮?像Office
小助手那样的?不仅200分相增,再把取AnimationNames属性的方法悉数告知。习习...
 
avant:
我要是知道就不问您了,分数吗,我愿出200,急盼能得到您的帮助,
谢谢!如不愿贴出,请mail me:gxx@0335.net.
 
如不贴出,有违"互帮互助,共同致富"的宗旨乐.临时测试,别说写的难看哟:)
unit untAgent;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl, OleCtrls, AgentObjects_TLB, Buttons, ComCtrls, ExtCtrls;

type
TfrmMain = class(TForm)
FileListBox: TFileListBox;
Agent: TAgent;
ListBox: TListBox;
procedure FileListBoxDblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ListBoxClick(Sender: TObject);
private
{ Private declarations }
Character:IagentCtlCharacterEx;
public
{ Public declarations }
end;

const
{$EXTERNALSYM IID_IEnumVariant}
IID_IEnumVariant: TGUID = (
D1:$00020404;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

var
frmMain: TfrmMain;

implementation

uses ActiveX;

{$R *.DFM}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
FileListBox.Directory:='C:/Windows/msagent/chars/';
end;

procedure TfrmMain.FileListBoxDblClick(Sender: TObject);
var
AnimationNames:IAgentCtlAnimationNames;
i,j:integer;
AnimName:OleVariant;
dwRetrieved:DWORD;
AEnum:IEnumVariant;
begin
if Character<>nil then
begin
Character := nil;
Agent.Characters.Unload('CharacterID');
end;
Agent.Characters.Load('CharacterID',FileListBox.Directory+'/'+FileListBox.Items[FileListBox.ItemIndex]);
Character:=Agent.Characters.Character('CharacterID');
Character.Show(0);
frmMain.Caption:=Character.Name;
AnimationNames:=Character.AnimationNames;
AnimationNames.Enum.QueryInterface(IID_IEnumVariant,AEnum);
ListBox.Clear;
while AEnum.Next(1,AnimName,dwRetrieved)=0 do
ListBox.Items.Add(AnimName);
end;

procedure TfrmMain.ListBoxClick(Sender: TObject);
begin
if Character<>nil then
Character.Play(ListBox.Items[ListBox.ItemIndex])

end;

end.
 
gxx:你的200分呢???
xk:
我到www.ksdev.com当了founder library,no source,挺不错,可惜没有源代码!可能实现
起来挺复杂?为了这个小气球,嘿嘿,我用了一个最最恶劣的方法,说起来觉得丢人,在后面开了
一个Word.Application,检查接口:WordApp.Assistant.Balloon,反正是自己玩吗,一时兴起:)
现在都觉得没劲了.在等一下gxx,就把分给你吧.


 
今天看到您的文章,非常高兴,不是解决了一个问题,而是解决了一类问题,谢谢!
 
加分功能在哪儿,我怎么找不到!
是不是只有自己提的问题才有权加分?
请版主给avant加上200分,从我的分数中扣除!!!
 
gxx:习习,加分嘛,你开一个题目,出200分,然后把该题的地址(DispQ.asp?LID=<font color=red>XXXXXX</font>)贴在这儿,我进去一露面,你把分拨给我不就是了:)
 
请继续或结束
 
接受答案了.
 
后退
顶部