Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TOpenDialog, Folder Select 
:(
    Опции темы
Ak47t
  Дата 18.8.2005, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Подскажите как можно сделать что-бы в TOpenDialog'е можно было выбырать не только файлы но и папки при Multiselect. smile
PM MAIL ICQ   Вверх
Poseidon
Дата 18.8.2005, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



TOpenDialog (TSaveDialog) и TOpenPictureDialog (TSavePictureDialog) отображают модальные диалоговые окна Windows для открытия (сохранения) файлов. Для работы с папками, используй другие компоненты


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 19.8.2005, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Например можно также использовать функции SelectDirectory(). В зависимости от параметров они имеют разный вид (т. е. диалоги)... Но к сожалению этидиалоги вроде не очень хотят мультиселекта.

Я бы самостоятельно написал диалог, используя компоненты палитры...
PM   Вверх
Pakshin A. S.
  Дата 19.8.2005, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Пример ручного создания диалога "на скорую руку"... Поиграй еще с компонентами...

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  asd.exe 54,39 Kb
PM   Вверх
Ak47t
Дата 19.8.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Цитата
asd.exe 54,39 Kb

Спасиб. smile
PM MAIL ICQ   Вверх
Girder
Дата 19.8.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



 На основе стандартного smile : 
Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure OpenDialog1SelectionChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses CommCtrl, CommDlg;

var CallWndProc:Pointer;
    HE:DWord;
    BufStr:TStrings;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    n:string;
begin
 CallWndProc:=nil;
 BufStr:=TStringList.Create;
 OpenDialog1.Options:=OpenDialog1.Options+[ofAllowMultiSelect];
 if OpenDialog1.Execute then
  begin
   for i:=0 to OpenDialog1.Files.Count-1 do
    begin
     n:=ExtractFileName(OpenDialog1.Files.Strings[i]);
     n:=copy(n,2,Length(n));
     OpenDialog1.Files.Strings[i]:=ExtractFilePath(OpenDialog1.Files.Strings[i])+n;
    end;
   Memo1.Text:=OpenDialog1.Files.Text;
  end;
 BufStr.Free; 
end;

function WndProcNew(Win:HWND; Msg:DWord; wParam:Integer; lParam:Integer):LResult; stdcall;
var t:array [1..10] of char;
begin
 Result:=0;
 if (Msg=WM_KEYDOWN)and(wParam=13) then
  begin
   Windows.SetFocus(HE);
   PostMessage(HE,Msg,wParam,lParam);
   exit;
  end else
  if (Msg=WM_KillFocus) then
   begin
    t[1]:=#0;
    GetClassName(wParam,PChar(@t),Length(t));
    if AnsiCompareText('Button',PChar(@t))=0 then
     begin
      Windows.SetFocus(HE);
      PostMessage(wParam,BM_Click,0,0);
      exit;
     end;
   end;
 Result:=CallWindowProc(CallWndProc,Win,Msg,wParam,lParam);
end;

procedure TForm1.OpenDialog1SelectionChange(Sender: TObject);
var HD,SLV:DWord;
    i,j,size,k:integer;
    t:array [1..10240] of char;
    p,t2,t3:PChar;
    s:string;
begin
 HD:=GetParent(OpenDialog1.Handle);
 if HD=0 then HD:=OpenDialog1.Handle;
 SLV:=FindWindowEx(FindWindowEx(HD,0,'SHELLDLL_DefView',nil),0,'SysListView32',nil);
 HE:=FindWindowEx(FindWindowEx(FindWindowEx(HD,0,'ComboBoxEx32',nil),0,'ComboBox',nil),0,'Edit',nil);
 if (SLV=0)or(HE=0) then exit;
 size:=SendMessage(HD,CDM_GETFOLDERIDLIST,0,0);
 t2:=nil;
 if size<0 then exit;
 if size>0 then
  begin
   inc(size);
   GetMem(t2,size);
   SendMessage(HD,CDM_GETSPEC,size,integer(t2));
   if t2^='"' then
    begin
     j:=0;
     i:=1;
     k:=Length(t2);
     while (i<k) do
      begin
       if (PChar(t2+i)^<>'"') then PChar(t2+j)^:=PChar(t2+i)^ else
        begin
         PChar(t2+j)^:=#0;
         i:=i+2;
        end;
       inc(i);
       inc(j);
      end;
    PChar(t2+j)^:=#0;
    end;
  end;
 BufStr.Clear;
 i:=ListView_GetSelectedCount(SLV);
 j:=ListView_GetItemCount(SLV);
 while (i>0)or(j>0) do
  begin
   dec(j);
   if (ListView_GetItemState(SLV,j,LVIS_SELECTED) and LVIS_SELECTED<>0) then
    begin
     dec(i);
     t[1]:=#0;
     p:=PChar(@t);
     ListView_GetItemText(SLV,j,0,p,Length(t));
     if (t[1]<>#0) then BufStr.Add(p)
    end;
  end;
 if size>0 then
  begin
   t3:=t2;
   while (t3^<>#0) do
    begin
     j:=0;
     for i:=0 to BufStr.Count-1 do
      if AnsiCompareText(BufStr.Strings[i],t3)=0 then
       begin
        j:=-1;
        break;
       end;
     s:=copy(t3,1,Length(t3)-Length(ExtractFileExt(t3)));
     if (Length(s)>0)and(j<>-1) then
      begin
       if s[Length(s)]='.' then s:=copy(s,1,Length(s)-1);
       for i:=0 to BufStr.Count-1 do
        if AnsiCompareText(BufStr.Strings[i],s)=0 then
         begin
          BufStr.Strings[i]:=t3;
          break;
         end;
      end;
     t3:=t3+Length(t3)+1;
    end;
  end;
 s:='';
 for i:=0 to BufStr.Count-1 do s:=s+' " '+BufStr.Strings[i]+'"';
 if trim(s)<>'' then SetWindowText(HE,PChar(trim(s)));
 if (GetWindowLong(slv,GWL_WNDPROC)<>integer(@WndProcNew)) then
  CallWndProc:=Pointer(SetWindowLong(slv,GWL_WNDPROC,integer(@WndProcNew)));
 if size<>0 then FreeMem(t2,size);
end;

end.
  


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Ak47t
Дата 19.8.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Цитата(Girder @ 19.8.2005, 18:06)
На основе стандартного

Это мне в реале подошло спасиб. smile
PM MAIL ICQ   Вверх
Ak47t
Дата 20.8.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Еше один вопрос к этой теме.
Как как изменить текст кнопки Open в TOpenDialog на свой текст. smile
PM MAIL ICQ   Вверх
Alex
Дата 20.8.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Модератор: Пожалуйста, один топик - один вопрос.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4007 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.