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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоматическое открытие текстовых файлов. 
V
    Опции темы
Vladimir_K
Дата 19.4.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я использовал вот какой код:

Код

uses ShellAPI, ShlObj; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
 TitleName : string;   
 lpItemID : PItemIDList;   
 BrowseInfo : TBrowseInfo;   
 DisplayName : array[0..MAX_PATH] of char;   
 TempPath : array[0..MAX_PATH] of char;  
  
begin 
 FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);   
 BrowseInfo.hwndOwner := Form1.Handle;   
 BrowseInfo.pszDisplayName := @DisplayName;   
 TitleName := 'Please specify a directory';   
 BrowseInfo.lpszTitle := PChar(TitleName);   
 BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;   
 lpItemID := SHBrowseForFolder(BrowseInfo);   
 if lpItemId <> nil then begin    
 SHGetPathFromIDList(lpItemID, TempPath);   
 ShowMessage(TempPath);   
 GlobalFreePtr(lpItemID);    
 end;    
end;


В теме, в которой я его нашел, сказано следующее:

Цитата

Код работает , но мне нужно чтобы запоминался путь к последней выбранной папке и при повторном выборе папки предлагался бы выбор с ранее выбранной папки.
А в даном коде выбор папки всегда начинается с "Мой компьютер".
Как выбрать папку , с возможностью запоминания ранее выбраной папки?(Чтобы вводить несколько папок с одного места на диске последовательно)

После этого:
Цитата

Извените , что поспешил задать вопрос ,нашел решение сам:
В JEDI есть компонента JvSelectDirectory,она решила мою проблему. 

И больше никаких подробностей. Но мне этого мало.

Подскажите, как использовать эту компоненту: JvSelectDirectory?

Это сообщение отредактировал(а) Vladimir_K - 19.4.2007, 17:52
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
Vladimir_K
Дата 19.4.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И почему-то для правильной работы моей программы, она должна находиться в той же папке, где и текстовые файлы... Иначе - не работает. Поэтому, наверное, и со вложенными папками ничего не получается?
В принципе, мне запоминание последней открытой папки не нужно, если программа сможет открывать файлы из папки, которую я укажу и из вложенных в нее папок!

Это сообщение отредактировал(а) Vladimir_K - 19.4.2007, 22:17
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
Vladimir_K
Дата 22.4.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Akella, спасибо за выложенные коды, я пытался разобраться в них, но так как я очень слаб в Delphi, я не смог применить Ваш код (исправить "ошибки", которые вывалила моя Delphi7 на Ваш код), сколько я с ним не бился  smile 
Вот мой код:
Код

//------------------------------------------------------------------------------
// Указать папку
//------------------------------------------------------------------------------
procedure TForm1.BOpenDirClick(Sender: TObject);
var 
 TitleName : string;   
 lpItemID : PItemIDList;   
 BrowseInfo : TBrowseInfo;   
 DisplayName : array[0..MAX_PATH] of char;   
 TempPath : array[0..MAX_PATH] of char;    //Адрес папки
 F:TSearchRec;
 ires:integer;
 i,ns:integer;
 z:string;

begin 
 FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);   
 BrowseInfo.hwndOwner := Form1.Handle;   
 BrowseInfo.pszDisplayName := @DisplayName;
 TitleName := 'Please specify a directory';
 BrowseInfo.lpszTitle := PChar(TitleName);
 BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
 lpItemID := SHBrowseForFolder(BrowseInfo);
 if lpItemId <> nil
  then begin
   SHGetPathFromIDList(lpItemID, TempPath);
   GlobalFreePtr(lpItemID);
  end;

 ires:=FindFirst(TempPath+'\*.txt',faAnyFile,F); //Найти первый txt файл
 while ires=0 do                                                 //Найти и изменить все файлы из папки (и из вложенных папок - если есть)
  begin
   RichEdit1.Lines.LoadFromFile(F.Name);         //Отобразить содержимое файла

// Здесь идет просмотр файла, изменение его (если нужно), и т.д.
// Код я написал сам, приводить его здесь нет смысла - вряд ли он кого-то заинтересует...

   RichEdit1.Lines.SaveToFile(F.Name);             //Сохранение файла
   RichEdit1.Clear;


   ires:=FindNext(F);                    //Найти следующий txt файл
  end;
 FindClose(F);                         //Завершение поиска
end;

Проблема такая: моя программа может открыть txt файлы только из папки, в которой находится сама программа. Из других папок файлы не открываются.
DRKB3 Full скачал (за 2.5 часа smile ) ищу ответ там, но что-то никак не найду...
Может быть, кто-то из вас, о, Великие и Мудрые снизойдет до решения моей задачи?

Это сообщение отредактировал(а) Vladimir_K - 22.4.2007, 13:32
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
VladBD
Дата 22.4.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хочешь просто - бери OpenDialog, кидай на форму. При старте программы можешь начальный путь указать или расширение по умолчанию - но это не обязательно. Главное укажи мультиселект - чтобы несколько файлов можно было выделять...
Потом в обработчике Button1 пишешь
Код

  if opendialog1.execute=false then Exit;
  for i:=0 to opendialog.files.count do
  begin
     здесь обрабатывай текущий файл
     opendialog.files[i] - это имя I-того выбранного файла 
  end;

PM MAIL   Вверх
Vladimir_K
Дата 23.4.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, OpenDialog здесь не поможет. smile 
Мне нужно указывать не отдельные файлы, а папку целиком (в которой находятся вложенные папки, а в них *.txt файлы - и прога должна уметь их все находить, и открывать).
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
Akella
Дата 23.4.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Vladimir_K @  22.4.2007,  13:30 Найти цитируемый пост)
я не смог применить Ваш код (исправить "ошибки", которые вывалила моя Delphi7 на Ваш код), сколько я с ним не бился 

