Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 21
1

Прикрепление и запуск файлов из приложения

09.11.2014, 11:29. Просмотров 1047. Ответов 8
Метки нет (Все метки)

Доброго времени суток, форумчане!

Передо мной в данный момент стоит задача реализации возможность прикреплять файлы к приложению и впоследствии запускать их из него посредством ShellExecute. Если быть более точным, то в приложении должен храниться не сам внешний файл а ссылка на него (путь к нему). Поясню какие есть идеи и что сделано на данный момент - надеюсь станет понятней.
1. Итак, есть компонент Memo (вообще говоря на форме DBMemo и все это связано с БД, но забудем об этом, потому что тема к реализации самой БД не имеет отношения), в котором строки - полный путь к файлу, например
Название: Безымянный.png
Просмотров: 57

Размер: 1.3 Кб
2. Есть компонент ButtonGroup, кнопки в котором создаются динамически при добавлении строки в Memo
Код для добавления строки в Memo и создания кнопок в ButtonGroup
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TfEdit1.Button3Click(Sender: TObject); //Button3 - кнопка "Прикрепить"
begin
fMain.ClientDataSet.Edit;
fEdit1.OpenDialog1.InitialDir := GetCurrentDir;
if fEdit1.OpenDialog1.Execute
  then begin fEdit1.DBMemo1.Lines.Add(fEdit1.OpenDialog1.FileName);
  fEdit1.ButtonGroup1.Items.Add;
  fEdit1.ButtonGroup1.Items[fEdit1.ButtonGroup1.Items.Count-1].Caption:=ExtractFileName(fEdit1.OpenDialog1.FileName);
  fEdit1.ButtonGroup1.Items[fEdit1.ButtonGroup1.Items.Count-1].OnClick:=ButtonGroup1Items0Click;
  fEdit1.ButtonGroup1.Items[fEdit1.ButtonGroup1.Items.Count-1].Hint:=fEdit1.OpenDialog1.FileName
  end;
end;
Как вы видите, свойство Hint я использую для хранения пути к файлу (ShowHint=false)


Вот здесь и начинаются проблемы, т.к. на обработчик OnClick динамически создаваемых кнопок необходимо повесить процедуру содержащую функцию ShellExecute. Но как дать понять процедуре, какая именно кнопка была нажата?
Код процедуры, которую надо повесить на Onclick каждой кнопки
Delphi
1
2
3
4
procedure TfEdit1.ButtonGroup1Items0Click(Sender: TObject);
begin
ShellExecute (handle,'open',???,nil,nil,SW_SHOWNORMAL); //Вместо ??? надо как-то передать нужный путь, который зависит от конкретно нажатой кнопки и содержится в свойстве Hint
end;
Я понимаю мой метод реализации и код способен вызвать дьявола очень оригинален, поэтому готов выслушать как варианты оптимизации моего метода прикрепления файлов (с помощью Memo и ButtonGroup), так и ваши собственные идеи.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 11:29
Ответы с готовыми решениями:

Запуск приложения и добавление всех выбранных файлов в listbox
как сделать так, чтобы при выделении нескольких файлов запускалось мое приложение и все выбранные...

Прикрепление .exe файла к проекту c# и его запуск
Здравствуйте, имеется проект на c# и .exe, нужно .exe засунуть в проект c# и по нажатии на кнопку в...

прикрепление файлов
Привет! Такой вопрос. Необходимо прикрепить некие файлы. Подскажите с чего начать

Прикрепление файлов к комментариям
Как реализовать что бы пользователь мог прикреплять файлы к комментарию ?

