<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=116472&amp;view=findpost&amp;p=871382</guid>
        <pubDate>Fri, 30 Sep 2005 06:57:49 +0000</pubDate>
        <title>Показать диалог выбора пользователей</title>
        <link>https://forum.sources.ru/index.php?showtopic=116472&amp;view=findpost&amp;p=871382</link>
        <description><![CDATA[tIce: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit Unit1;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls, ActiveX;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;CLSID_DsObjectPicker: TGUID = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;D1:d6ccd8; D2:b7b; D3:d2; D4:($b9,$e0,{text},$c0,f,$d8,$db,$f7));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;IID_IDsObjectPicker: TGUID = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;D1:{text}c87e64e; D2:b7a; D3:d2; D4:($b9,$e0,{text},$c0,f,$d8,$db,$f7));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ANYSIZE_ARRAY = 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;CFSTR_DSOP_DS_SELECTION_LIST = &#39;CFSTR_DSOP_DS_SELECTION_LIST&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;DSOP_SCOPE_TYPE_TARGET_COMPUTER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= {text}000001;</div><div class="code_line">&nbsp;&nbsp;DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE = {text}000200;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DSOP_FILTER_USERS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= {text}000002;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DSOP_DOWNLEVEL_FILTER_USERS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= DWORD(000001);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK &nbsp; &nbsp; &nbsp;= {text}000002;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;LPLPWSTR = ^PWideChar;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDsOpUpLevelFilterFlags = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;flBothModes: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flMixedModeOnly: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flNativeModeOnly: ULONG;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDsOpFilterFlags = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Uplevel: TDsOpUpLevelFilterFlags;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flDownlevel: ULONG;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PDsOpScopeInitInfo = ^TDsOpScopeInitInfo;</div><div class="code_line">&nbsp;&nbsp;TDsOpScopeInitInfo = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;cbSize: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flType: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flScope: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FilterFlags: TDsOpFilterFlags;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzDcName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzADsPath: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;hr: HRESULT;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDsOpInitInfo = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;cbSize: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzTargetComputer: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cDsScopeInfos: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aDsScopeInfos: PDsOpScopeInitInfo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flOptions: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cAttributesToFetch: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;apwzAttributeNames: LPLPWSTR;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDsSelection = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzADsPath: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzClass: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pwzUPN: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pvarFetchedAttributes: POleVariant; </div><div class="code_line">&nbsp;&nbsp; &nbsp;flScopeType: ULONG;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PDSSelectionList = ^TDsSelectionList;</div><div class="code_line">&nbsp;&nbsp;TDsSelectionList = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;cItems: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cFetchedAttributes: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aDsSelection: array [0..ANYSIZE_ARRAY - 1] of TDsSelection;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;IDsObjectPicker = interface (IUnknown)</div><div class="code_line">&nbsp;&nbsp;[&#39;{0c87e64e-3b7a-11d2-b9e0-00c04fd8dbf7}&#39;]</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Initialize(const pInitInfo: TDsOpInitInfo): HRESULT; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function InvokeDialog(hwndParent: HWND; out ppdoSelections: IDataObject): HRESULT; stdcall;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Button1: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form1: TForm1;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">function InitObjectPicker(Picker: IDsObjectPicker): HRESULT;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;ScopeInit: array [0..0] of TDSOPScopeInitInfo; // ибъект который указывает что будем выбирать</div><div class="code_line">&nbsp;&nbsp;InitInfo: TDSOPInitInfo; // информация об инициализации</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if nil = Picker then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := E_INVALIDARG</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@ScopeInit, SizeOf(ScopeInit)); //заполняем нулями</div><div class="code_line">&nbsp;&nbsp; &nbsp;ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo); // заполняем структуру TDSOPScopeInitInfo</div><div class="code_line">&nbsp;&nbsp; &nbsp;ScopeInit[0].flType := DSOP_SCOPE_TYPE_TARGET_COMPUTER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ScopeInit[0].flScope := DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@InitInfo, SizeOf(InitInfo));// заполняем структуру TDSOPInitInfo</div><div class="code_line">&nbsp;&nbsp; &nbsp;InitInfo.cbSize := SizeOf(InitInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InitInfo.cDsScopeInfos := SizeOf(ScopeInit) div SizeOf(TDSOPScopeInitInfo); </div><div class="code_line">&nbsp;&nbsp; &nbsp;InitInfo.aDsScopeInfos := @ScopeInit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InitInfo.flOptions := DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK;</div><div class="code_line">// инициализируем объект выбора</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Picker.Initialize(InitInfo);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end; </div><div class="code_line">&nbsp;</div><div class="code_line">function ProcessSelectedObjects(DatObj: IDataObject): HRESULT; </div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;StgMed: TStgMedium; //объект хранения данных</div><div class="code_line">&nbsp;&nbsp;FmtEtc: TFormatEtc; &nbsp;//формат ыввода данных</div><div class="code_line">&nbsp;&nbsp;SelLst: PDSSelectionList; &nbsp;//выбранные объекты</div><div class="code_line">&nbsp;&nbsp;Index: ULONG; &nbsp;</div><div class="code_line">&nbsp;&nbsp;Text: string;</div><div class="code_line">begin </div><div class="code_line">//проверка на &quot;дурака&quot; </div><div class="code_line">&nbsp;if nil = DatObj then </div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := E_INVALIDARG </div><div class="code_line">&nbsp;&nbsp;else </div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;with FmtEtc do </div><div class="code_line">&nbsp;&nbsp; &nbsp;begin </div><div class="code_line">//регистрируем формат вывода данных</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cfFormat := RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ptd &nbsp; &nbsp; &nbsp;:= nil; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwAspect := DVASPECT_CONTENT;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lindex &nbsp; := -1; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;tymed &nbsp; &nbsp;:= TYMED_HGLOBAL; </div><div class="code_line">&nbsp;&nbsp; &nbsp;end; </div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := DatObj.GetData(FmtEtc, StgMed);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Succeeded(Result) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin </div><div class="code_line">//получаем результат вызора в удобоваримом формате</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SelLst := PDsSelectionList(GlobalLock(StgMed.hGlobal)); </div><div class="code_line">// и если не nil обрабатываем его</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if SelLst &#60;&#62; nil then </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;try </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Text := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for Index := 0 to SelLst.cItems - 1 do </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Text := Text + Format( </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;Object : %u&#39;#13#10 + </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39; &nbsp;Name : %s&#39;#13#10 +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39; &nbsp;Class: %s&#39;#13#10 + </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39; &nbsp;Path : %s&#39;#13#10 + </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39; &nbsp;UPN &nbsp;: %s&#39;#13#10, [ </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Index, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WideCharToString(SelLst.aDsSelection[Index].pwzName),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WideCharToString(SelLst.aDsSelection[Index].pwzClass), </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WideCharToString(SelLst.aDsSelection[Index].pwzADsPath), </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WideCharToString(SelLst.aDsSelection[Index].pwzUPN)]); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ShowMessage(Text);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;finally </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GlobalUnlock(StgMed.hGlobal); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := E_POINTER;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ReleaseStgMedium(StgMed); </div><div class="code_line">&nbsp;&nbsp; &nbsp;end; </div><div class="code_line">&nbsp;&nbsp;end; </div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Picker: IDsObjectPicker;</div><div class="code_line">&nbsp;&nbsp;DatObj: IDataObject;</div><div class="code_line">begin</div><div class="code_line">//инициализируем COM+</div><div class="code_line">&nbsp;&nbsp;if Succeeded(CoInitialize(nil)) then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">// создаем Picker как объект COM+</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Succeeded(CoCreateInstance(CLSID_DsObjectPicker, nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, Picker)) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">//если инициализация Picker успешна вызываем сам диалог</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Succeeded(InitObjectPicker(Picker)) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case Picker.InvokeDialog(Self.Handle, DatObj) of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;S_OK:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">//вызов диалога</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ProcessSelectedObjects(DatObj);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finally</div><div class="code_line">//освобождаем DatObj</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DatObj := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;S_FALSE:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowMessage(&#39;Ничего не выбрано&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Picker := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;CoUninitialize;</div><div class="code_line">&nbsp;&nbsp;end; &nbsp; </div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>tIce</author>
        <category>Системные функции, WinAPI, работа с железом</category>
      </item>
	
      </channel>
      </rss>
	