Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Вниз

Открытие файла своей программой.   Найти похожие ветки 

 
vlad   (2013-02-07 14:44) [0]

Подскажите как отловить это момент в своей программе, чтобы выполнить нужные действие (Имеется введу "открыть с помощью" через правую кнопку мыши)


 
Медвежонок Пятачок ©   (2013-02-07 15:09) [1]

Как только тебя запустили - так значит момент этот и настал.


 
vlad   (2013-02-07 15:12) [2]


> Медвежонок Пятачок ©   (07.02.13 15:09) [1]


Это понятно. как это выглядет в программе?


 
Медвежонок Пятачок ©   (2013-02-07 15:13) [3]

Никак на выглядет.


 
Медвежонок Пятачок ©   (2013-02-07 15:14) [4]

Или выглядет так:
программа такая лежала леджала и вдруг ее запустили.
Она такая смотрит - ё! мне параметры в командной строке передали!
Етить колотить!


 
brother ©   (2013-02-07 15:21) [5]

программа запускается, создается ее главная форма, в ее OnCreate смотри, передали ли парамеры...


 
vlad   (2013-02-07 15:39) [6]


> brother ©   (07.02.13 15:21) [5]


Спасибо за подсказку. С одним файлом все понятно, а вот как быть если пытаться открыть сразу несколько файлов, в этом случае ParamCount все равно равен "1" (как в случае с MP3 плеером)


 
Ega23 ©   (2013-02-07 15:44) [7]


> Подскажите как отловить это момент в своей программе, чтобы
> выполнить нужные действие (Имеется введу "открыть с помощью"
> через правую кнопку мыши)

call notepat.exe test.txt


 
brother ©   (2013-02-07 15:46) [8]

http://www.cyberforum.ru/delphi/thread560198.html


 
Медвежонок Пятачок ©   (2013-02-07 15:50) [9]

а вот как быть если пытаться открыть сразу несколько файлов

Ты не поверишь!
Надо посмотреть что же там в этом параметре пришло.
Возможно там сразу несколько файлов.


 
vlad   (2013-02-07 15:58) [10]


> Медвежонок Пятачок ©   (07.02.13 15:50) [9]


Это возможно, а на самом деле там только первый.


> brother ©   (07.02.13 15:46) [8]



> Ega23 ©   (07.02.13 15:44) [7]


Это немного не то, я с вашей помощью разобрался что к чему.

Вопрос в том, что если выделено несколько файлов, то при "открыть с помошью" ParamCount все равно = 1, а ParamStr - содержит путь к только одному из файлов


 
vlad   (2013-02-07 15:59) [11]


> Надо посмотреть что же там в этом параметре пришло.

Ты сам смотрел?


 
Inovet ©   (2013-02-07 15:59) [12]

Ну или запустится несколько копий программы. При запуске проверять, есть ли уже запущенная и передавать ей параметр, самой завершаться. Это если именно такая логика нужна.


 
vlad   (2013-02-07 16:09) [13]


> Inovet ©   (07.02.13 15:59) [12]


Нет, ну вы извините, но вы не поняли вопрос - конечно понятно, что не хочется читать  всю ветку.


> Ну или запустится несколько копий программы.

Это вообще не то.

Копия только одна.

Действия такие:
1) заходим через проводник в папку
2) выделяем несколько файлов, (с одним файлом все работает)
3) через правую кнопку мыши ("открыть с помощье") открываем эти файлы через свою программу.

A ParamCount = 1, ParamStr - содержит ссылку только на один файл из выделенного набора.


 
Inovet ©   (2013-02-07 16:23) [14]

> [13] vlad   (07.02.13 16:09)

Всю читал. Открвть с помощью для нескольких файлов у меня нет, есть открыть, и открывается лоя txt несколько блокнотов.


 
Ega23 ©   (2013-02-07 16:23) [15]


> Вопрос в том, что если выделено несколько файлов, то при
> "открыть с помошью" ParamCount все равно = 1, а ParamStr
> - содержит путь к только одному из файлов


Я очень сильно подозреваю, что данном случае идёт передача нескольких файлов через "мультистринг" (или как там оно называется? Короче, когда есть буфер строк, каждая из которых оканчивается терминирующим нулём, а концом буфера служит ещё один терминирующий ноль).
Может Розыч поправит...


 
vlad   (2013-02-07 16:28) [16]


> Inovet ©   (07.02.13 16:23) [14]
>
> > [13] vlad   (07.02.13 16:09)
>
> Всю читал. Открвть с помощью для нескольких файлов у меня
> нет, есть открыть, и открывается лоя txt несколько блокнотов.
>


