Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2010, 19:10   #1
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

Всем прив!
У мну такое задание...написать прогу (часть проги), которая создает динамически PopUpMenu с элементами из названий папок в директории с прогой, т.е.:
Лежит в одной директории с ехешником 2 папки, соответственно у менюшки будет 2 элемента...допустим, в первой папке есть 3 подпапки, соответственно, у первого элемента менюшки будет 3 подэлемента...и т.д.
Заранее кол-во папок и вложений не известно.

Для создания меню использую такой код:

Код:
procedure TMain_Form.PopupMenu1Popup(Sender: TObject);
var
  Menu, MSub: TmenuItem;
  m,sm:string;
begin

with (Sender as TPopupMenu) do
  while Items.Count > 0 do
    begin
      Items.delete(0);
      Items[0].Free;
    end;

nanku(GetCurrentDir, '*.*', ListBox1.Items);

    with (Sender as TPopupMenu) do
      begin
        Menu:=TMenuItem.Create(self);
        Menu.Caption:=;
        Menu.OnClick:=MyClick;
        Items.Insert(0, Menu);
      end;
  end;

Menu:=TMenuItem.Create(self);
Popupmenu1.Items.Insert(1, Menu);

with Menu do
  begin
    Caption:='кряк';
    MSub:= TMenuItem.Create(self);
    MSub.Caption:=sm;
    MSub.OnClick:=MyClick;
  end;

Menu.Insert(0, MSub);
end;

end;
Для поиска папок в директории с прогой:

Код:
Procedure nanku(StartDir: String; Mask:string; List:TStrings);
var
  SearchRec: TSearchRec;
begin
  if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
    begin
      repeat
        if (SearchRec.Attr and faDirectory) = faDirectory then
          if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then
            begin
              List.Add(StartDir + SearchRec.Name + '\');
              nanku(StartDir + SearchRec.Name + '\', Mask, List);
            end;
        until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
end;
или подскажите как записывать в тот же текстовый файл пути к папкам, отрезая путь до папки в которой ехешник лежит....т.е.: с:\папка1\папка2\прога.ехе будет как папка2\прога.ехе

или вот с:\папка1\папка2\папка3 будет папка2\папка3

Последний раз редактировалось Stilet; 30.03.2010 в 09:14.
Mag992 вне форума Ответить с цитированием
Старый 30.03.2010, 09:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Заранее кол-во папок и вложений не известно.
А меню будут вложенные как и папки или все в одну кучу скиданы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2010, 14:30   #3
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А меню будут вложенные как и папки или все в одну кучу скиданы?
тоже вложенные, если у папки есть подпапка, то и у меню будет подменю
Mag992 вне форума Ответить с цитированием
Старый 30.03.2010, 15:09   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Тогда я бы не заморачивлся с путями.
смотри - поиском проходишь по папке, выбирая все папки в ней (названия), создавая по ним элементы меню.
Каждому элементу назначаешь обработчик, в котором запускаешь опять поиск, но уже по папке, имя которой в кликнутом меню, и точно так же создаешь для него свои подпункты.
а чтоб узнать полный путь для определенного итема просто в цикле пройдись от кликнутого меню до его самого главного предка свойсвом Parent.

Понял идею?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2010, 15:28   #5
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

идею то я понял...не могли бы вы показать как это реализовать? Мне нужно слепить из двух процедур, представленных выше, одну?
И обьясните, как получить имя папки...а то при Menu.Caption:=SearchRec.Name делфя ругается

Последний раз редактировалось Mag992; 30.03.2010 в 16:03.
Mag992 вне форума Ответить с цитированием
Старый 30.03.2010, 16:06   #6
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

ПОлучилась вот такая ересь...как видно из кода создает кол-во менюшек по кол-ву папок в директории....но все менюшки с названием "1", как получить имя папки?

Код:
StartDir:=GetCurrentDir;
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
  if FindFirst(StartDir + '*.*', faAnyFile, SearchRec) = 0 then
    begin
      repeat
        Application.ProcessMessages;
        if ((SearchRec.Attr and faDirectory) = faDirectory) and
           ((SearchRec.Name <> '..') and (SearchRec.Name <> '.'))then
            begin
              ListBox1.Items.Add(StartDir + SearchRec.Name + '\');
              with (Sender as TpopupMenu) do
                begin
                    Menu:=TMenuItem.Create(Self);
                    Menu.Caption:='1';
                    Menu.OnClick:=MyClick;
                    Items.Insert(0, Menu);
                end;
              FauJIbl(StartDir + SearchRec.Name + '\', ListBox1.Items);
            end;
        until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
Уже понял) Menu.Caption:=SearchRec.Name;

Последний раз редактировалось Mag992; 30.03.2010 в 16:18.
Mag992 вне форума Ответить с цитированием
Старый 30.03.2010, 16:22   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Смотри:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N11: TMenuItem;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

 Procedure nanku(StartDir: String; Mask:string; menu:TMenuItem);
var
  SearchRec: TSearchRec; m:TMenuItem;
begin
  if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
    begin
      repeat
        if (SearchRec.Attr and faDirectory) = faDirectory then
          if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then
            begin
               m:=TMenuItem.Create(menu);
               m.Caption:=SearchRec.Name ;
               menu.Add(m);
              nanku(StartDir + SearchRec.Name + '\', Mask, m);
            end;
        until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  nanku('c:\temp','*',N11);
end;

end.
Уловил смысл?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2010, 16:33   #8
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

да да да)) спс большое! у мну была проблема, как впихнуть создание меню....пробовал как я выше написал, создавал только один уровень))
Ваш код робит)
Наверн думаю, если в процедуре прописать Const Mask= '*.*', ей хуже не станет)
Хотя....можно убрать вообще

Цитата:
Сообщение от Stilet Посмотреть сообщение
а чтоб узнать полный путь для определенного итема просто в цикле пройдись от кликнутого меню до его самого главного предка свойсвом Parent.
т.е. в MyClick процедуру впихнуть цикл фор итемс=0 ту итемс каунт, в котором проверяем есть ли в конечном подменю (подпапке) файлы и привязываем к шеллехекуте()?

Последний раз редактировалось Stilet; 30.03.2010 в 16:50.
Mag992 вне форума Ответить с цитированием
Старый 30.03.2010, 16:49   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ей хуже не станет)
Ну если станет сунь ей валидол под язык
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2010, 16:53   #10
Mag992
Пользователь
 
Регистрация: 16.02.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну если станет сунь ей валидол под язык
Да уж...скорее мне валидол, прибью зава заказчика....
упростил кодик) осталась самая мелочь) связать последние подменюшки и файлы, если таков имеются)
Mag992 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новых папок как в Windows=) Drakulov Общие вопросы Delphi 4 17.02.2010 21:35
создание PopupMenu Volkogriz Общие вопросы Delphi 1 22.05.2009 02:13
Создание папок. Alex Cones Общие вопросы Delphi 5 18.04.2009 15:32
Создание папок, Edit Серега1985 Помощь студентам 6 18.09.2008 16:00
Создание - Удаление папок (директорий) Kocapb Общие вопросы C/C++ 5 20.12.2007 09:28