8
58 / 48 / 25
Регистрация: 17.12.2013
Сообщений: 218
09.11.2014, 11:40 2
Delphi
1
ShellExecute (handle,'open',TButton(Sender).Hint,nil,nil,SW_SHOWNORMAL)
0
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 21
09.11.2014, 12:00  [ТС] 3
Это если бы у меня были просто кнопки, а у меня компонент ButtonGroup, т.е Sender=TButtonGroup насколько я понял.
В моем случае можно так:
Delphi
1
ShellExecute (handle,'open',PChar(TButtonGroup(sender).Items[1].Hint),nil,nil,SW_SHOWNORMAL);
Но вместо Items[1] должен быть не первый, а Item, зависящий от нажатой кнопки. Причем, Item`ы - не кнопки, у них нет свойства Tag
0
58 / 48 / 25
Регистрация: 17.12.2013
Сообщений: 218
09.11.2014, 14:37 4
jeff3514, вы не правы.
На стадии проектирования создайте 1 кнопку в вашем TButtonGroup, сделайте ей обработчик, заполните его кодом и удалите кнопку. Процедура останется. Что-то типа этого:
Delphi
1
2
3
4
procedure TfEdit1.ButtonGroup1Items0Click(Sender: TObject);
begin
  ShellExecute (handle,'open',PChar(TButtonGroupItem(Sender).Hint),nil,nil,SW_SHOWNORMAL);
end;
Этот обработчик и назначайте всем итемам.

Добавлено через 3 минуты
Sender=TButtonGroupItem
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
09.11.2014, 15:35 5
Не совсем по теме, но переводить DataSet в режим редактирования следует, только если будут вноситься изменения, а после - подтверждать внесенные изменения.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
  OpenDialog1.InitialDir := GetCurrentDir;
  if OpenDialog1.Execute then
  begin
    fMain.ClientDataSet.Edit;
    DBMemo1.Lines.Add(OpenDialog1.FileName);
    fMain.ClientDataSet.Post;
    with ButtonGroup1.Items.Add do
    begin
      Caption := ExtractFileName(OpenDialog1.FileName);
      OnClick := ButtonGroup1Items0Click;
      Hint    := OpenDialog1.FileName;
    end;
  end;
0
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 21
09.11.2014, 15:51  [ТС] 6
FIL, спасибо, подправлю.
KMSNasgool, я бы уже очень хотел быть не прав, но указанным вами способом обратиться не удастся ("Undeclared identificer"), потому что такого класса (тут уж если что, извините, могу путать термины ) нет.
Я уже пробовал обращаться через TGrpButtonItem, который вы видимо и имели ввиду.
Но при этом почему-то свойство Hint пустое.
Вот пример кода
Delphi
1
2
3
4
5
procedure TfEdit1.ButtonGroup1Items0Click(Sender: TObject);
begin
ShellExecute (handle,'open',PChar(TGrpButtonItem(Sender).hint),nil,nil,SW_SHOWNORMAL);
Showmessage(TGrpButtonItem(Sender).Hint)
end;
SwhoMessage я делаю для отладки, т.е глянуть что содержится в Hint при таком обращении. Собственно благодаря ShowMessage и удалось установить что Hint пустой:
Название: Безымянный.png
Просмотров: 47

Размер: 7.0 Кб

P.S. Процедуру создавал именно таким способом, который вы описали.
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
09.11.2014, 16:29 7
Лучший ответ Сообщение было отмечено jeff3514 как решение

Решение

У TButtonGroup есть событие OnButtonClicked, в обработчик которого вторым параметром передается индекс нажатой кнопки.
Delphi
1
2
3
4
procedure TForm1.ButtonGroup1ButtonClicked(Sender: TObject; Index: Integer);
begin
  ShowMessage(TButtonGroup(Sender).Items[Index].Hint);
end;
2
58 / 48 / 25
Регистрация: 17.12.2013
Сообщений: 218
09.11.2014, 16:35 8
Нашел я решение для вас, может и не идеальное но работает.
Объявляю в классе формы поля:
Delphi
1
2
3
  private
    { Private declarations }
    Xi, Yi: Integer;
Делаю обработчик OnMouseMove для TButtonGroup:
Delphi
1
2
3
4
5
6
procedure TfEdit1.ButtonGroup1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Xi := X;
  Yi := Y;
end;
И вот собственно обработчик нажатия кнопки:
Delphi
1
2
3
4
procedure TfEdit1.ButtonGroup1Items0Click(Sender: TObject);
begin
  ShellExecute (handle,'open',PChar(ButtonGroup1.Items[ButtonGroup1.IndexOfButtonAt(Xi, Yi)].Hint),nil,nil,SW_SHOWNORMAL);
end;
Добавлено через 3 минуты
FIL, вот я костыль то придумал =) Просто никогда с этим компонентом не работал. А все так просто...

Добавлено через 41 секунду
Посыпаю голову пеплом =)
1
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 21
09.11.2014, 16:48  [ТС] 9
FIL, Спасибо вам огромное!!!!!
Даже не верится что все так было просто!
KMSNasgool, вам тоже спасибо большое за помощь, но, костылей уже мне хватит в программе, к примеру тот же метод реализации (подозреваю, что где-то в глубинах Delphi есть более простой) еще тот костыль
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2014, 16:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Форма с прикрепление файлов
Помогите разобраться с прикреплением файлов. Пыталась найти ответ в интернете, но толком ничего не...

Прикрепление файлов к документам
Здравствуйте. Нужно организовать прикрепление файлов(N-ое кол-во) любого формата к документу....

Сообщения + прикрепление файлов
Имеется личный кабинет, при заходу на чужую страничку можно отправить сообщение. Собственно как...

Прикрепление файлов к проекту MS VS 2013
В общем такое дело, есть у меня приложение реализованное на С++, которое использует некоторые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.