Ну это смотря кому какое поведение программы нужно - текстовые файлы можно открыть только в разных программах.
А вот, к примеру, набор MP3 файлов нужно открывать одной прогрммой, так чтобы они попали в список воспроизведение, а не открылся каждый одтельной копией MP3-плеера.


 
Inovet ©   (2013-02-07 16:29) [17]

> [15] Ega23 ©   (07.02.13 16:23)

Это какие-то неправильные параметры. Как из командной строки так сделать?


 
Ega23 ©   (2013-02-07 16:29) [18]

Розыч поправил, не так всё.
Если программа просто зарегистрирована под расширение (open a) и выбрано 10 файлов, то запустится 10 копий программы, каждая со своим.
Если программа зарегистрирована как ShellExtention, то тогда там унутре можно получить count файлов и дальше по индексу решать, что там с ними делать.


 
Inovet ©   (2013-02-07 16:29) [19]

> [16] vlad   (07.02.13 16:28)

На это я уже ответил.


 
sniknik ©   (2013-02-07 16:32) [20]

> набор MP3 файлов нужно открывать одной прогрммой, так чтобы они попали в список воспроизведение, а не открылся каждый одтельной копией MP3-плеера.
смотреть на параметр, если есть, и есть открытая копия, то посылать параметр ей, а самой закрываться...
не уверен, ни по моему они (плейры) так и делают...


 
vlad   (2013-02-07 17:09) [21]


> sniknik ©   (07.02.13 16:32) [20]


> не уверен, ни по моему они (плейры) так и делают...


Тот же Windows Media открывает все равно только один


 
брат Птибурдукова   (2013-02-07 17:23) [22]

Вот блин, хотел накатать злобный комментарий, а в [18] таки правильный вариант уже высказали.


 
Anatoly Pogoretsky   (2013-02-07 17:47) [23]

> vlad  (07.02.2013 16:09:13)  [13]

Если отмечено несколько
файлов то никакого
“открыть с помощью” не
будет.


 
vlad   (2013-02-07 17:49) [24]



а старую копию как закрывать?
begin
 HM := OpenMutex(MUTEX_ALL_ACCESS, false, "CdpApp");
 if (HM <> 0) then
 begin
   ShowMessage("Уже запушено");
  //КАК ЗДЕСЬ ЗАКРЫТЬ "СТАРУЮ КОПИЮ"
 end;

 if HM = 0 then
   HM := CreateMutex(nil, false, "CdpApp");
end;



 
brother ©   (2013-02-07 17:56) [25]

послать окну wm_close


 
vlad   (2013-02-07 18:07) [26]


> brother ©   (07.02.13 17:56) [25]

А окно старое как искать? через FindWindow?


 
brother ©   (2013-02-07 18:17) [27]

найми программиста...


 
vlad   (2013-02-07 18:46) [28]


> brother ©   (07.02.13 18:17) [27]
>
> найми программиста...


Хоть нанимай, хоть нет. Кроме как FindWindow, метода я не знаю.
Но так можно закрыть не то что надо.


 HM := OpenMutex(MUTEX_ALL_ACCESS, false, "CdpApp");
 if (HM <> 0) then
 begin
   SendMessage((FindWindow(nil, "MyProgram")), WM_CLOSE, 0, 0);
   //ShowMessage("Уже запущено");
 end;


 
Rouse_ ©   (2013-02-07 19:35) [29]


> vlad   (07.02.13 17:49) [24]
> а старую копию как закрывать?

Если ты работаешь без ShellExt то старую копию закрывать не нужно. Нужно найти текущий экземпляр программы и ему отправить уведомление о том что нужно обработать новый файл, после чего завершить свой процесс.

Вариантов поиска оригинального экземпляра ну просто море,
на вскидку некий уникальный класс окна который будет в единственном экземпляре на всю систему + FindWindow или именованный MMF в котором прописан хэндл окна принимающий уведомления от чужих процессов.
В обоих случаях SendMessage + WM_COPYDATA где и передаем данные.
Еще вариант - именованные каналы (пайпы), через которые так же можно перегнать данные.
Да и вообще вариантов на коленке можно целую кучу накидать.


 
Rouse_ ©   (2013-02-07 19:39) [30]

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

Старт сотни процессов только для того чтобы передать главному экземпляру некие данные - ни разу не легкая прогулка для системы и тормоза могут наблюдаться даже на достаточно производительных машинах.


 
Плохиш ©   (2013-02-07 19:42) [31]


> vlad   (07.02.13 17:49) [24]
> а старую копию как закрывать?

Надо в старую передать полученый файл и новый экземпляр программы закрыть.

А так поддерживаю совет о найме программиста.


 
Плохиш ©   (2013-02-07 19:46) [32]


