Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2007, 01:03
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию Пара вопросов про FileCtrl

Вопрос номер 1:
Что значит:
[Warning] Unit1.pas(28): Unit 'FileCtrl' is specific to a platform
и как с ним бороться?

Вопрос номер 2:
Есть код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var S, path: string;
begin
if SelectDirectory('Select Directory', '', S) then
  path:=s;
end;
Но при таком вызове функции SelectDirectory окно выбора директории появляеться внизу экрана. Как установить свои значения положения окна?
Ответить с цитированием
  #2  
Старый 04.10.2007, 02:24
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Unit 'FileCtrl' is specific to a platform - значит, что этот модуль привязан к платформе, т.е. твоя прога не будет кроссплатформенной, если ты будешь юзать этот модуль.

А выбор папки вызывай с помощью этого:

Код:
function AdvBrowseDirectory(sCaption: String; wsRoot: WideString; var sDirectory: String; bEditBox: Boolean = False; bShowFiles: Boolean = False; bAllowCreateDirs: Boolean = True; bRootIsMyComp: Boolean = False): Boolean;

  // callback функция, которая вызывается при инициализации диалога
  // или когда создается новая папка

  function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer; stdcall;
	//var
		//PathName: array[0..MAX_PATH] of Char;
  begin
    case uMsg of
      BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
      // включите этот код, если хотите реагировать на выбор новой папки
      {BFFM_SELCHANGED: 
      begin
        SHGetPathFromIDList(PItemIDList(lParam), @PathName); 
        // папка "PathName" была выбрана
      end;}
     end;
     Result := 0;
   end;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;

const
  BIF_USENEWUI = $0040;
  BIF_NOCREATEDIRS = $0200;

begin
  Result := False;
  if not DirectoryExists(sDirectory) then sDirectory := '';
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if wsRoot <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
        POleStr(wsRoot), Eaten, RootItemIDList, Flags);
			end
			else
			begin

				if bRootIsMyComp then
					SHGetSpecialFolderLocation(0, CSIDL_DRIVES, RootItemIDList);

			end;
      OleInitialize(nil);
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
				pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
				lpszTitle := PChar(sCaption);
        // определяет то, как диалог будет появляться:
        ulFlags :=
          BIF_RETURNONLYFSDIRS or
          BIF_USENEWUI or
					BIF_EDITBOX * Ord(bEditBox) or
					BIF_BROWSEINCLUDEFILES * Ord(bShowFiles) or
					BIF_NOCREATEDIRS * Ord(not bAllowCreateDirs);
        lpfn    := @SelectDirCB;
        if sDirectory <> '' then lParam := Integer(PChar(sDirectory));
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        sDirectory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;

Пример:
Код:
procedure TMain.BrowseInputBtnClick(Sender: TObject);
var
	sSelectedDir:	String;
begin
	//...
	if AdvBrowseDirectory('Выбор папки с файлами для упаковки','',sSelectedDir) then
         //...
__________________
THE CRACKER IS OUT THERE

Последний раз редактировалось 4kusNick, 04.10.2007 в 02:26.
Ответить с цитированием
  #3  
Старый 07.10.2007, 00:58
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Попытался включить в проект функцию AdvBrowseDirectory
и получил:

[Error] Unit1.pas(39): Undeclared identifier: 'BFFM_INITIALIZED'
[Error] Unit1.pas(39): Undeclared identifier: 'BFFM_SETSELECTION'
[Error] Unit1.pas(51): Undeclared identifier: 'TBrowseInfo'
[Error] Unit1.pas(53): Undeclared identifier: 'PItemIDList'
[Error] Unit1.pas(54): Undeclared identifier: 'IMalloc'
[Error] Unit1.pas(55): Undeclared identifier: 'IShellFolder'
[Error] Unit1.pas(66): Undeclared identifier: 'ShGetMalloc'
[Warning] Unit1.pas(66): Comparing signed and unsigned types - widened both operands
[Error] Unit1.pas(66): Operator not applicable to this operand type
[Error] Unit1.pas(68): Missing operator or semicolon
[Error] Unit1.pas(73): Undeclared identifier: 'SHGetDesktopFolder'
[Error] Unit1.pas(74): Missing operator or semicolon
[Error] Unit1.pas(75): Undeclared identifier: 'POleStr'
[Error] Unit1.pas(81): Undeclared identifier: 'SHGetSpecialFolderLocation'
[Error] Unit1.pas(81): Undeclared identifier: 'CSIDL_DRIVES'
[Error] Unit1.pas(84): Undeclared identifier: 'OleInitialize'
[Error] Unit1.pas(87): Undeclared identifier: 'hwndOwner'
[Error] Unit1.pas(88): Undeclared identifier: 'pidlRoot'
[Error] Unit1.pas(89): Undeclared identifier: 'pszDisplayName'
[Error] Unit1.pas(90): Undeclared identifier: 'lpszTitle'
[Error] Unit1.pas(92): Undeclared identifier: 'ulFlags'
[Error] Unit1.pas(93): Undeclared identifier: 'BIF_RETURNONLYFSDIRS'
[Warning] Unit1.pas(94): Combining signed and unsigned types - widened both operands
[Error] Unit1.pas(95): Undeclared identifier: 'BIF_EDITBOX'
[Error] Unit1.pas(96): Undeclared identifier: 'BIF_BROWSEINCLUDEFILES'
[Error] Unit1.pas(98): Undeclared identifier: 'lpfn'
[Error] Unit1.pas(99): '(' expected but ':=' found
[Error] Unit1.pas(99): Statement expected, but expression of type 'Integer' found
[Error] Unit1.pas(103): Undeclared identifier: 'ShBrowseForFolder'
[Error] Unit1.pas(107): Operator not applicable to this operand type
[Error] Unit1.pas(110): Undeclared identifier: 'ShGetPathFromIDList'
[Error] Unit1.pas(111): Missing operator or semicolon
[Error] Unit1.pas(115): Missing operator or semicolon
[Error] Unit1.pas(13): Unsatisfied forward or external declaration: 'TForm1.AdvBrowseDirectory'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Ответить с цитированием
  #4  
Старый 07.10.2007, 18:41
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Добавь в uses
ShlObj, ActiveX

Вот пример:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShlObj, StdCtrls, ActiveX;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    function AdvBrowseDirectory(sCaption: String; wsRoot: WideString; var sDirectory: String; bEditBox: Boolean = False; bShowFiles: Boolean = False; bAllowCreateDirs: Boolean = True; bRootIsMyComp: Boolean = False): Boolean;
  end;

var
  Form1: TForm1;

implementation

function TForm1.AdvBrowseDirectory(sCaption: String; wsRoot: WideString; var sDirectory: String; bEditBox: Boolean = False; bShowFiles: Boolean = False; bAllowCreateDirs: Boolean = True; bRootIsMyComp: Boolean = False): Boolean;

  // callback функция, которая вызывается при инициализации диалога
  // или когда создается новая папка

  function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer; stdcall;
	//var
		//PathName: array[0..MAX_PATH] of Char;
  begin
    case uMsg of
      BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
      // включите этот код, если хотите реагировать на выбор новой папки
      {BFFM_SELCHANGED: 
      begin
        SHGetPathFromIDList(PItemIDList(lParam), @PathName); 
        // папка "PathName" была выбрана
      end;}
     end;
     Result := 0;
   end;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;

const
  BIF_USENEWUI = $0040;
  BIF_NOCREATEDIRS = $0200;

begin
  Result := False;
  if not DirectoryExists(sDirectory) then sDirectory := '';
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if wsRoot <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
        POleStr(wsRoot), Eaten, RootItemIDList, Flags);
			end
			else
			begin

				if bRootIsMyComp then
					SHGetSpecialFolderLocation(0, CSIDL_DRIVES, RootItemIDList);

			end;
      OleInitialize(nil);
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
				pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
				lpszTitle := PChar(sCaption);
        // определяет то, как диалог будет появляться:
        ulFlags :=
          BIF_RETURNONLYFSDIRS or
          BIF_USENEWUI or
					BIF_EDITBOX * Ord(bEditBox) or
					BIF_BROWSEINCLUDEFILES * Ord(bShowFiles) or
					BIF_NOCREATEDIRS * Ord(not bAllowCreateDirs);
        lpfn    := @SelectDirCB;
        if sDirectory <> '' then lParam := Integer(PChar(sDirectory));
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        sDirectory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  sDirPath: String;
begin

  sDirPath := Edit1.Text;
  AdvBrowseDirectory('Browse','',sDirPath,False,False,True,False);
  Edit1.Text := sDirPath;

end;

end.
__________________
THE CRACKER IS OUT THERE

Последний раз редактировалось 4kusNick, 07.10.2007 в 18:49.
Ответить с цитированием
  #5  
Старый 08.10.2007, 00:20
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Огромное спасибо!
Как раз, то что доктор прописал
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025