Форум по 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:
Есть код:
Код:
1
2
3
4
5
6
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 - значит, что этот модуль привязан к платформе, т.е. твоя прога не будет кроссплатформенной, если ты будешь юзать этот модуль.

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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;

Пример:
Код:
1
2
3
4
5
6
7
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

Вот пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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 <b>TForm1.</b>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, время: 05:44.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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