> Anatoly Pogoretsky   (07.02.13 17:47) [23]
> > vlad  (07.02.2013 16:09:13)  [13]
>
> Если отмечено несколько
> файлов то никакого
> “открыть с помощью” не
> будет.

А ведь действительно...


 
Rouse_ ©   (2013-02-07 19:53) [33]


> Плохиш ©   (07.02.13 19:46) [32]
> А ведь действительно...

Угу, и Enter в жесткую блокируется :))


 
Inovet ©   (2013-02-07 21:27) [34]

> [24] vlad   (07.02.13 17:49)
> а старую копию как закрывать?

Тебе 2 (два) раза сказали - закрывать новую. Писатель не читатель?


 
Inovet ©   (2013-02-07 21:29) [35]

> [29] Rouse_ ©   (07.02.13 19:35)

Уже 4 раза сказали.


 
Inovet ©   (2013-02-07 21:31) [36]

> [31] Плохиш ©   (07.02.13 19:42)

5 раз. Теперь дойдёт.


 
Inovet ©   (2013-02-07 21:33) [37]

> [32] Плохиш ©   (07.02.13 19:46)
> А ведь действительно...

В общем так: или автор не читает сообщения, или темнит, или что-то ещё, не буден это называть.


 
имя   (2013-02-07 21:47) [38]

Удалено модератором


 
Rouse_ ©   (2013-02-07 22:03) [39]


> Inovet ©   (07.02.13 21:29) [35]
> Уже 4 раза сказали.

Лучше 1 раз разжевать, чем 4 раз рассказать :)


 
имя   (2013-02-07 22:07) [40]

Удалено модератором
Примечание: может лучше сразу бан по IP, как думаешь?


 
brother ©   (2013-02-08 04:15) [41]

чтож всех на скрытность то тянет?
мои наброски, разбирайся!
function TProgramForm.SafeRemoval(drive: char): boolean;
var
 sh : SHFILEOPSTRUCT;

 FreeBytesAvailableToCaller: TLargeInteger;
 FreeSize: TLargeInteger;
 TotalSize: TLargeInteger;

 f: file;
 NumWritten: Integer;
 Buf: pointer;
 bufSize: Integer;
 BytesWrite: TLargeInteger;
begin
 result:= False;
 StopSafeRemoval:= False;

//  ShowMessage("Удаление всего содержимого диска, это может занять длительное время, ждите...");

 // Удаляем ВСЕ содержимое с устройства!
 AddLog("Удаление всего содержимого диска, ждите...");
 sh.Wnd := Application.Handle;
 sh.wFunc := FO_DELETE;
 sh.pFrom := PAnsiChar(drive + ":\*.*");
 sh.pTo := nil;
 sh.fFlags := FOF_NOCONFIRMATION + FOF_SILENT+ FOF_NOERRORUI;
 sh.fAnyOperationsAborted := False;
 sh.hNameMappings := nil;
 sh.lpszProgressTitle := nil;
 if SHFileOperation(sh) <> 0 then
 begin
  AddLog("Не удалось(файлы/папки заняты другим приложением?)");
  //Exit;
 end
 else
   AddLog("Ok");

 // узнаем кол-во свободного места на диске
 if not GetDiskFreeSpaceEx(PChar(drive + ":\"), FreeBytesAvailableToCaller, Totalsize, @FreeSize) then
 begin
   AddLog("Ошибка получения свободного места: " + GetLastErrorText);
   exit;
 end
 else
   AddLog("Свободное место на диске: " + IntToStr(FreeBytesAvailableToCaller) + " байт");

//  FreeBytesAvailableToCaller:= {1073741824;} 2147483648;

 // Создаем файл с пустым содержимым по размеру всего диска
 AddLog("Создание временного файла, ждите...");
 BufSize := 1048576; // 1МБ
 GetMem(buf, BufSize);
 //Gauge1.MaxValue:= FreeBytesAvailableToCaller;
 BytesWrite:= 0;
 try
   assignfile(f, drive + ":\tmp.$$$");
   rewrite(f, 1);
   while (BytesWrite+bufSize <= FreeBytesAvailableToCaller) and (not StopSafeRemoval) do
   begin
     BlockWrite(f, Buf^, BufSize, NumWritten);
     Inc(BytesWrite, NumWritten);
//      Gauge1.Progress:= BytesWrite;
     application.ProcessMessages;
   end;
 except
   FreeMem(Buf);
   CloseFile(f);
 end;
 if StopSafeRemoval then
 begin
   AddLog("Отменено пользователем!");
   FreeMem(Buf);
   CloseFile(f);
   Exit;
 end;
 // если в конце не дозаписан хвост меньше bufSize дозапишем его
 if BytesWrite < FreeBytesAvailableToCaller then
 begin
   BufSize := FreeBytesAvailableToCaller-BytesWrite;
   FreeMem(Buf);
   GetMem(buf, BufSize);
   BlockWrite(f, Buf^, BufSize, NumWritten);
 end;
 FreeMem(Buf);
 CloseFile(f);

 AddLog("Ok");

{  if DeleteFile(drive + ":\tmp.$$$") then
   AddLog("Временный файл успешно удален")
 else
 begin
   AddLog("Ошибка удаления временного файла");
   exit;
 end;}

 result:= True;
end;


 
brother ©   (2013-02-08 04:18) [42]

упс, промахнулся топиком)


 
vlad   (2013-02-08 12:23) [43]


> Rouse_ ©   (07.02.13 22:03) [39]
>
>
> > Inovet ©   (07.02.13 21:29) [35]
> > Уже 4 раза сказали.
>
> Лучше 1 раз разжевать, чем 4 раз рассказать :)