какие именно ошибки?

наверное тебе так нужно сделать:
в верху юнита, есть раздел private

объяви там процедуру, и обрати внимание на TForm1 - замени на свою форму
Код

  private
    { Private declarations }
     Procedure ScanFilder(Dir:String);
...
...
  public
    { Public declarations }
...

implementation

{$R *.dfm}


Procedure TForm1.ScanFilder(Dir:String);
Var
 SearchRec:TSearchRec;
begin
 try
   if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);
   if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then//если что-то нашли
     repeat
       if (SearchRec.name='.') or (SearchRec.name='..') then continue;//если это не каталоги и не файлы, то пропускаем
       if ((SearchRec.Attr and faDirectory)<>0) then//
         ScanFilder(Dir+SearchRec.name) //нашли папку и вызываем опять саму себя - рукурсия называется
       else  begin//если попалась не папка, а файл, то вот он родной, нужно узнать расширение
             
           if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.RTF' then   EditFile(Dir+SearchRec.name);//если расширение "наше", то вызываем функцию EditFile(), а вот уже эту функцию пиши сам, никто не знает точно что ты в ней будешь делать!!!
       end;//else
     until FindNext(SearchRec)<>0;
   FindClose(SearchRec);//заканчиваем поиск
 finally
   //
 end;
end;

PM MAIL   Вверх
Vladimir_K
Дата 23.4.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так, это сделал:
Код

private
    { Private declarations }
     Procedure ScanFilder(Dir:String);

Теперь набросок того, что по-моему должно быть:
Код

//==============================================================================
procedure TForm1.Button1Click(Sender: TObject);//По нажатию этой кнопки открывается папка (со вложенными папками с файлами), файлы обрабатываются, и сохраняются.
begin
 ScanFilder(Dir);
end;

procedure EditFile(Dir+SearchRec.name);
begin
 RichEdit1.Lines.LoadFromFile(F.Name);         //Отобразить содержимое файла

//Здесь мой код обработки файла...

 RichEdit2.Lines.SaveToFile(F.Name);           //Сохранение файла
end;

Procedure ScanFilder(Dir:String);
Var
 SearchRec:TSearchRec;
begin
 try
  if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then//если что-то нашли
   repeat
    if (SearchRec.name='.') or (SearchRec.name='..') then continue;//если это не каталоги и не файлы, то пропускаем
    if ((SearchRec.Attr and faDirectory)<>0) then//
         ScanFilder(Dir+SearchRec.name) //нашли папку и вызываем опять саму себя - рукурсия называется
     else
      begin//если попалась не папка, а файл, то вот он родной, нужно узнать расширение
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then EditFile(Dir+SearchRec.name);//если расширение "наше", то вызываем функцию EditFile(), а вот уже эту функцию пиши сам, никто не знает точно что ты в ней будешь делать!!!
      end;//else
   until FindNext(SearchRec)<>0;
  FindClose(SearchRec);//заканчиваем поиск
 finally
   //
 end;
end;
//==============================================================================

Как правильно написать обработчик Button1Click?
EditFile(Dir+SearchRec.name), наверное надо написать процедурой, а не функцией?

Это сообщение отредактировал(а) Vladimir_K - 23.4.2007, 14:21
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
Akella
Дата 24.4.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Код


private
    { Private declarations }
     Procedure ScanFolder(Dir:String);
     procedure EditFile(FileName:string);
......


implementation

....
procedure TfmMain.EditFile(FileName:string);
begin
 RichEdit1.Lines.LoadFromFile(FileName);         //ЗАГРУЗИТЬ содержимое файла

//Здесь мой код обработки файла...

 RichEdit2.Lines.SaveToFile(FileName);           //Сохранение файла
end

Procedure TfmMain.ScanFolder(Dir:String);
Var
 SearchRec:TSearchRec;
begin
 try
  if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then//если что-то нашли
   repeat
    if (SearchRec.name='.') or (SearchRec.name='..') then continue;//если это не каталоги и не файлы, то пропускаем
    if ((SearchRec.Attr and faDirectory)<>0) then//
         ScanFilder(Dir+SearchRec.name) //нашли папку и вызываем опять саму себя - рукурсия называется
     else
      begin//если попалась не папка, а файл, то вот он родной, нужно узнать расширение

       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then EditFile(Dir+SearchRec.name);

      end;//else
   until FindNext(SearchRec)<>0;
  FindClose(SearchRec);//заканчиваем поиск
 finally
   //
 end;
end;



Добавлено через 2 минуты и 26 секунд
Но я бы на твоём месте не делал так в цикле, а в цикле (FindeFolder(....) ) загрузил бы в список все найденные файлы, и показал бы пользователю список. Пусть сам выбирает.
PM MAIL   Вверх
Vladimir_K
Дата 24.4.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ура, заработало! smile 
Спасибо, Akella, огромное!
А пользователь у этой программы один будет - я, так что все путём!  smile 

P.S. Совсем забыл спросить: как в DRKB искать фразу целиком? А то я ввожу фразу для поиска, а оно мне винегрет из отдельных слов находит...

Это сообщение отредактировал(а) Vladimir_K - 24.4.2007, 19:01
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
PM MAIL ICQ   Вверх
Martisha
Дата 25.11.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



e у ня похожаяситуация, только у меня папка уже известна из которой текстовые файлы берутся, это папка каждый час обновляется..что мне поменять нужно в этом коде? т.е. задача загрузить из известной папки текстовые файлы в эдит, ну и обработать их потом.. 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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