问题全文如下(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经验的朋友,请帮忙看看。

解决方案 »

  1.   

    来自:arcore, 时间:2004-8-30 17:34:13, ID:2785765 | 编辑
    ===============================================================================
    问题二、关于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
      

  2.   

    呵让我也看看CSDN中的高手名人。。
      

  3.   

    三个问题逻辑上没有关系,
    不是特别的问题,还是分三个贴讨论吧,使于讨论.
    第一问我不会,第二问关于WEBBROWSER,MSHTML的使用,没这样用过,但可以解决.
    第三问,,,最难..不是在COM+技术上,而是,一般做软件中,确切把握目标或者问题是最难.
      

  4.   

    以前用BCB做过,好久没有动过了,都忘了
      

  5.   

    第三个问题真的有这么难吗?
    在李维的《系统篇》中曾经提到企业对象的实现思路,建议你看看,我给你一些提示
    1、RDM最好不要作为具体企业服务对象来看到,否则当企业业务逻辑复杂后会非常庞大的,且不利于面向对象设计,但可以考虑作为企业服务对象的控制对象来看待;
    2、企业对象可以用DM来实现,既可以将企业逻辑一个一个独立开,有可以通过继承和封装体现业务逻辑;
    3、DM与RDM可以通过注册方式实现企业对象与控制对象之间的控制关系;
    4、客户端要与服务器端建立相应的机制,以便实现数据在客户端的缓存;
    5、界面与数据、业务逻辑在一定程度上分离。
    还有...如果有兴趣,可以与我联系
      [email protected]
      

  6.   

    到MSDN去找资料,IAMStreamConfig,IBaseFilter,IFileSinkFilter在那都有详细说明,dspack封装的很完整。
      

  7.   

    到MSDN去找资料,IAMStreamConfig,IBaseFilter,IFileSinkFilter在那都有详细说明,dspack封装的很完整。
    ========谢谢,我搞定了。
      

  8.   

    回复人: libochen(libochen) ( ) 信誉:100  2004-11-27 19:02:22  得分: 0  
     
     
       
    第三个问题真的有这么难吗?
    在李维的《系统篇》中曾经提到企业对象的实现思路,建议你看看,我给你一些提示
    1、RDM最好不要作为具体企业服务对象来看到,否则当企业业务逻辑复杂后会非常庞大的,且不利于面向对象设计,但可以考虑作为企业服务对象的控制对象来看待;
    2、企业对象可以用DM来实现,既可以将企业逻辑一个一个独立开,有可以通过继承和封装体现业务逻辑;
    3、DM与RDM可以通过注册方式实现企业对象与控制对象之间的控制关系;
    4、客户端要与服务器端建立相应的机制,以便实现数据在客户端的缓存;
    5、界面与数据、业务逻辑在一定程度上分离。
    还有...如果有兴趣,可以与我联系
      [email protected]
    ============================
    谢谢。我在想,可以不要DM和RDM。呵,我现在的程序中就没有用到。请多多讲讲。