Так уж сложилось, что нужно именно закрывать старую копию, а не передавать в старую копию новые параметры

Один момент не понятен и все(

procedure TMyForm.FormCreate(Sender: TObject);
begin
 //почему эта команда не закрывает старую копию?
 SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
 //а эта работает без проблем?
 SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


 
Ega23 ©   (2013-02-08 12:39) [44]


> Так уж сложилось, что нужно именно закрывать старую копию,
>  а не передавать в старую копию новые параметры


Просто любопытно: а почему? Почему не передать новые данные в старую копию, с расчётом на то, что она бросит текущие данные и займётся новыми?


 
vlad   (2013-02-08 12:42) [45]


> Ega23 ©   (08.02.13 12:39) [44]


ну а почему бы не закрыть старую?


 
Rouse_ ©   (2013-02-08 12:49) [46]

Ну закроешь ты старую, а смысл?


 
vlad   (2013-02-08 12:54) [47]


> Rouse_ ©   (08.02.13 12:49) [46]
>
> Ну закроешь ты старую, а смысл?


Да в тот то и дело что не закрою.
A где грабли не пойму:
procedure TMyForm.FormCreate(Sender: TObject);
begin
//почему эта команда не закрывает старую копию?
SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
//а эта работает без проблем?
SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


Ну нужно так и все.


> > brother ©   (07.02.13 18:17) [27]
> >
> > найми программиста...


Ребята дорогие, я специально написал в раздел "начинающим".


 
Ega23 ©   (2013-02-08 13:00) [48]


> ну а почему бы не закрыть старую?

Т.е. принципиальных причин нет, я правильно понял?
Почему плохо закрывать старую:
Во-первых, ты её найти не можешь... :)))    (шутка)
Во-вторых, вот она что-то там такое делает, шуршит вовсю, пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть, например, час. А тут её - фигак, и топором рубят. Не айс.


 
vlad   (2013-02-08 13:04) [49]


> Во-первых, ты её найти не можешь... :)))    (шутка)


Диспетчер задач значит находит, а свою копию найти не может.


> Во-вторых, вот она что-то там такое делает, шуршит вовсю,
>  пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть,
>  например, час. А тут её - фигак, и топором рубят. Не айс.
>


Да черт с ней.


 
Ega23 ©   (2013-02-08 13:23) [50]


> Диспетчер задач значит находит, а свою копию найти не может.

Тебя предупреждали. А ты не слушаешь.
Ненаказуемо, но "будет путь его тернистый долог".


 
Anatoly Podgoretsky ©   (2013-02-08 14:45) [51]


> упс, промахнулся топиком)

Стреляй из лука


 
брат Птибурдукова   (2013-02-08 14:54) [52]


> фигак, и топором рубят
WM_CLOSE — таки мелковато для топора :-)


 
Плохиш ©   (2013-02-09 23:31) [53]


> vlad   (08.02.13 13:04) [49]

Закрыть старую копию ничем не отличается от передать в неё чего-то. Решений в мировой помойке сколько угодно, даже для копи/паста, даже на этом форуме можно найти несколько тем. Но учитывая, что обсуждение перевалило за полсотни, программиста нанять будет безопасней и дешевле.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.003 c
11-1248521534
alex649
2009-07-25 15:32
2013.11.10
TKOLMemo - как отобразить текст в окне не с 1 строки


2-1359980332
Александр_2012
2013-02-04 16:18
2013.11.10
как найти и подсветить компоненты


15-1369718827
Interrupted++
2013-05-28 09:27
2013.11.10
Файлы на харде


15-1369487360
О-Сознание
2013-05-25 17:09
2013.11.10
Плавно преобразовать один цвет в другой.


2-1360233890
vlad
2013-02-07 14:44
2013.11.10
Открытие файла своей программой.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский