问题全文如下(COPY自DFW的贴子):
============================================================
问题共有三个方面的:
。关于Video Capture,基于DirectX 9.0;
。关于TWebBrowser,基于IHTMLDocument2、IHTMLDocument3接口;
。关于多层应用的构架思想和实现,主要基于COM+。
问题的详细说明在明天给出,欢迎大家参与讨论。
来自:Boat, 时间:2004-8-29 17:45:57, ID:2784684
期待中……
来自:arcore, 时间:2004-8-30 17:33:24, ID:2785764 | 编辑
===============================================================
问题一、关于Video Capture,基于DirectX 9.0 分数:300
===============================================================
说明:
这是一个视频采集的程序,基于DX 9,现在用DSPack2.3组件包实现(采用DSPack组件包只是为了方便,视频采集模块的功能也可以用DX SDK中的接口来实现,方法类似)。现在,小弟的程序中,可以动态的设置视频源的制式、分辨率、色深,选择视频编码器,一边Preview,一边Capture,把视频保存到一个本地AVI文件中。现在的问题是,如果视频源是Pal制式的,工作正常。但是前几天,小弟遇到一个客户在用软件的时候,视频源是N制的,在进行AVI Capture的时候,出错了。出错的提示小弟记不请了,大概是Pin与Pin连接的时候出错的。 部分源代码如下:
---------------------------------------------------------
{设置制式...}
function TLDShowCapF.SetCaptureAnalog(BaseFilter : IBaseFilter; AnalogValue : integer) : HResult;
var
AMAnalogVideoDecoder : IAMAnalogVideoDecoder;
begin
Result := S_FALSE;
if BaseFilter = nil then Exit;
Result := BaseFilter.QueryInterface(IID_IAMAnalogVideoDecoder, AMAnalogVideoDecoder);
if Succeeded(Result) then
Result := AMAnalogVideoDecoder.put_TVFormat(AnalogValue); AMAnalogVideoDecoder := nil;
end;procedure TLDShowCapF.DoCapture(const CaptureVideo: boolean);
var
AMStreamConfig : IAMStreamConfig;
AMStreamConfigC : IAMStreamConfig;
Multiplexer : IBaseFilter;
Writer : IFileSinkFilter;
strOutFileName : WideString;
begin
//ShowMessage('VideoWidth:' + IntToStr(FVideoWidth) + ', VideoHeight:' + IntToStr(FVideoHeight));
VideoWindow.Width := FVideoWidth;
VideoWindow.Height := FVideoHeight;
VideoWindow.Left := (Screen.Width - VideoWindow.Width) div 2;
VideoWindow.Top := ToolBar1.Height + (Screen.Height - ToolBar1.Height - VideoWindow.Height - ScrollBox1.Height) div 2; try
FilterGraph.ClearGraph;
FilterGraph.Active := False;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(0);
if CaptureVideo then
begin
Encoder.FilterGraph := FilterGraph;
Encoder.BaseFilter.Moniker := EncoderEnum.GetMoniker(FVideoEncoder);
end
else
begin
Encoder.FilterGraph := nil;
Encoder.BaseFilter.Moniker := nil;
end;
FilterGraph.Active := True; with FilterGraph as ICaptureGraphBuilder2 do
begin
//设置制式...
SetCaptureAnalog(Filter as IBaseFilter, FAnalogVideo); //设置PREVIEW色深、分辩率...
FindInterface(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, AMStreamConfig);
SetCustomMediaBitCount(AMStreamConfig, FColorBit);
SetCaptureScale1(AMStreamConfig, FVideoWidth, FVideoHeight);
//设置CAPTURE色深、分辩率
if CaptureVideo then
begin
FindInterface(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, AMStreamConfigC);
SetCustomMediaBitCount(AMStreamConfigC, FColorBit);
SetCaptureScale1(AMStreamConfigC, FVideoWidth, FVideoHeight); //视频输出文件...
strOutFileName := CaptureFileName;
SetOutPutFileName(MEDIASUBTYPE_Avi, PWideChar(strOutFileName), Multiplexer, Writer);
//链接视频Capture...
RenderStream(@PIN_CATEGORY_CAPTURE,
nil,
Filter as IBaseFilter,
Encoder as IBaseFilter,
Multiplexer);
end;//if CaptureVideo... //链接视频PREVIEW...
RenderStream(@PIN_CATEGORY_PREVIEW,
nil,
Filter as IBaseFilter,
nil,
VideoWindow as IBaseFilter);
end;//with...
FilterGraph.Play;
if CaptureVideo then
InCapturing := True;
DriverOpened := True; except
InCapturing := False;
DriverOpened := False;
end;//try...except...
end;
-----------------------------------
由于是改了制式出问题,所以,我只贴出了与这些相关的代码,有过DirectX Show Video Capture经验的朋友,请帮忙看看。
============================================================
问题共有三个方面的:
。关于Video Capture,基于DirectX 9.0;
。关于TWebBrowser,基于IHTMLDocument2、IHTMLDocument3接口;
。关于多层应用的构架思想和实现,主要基于COM+。
问题的详细说明在明天给出,欢迎大家参与讨论。
来自:Boat, 时间:2004-8-29 17:45:57, ID:2784684
期待中……
来自:arcore, 时间:2004-8-30 17:33:24, ID:2785764 | 编辑
===============================================================
问题一、关于Video Capture,基于DirectX 9.0 分数:300
===============================================================
说明:
这是一个视频采集的程序,基于DX 9,现在用DSPack2.3组件包实现(采用DSPack组件包只是为了方便,视频采集模块的功能也可以用DX SDK中的接口来实现,方法类似)。现在,小弟的程序中,可以动态的设置视频源的制式、分辨率、色深,选择视频编码器,一边Preview,一边Capture,把视频保存到一个本地AVI文件中。现在的问题是,如果视频源是Pal制式的,工作正常。但是前几天,小弟遇到一个客户在用软件的时候,视频源是N制的,在进行AVI Capture的时候,出错了。出错的提示小弟记不请了,大概是Pin与Pin连接的时候出错的。 部分源代码如下:
---------------------------------------------------------
{设置制式...}
function TLDShowCapF.SetCaptureAnalog(BaseFilter : IBaseFilter; AnalogValue : integer) : HResult;
var
AMAnalogVideoDecoder : IAMAnalogVideoDecoder;
begin
Result := S_FALSE;
if BaseFilter = nil then Exit;
Result := BaseFilter.QueryInterface(IID_IAMAnalogVideoDecoder, AMAnalogVideoDecoder);
if Succeeded(Result) then
Result := AMAnalogVideoDecoder.put_TVFormat(AnalogValue); AMAnalogVideoDecoder := nil;
end;procedure TLDShowCapF.DoCapture(const CaptureVideo: boolean);
var
AMStreamConfig : IAMStreamConfig;
AMStreamConfigC : IAMStreamConfig;
Multiplexer : IBaseFilter;
Writer : IFileSinkFilter;
strOutFileName : WideString;
begin
//ShowMessage('VideoWidth:' + IntToStr(FVideoWidth) + ', VideoHeight:' + IntToStr(FVideoHeight));
VideoWindow.Width := FVideoWidth;
VideoWindow.Height := FVideoHeight;
VideoWindow.Left := (Screen.Width - VideoWindow.Width) div 2;
VideoWindow.Top := ToolBar1.Height + (Screen.Height - ToolBar1.Height - VideoWindow.Height - ScrollBox1.Height) div 2; try
FilterGraph.ClearGraph;
FilterGraph.Active := False;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(0);
if CaptureVideo then
begin
Encoder.FilterGraph := FilterGraph;
Encoder.BaseFilter.Moniker := EncoderEnum.GetMoniker(FVideoEncoder);
end
else
begin
Encoder.FilterGraph := nil;
Encoder.BaseFilter.Moniker := nil;
end;
FilterGraph.Active := True; with FilterGraph as ICaptureGraphBuilder2 do
begin
//设置制式...
SetCaptureAnalog(Filter as IBaseFilter, FAnalogVideo); //设置PREVIEW色深、分辩率...
FindInterface(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, AMStreamConfig);
SetCustomMediaBitCount(AMStreamConfig, FColorBit);
SetCaptureScale1(AMStreamConfig, FVideoWidth, FVideoHeight);
//设置CAPTURE色深、分辩率
if CaptureVideo then
begin
FindInterface(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, AMStreamConfigC);
SetCustomMediaBitCount(AMStreamConfigC, FColorBit);
SetCaptureScale1(AMStreamConfigC, FVideoWidth, FVideoHeight); //视频输出文件...
strOutFileName := CaptureFileName;
SetOutPutFileName(MEDIASUBTYPE_Avi, PWideChar(strOutFileName), Multiplexer, Writer);
//链接视频Capture...
RenderStream(@PIN_CATEGORY_CAPTURE,
nil,
Filter as IBaseFilter,
Encoder as IBaseFilter,
Multiplexer);
end;//if CaptureVideo... //链接视频PREVIEW...
RenderStream(@PIN_CATEGORY_PREVIEW,
nil,
Filter as IBaseFilter,
nil,
VideoWindow as IBaseFilter);
end;//with...
FilterGraph.Play;
if CaptureVideo then
InCapturing := True;
DriverOpened := True; except
InCapturing := False;
DriverOpened := False;
end;//try...except...
end;
-----------------------------------
由于是改了制式出问题,所以,我只贴出了与这些相关的代码,有过DirectX Show Video Capture经验的朋友,请帮忙看看。
===============================================================================
问题二、关于TWebBrowser,基于IHTMLDocument2、IHTMLDocument3接口 (300分)
===============================================================================
说明:
大家知道,Delphi的TWebBrowser封装了IHTMLDocument2接口,使得我们可以用它做很多很有用的东西。
在Delphi中,可以通过如下代码得到IHTMLDocument2接口:var
Doc : IHTMLDocument2;
begin
Doc := (WebBrowser1.Document) as IHTMLDocument2;
{do something here}
end; IHTMLDocument2接口有一个execCommand方法,比如,想要把WebBrowser中选定的文本加上下线,可以这样做: var
Doc : IHTMLDocument2;
begin
Doc := (WebBrowser1.Document) as IHTMLDocument2;
if Doc <> nil then
Doc.execCommand('Underline',False,EmptyParam);
end; execCommand方法的第一个参数,就是要WebBrowser去执行的Command ID。在MSDN文档中,共定义了如下的Command ID(小弟的是MSDN 98版):
----------------------------------------------------
'BackColor', 'Bold', 'Copy', 'CreateBook', 'CreateLink',
'Cut', 'Delete', 'FontName', 'FontSize', 'ForeColor',
'FormatBlock', 'Indent', 'InsertButton', 'InsertFieldset', 'InsertHorizontalRule',
'InsertIFrame', 'InsertInputButton', 'InsertInputCheckbox',
'InsertInputFileUpload', 'InsertInputHidden', 'InsertInputPassword',
'InsertInputRadio', 'InsertInputReset', 'InsertInputSubmit',
'InsertInputText', 'InsertMarquee', 'InsertOrderedList',
'InsertParagraph', 'InsertSelectDropdown', 'InsertSelectListbox',
'InsertTextArea', 'InsertUnorderedList', 'Italic',
'JustifyCenter', 'JustifyLeft', 'JustifyRight',
'Outdent', 'OverWrite', 'Paste',
'Refresh', 'RemoveFormat', 'SelectAll',
'UnBook', 'Underline', 'Unlink',
'Unselect', 'editMode'; 利用IHTMLDocument2的ExecCommand方法和上面的Command ID,我们可以做很多有趣的事情,更或者,可以在我们的程序中提供像FrontPage那样的“所见所得”的HTML编辑器,而不用去改HTML代码。
好了,前奏说完了,现在,小弟的问题是:
A、如果我想在WebBrowser中插入一个SelectListbox,我可以用InsertSelectListbox Command ID,但是,如果我要修改它的列表项目,怎么办呢?也就是说,我在WebBrowser中插入了HTML元素,然后想编辑它的属性(比如说在双击它的时候弹出一个属性编辑对话框),应该怎么办?这一点,小弟一直没有试出来。请有经验的朋友说说。
B、用WebBrowser把HTML文档编好了以后,我想打印在报表上(比如用Quick Report)怎么办?不要说用IE的打印命令,我这里把HTML作为一个文档来打印,作为报表的一个部分来打印(比如原来在报表中的QRRichText中的部分),怎么办?
来自:arcore, 时间:2004-8-30 17:35:30, ID:2785768 | 编辑===============================================================
问题三、关于三层应用的构架思想和实现,主要基于COM+ 分数:600
===============================================================
这个问题,好像面很广,我一时也想不出怎么表述。这样吧,如果大家有心,手上有与这个主题相符的资料,先贴出来。我先理理思路,过两天再把问题贴出来,或是一边讨论一边提问题。
要求:
。讲述三层的构架思想,小弟也知道三层是DBMS/App Server/Client,所以,主要讲一讲中间层的App Server的面象对象设计与实现;
。近段时间,小弟在想,如果不用Delphi提供的RDM和DCOMConnection/SocketConnection,而自己用COM+对象来实现,是否可行?请大家关于这点讲一讲。
==============================================================
上面的问题,第一、第二点要解决,第三点只作讨论。如果在DFW上回贴也可以,DFW上的ID:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2773828
不是特别的问题,还是分三个贴讨论吧,使于讨论.
第一问我不会,第二问关于WEBBROWSER,MSHTML的使用,没这样用过,但可以解决.
第三问,,,最难..不是在COM+技术上,而是,一般做软件中,确切把握目标或者问题是最难.
在李维的《系统篇》中曾经提到企业对象的实现思路,建议你看看,我给你一些提示
1、RDM最好不要作为具体企业服务对象来看到,否则当企业业务逻辑复杂后会非常庞大的,且不利于面向对象设计,但可以考虑作为企业服务对象的控制对象来看待;
2、企业对象可以用DM来实现,既可以将企业逻辑一个一个独立开,有可以通过继承和封装体现业务逻辑;
3、DM与RDM可以通过注册方式实现企业对象与控制对象之间的控制关系;
4、客户端要与服务器端建立相应的机制,以便实现数据在客户端的缓存;
5、界面与数据、业务逻辑在一定程度上分离。
还有...如果有兴趣,可以与我联系
[email protected]
========谢谢,我搞定了。
第三个问题真的有这么难吗?
在李维的《系统篇》中曾经提到企业对象的实现思路,建议你看看,我给你一些提示
1、RDM最好不要作为具体企业服务对象来看到,否则当企业业务逻辑复杂后会非常庞大的,且不利于面向对象设计,但可以考虑作为企业服务对象的控制对象来看待;
2、企业对象可以用DM来实现,既可以将企业逻辑一个一个独立开,有可以通过继承和封装体现业务逻辑;
3、DM与RDM可以通过注册方式实现企业对象与控制对象之间的控制关系;
4、客户端要与服务器端建立相应的机制,以便实现数据在客户端的缓存;
5、界面与数据、业务逻辑在一定程度上分离。
还有...如果有兴趣,可以与我联系
[email protected]
============================
谢谢。我在想,可以不要DM和RDM。呵,我现在的程序中就没有用到。请多多讲讲。