![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хелп!! Как из одной моей проги перетащить текст в другу мою прог [D7, XP]
Hero © (2007-04-23 04:16:00)запустили второй раз мою прогу нужно передать paramstr(1) первой проге
Hero (2007-04-25 10:18:00) [1]sniknik © (25.04.07 09:13) [32]
Да вот всетаки решил скомпилить твой код и действительно все работает так как надо
извините что заморочил голову всем :)
sniknik (2007-04-25 09:13:00) [2]чтобы система записала в параметры 4 файла нужно буквально выполнить действия одного из описанных в [18] варианта... т.е. выделить блок из 4х файлов "схватить" этот блок мышкой и перетянуть на лежащий рядом (для простоты) exe файл программы. система запустит эту программу с 4мя параметрами.
делать это надо в проводнике (за всякие "фары" и "тотал командеры" не скажу).
> вы уж простите мое делитанство так скать.
дилетанство не позволяет вам скомпилить гототовый, на блюдечке с голубой каемочкой, код? в котором это все учтено и проверь, а после того как убедился что все так и есть разобраться в нем?
ну тогда ты ошибся профессией... впору думать о карьере дворника.
почему твояпрограмма, открывается (судя по всему для другого варианта описанного в [18]) 2 раза с одним параметром и 2 раза без них (хотя должно 4 раза с 1-м), это тебе лучше знать (мой пример лишен этого недостатка, легко проверить), я же полагаю что это последствия 17й строки при работе с файлом для передачи этих параметров. ты попросту чтото перетираеш изза медленности файлов. которые гораздо медленнее, на порядки, чем тот же поиск окна о котором предупреждал... и если с поиском ты только возможно получишь глюк, умудришся получить 2 одновременно работающие копии то с файлами гарантировано (надо специально чтото делать чтобы синхронизировать, задержки например ставить).
> чтобы открывалася одна моя программа , где paramcount (в данном случае) равнялась 4-м
или ты хочеш чтобы оно запускалось так даже для случая когда система запускает 4 экземпляра проги? ну это тогда к Биллу, я же уже говорил кому надо подстраиваться по то что есть...
> Сергей М. © (24.04.07 14:59) [22]
> Да спасибо, буду читать
вообщето, то что он там советует это совсем из другой "оперы", почитать конечно полезно (любые знания не повредят), но для твоей задачи решение через COM /интерфейсы можно рассматривать только в качестве казуса (как вырезание гланд через заднепроходное отверстие)
и к тому же они не изменят способов запуска проги системой, будут теже 2 варианта, оно только позволит тебе сделать передачу по другому и все. (если вообще справишься, после непонимания готового, простого кода, я в этом сомневаюсь)
Hero (2007-04-25 04:34:00) [3]sniknik © (24.04.07 15:36) [27]
Ой чавойто я не пойму, вы уж простите мое делитанство так скать.
почамуто при одновременномоткрывании 4-х файлов mp3 (мы опускаем отлавливание окон ) открывается 4 моей программы (плеера) с всего лишь с 2 парааметрами paramstr(0) = application.exename и paramstr(1) = путь\имя файла одного из выделенных файлов.
Извиние , а как же так мне умудрится господин sniknik © , чтобы открывалася одна моя программа , где paramcount (в данном случае) равнялась 4-м
Сергей М. © (24.04.07 14:59) [22]
Да спасибо, буду читать
Сергей М. (2007-04-24 16:23:00) [4]
> sniknik © (24.04.07 16:15) [29]
> "открыть как".
Про "как" у автора речи не идет.
У него просто про "Открыть" идет речь.
Впрочем, то не столь важно.
> не можно и COM обьектом прогу оформить
"Не можно" <> "не нужно"
))
sniknik (2007-04-24 16:15:00) [5]> Это как раз автор использует "посредником" ком.строку, а не я ему это предлагаю)
ком.строку это командная строка(?) часть которой параметр, а не COM, автор не может ее не использовать т.к. система так передает при обсуждаемых вариантах, с выбором нескольких файлом и "открыть как".
а я в [25] про итерфейсы и COM..., не можно и COM обьектом прогу оформить и передачу на интерфейсах сделать но это както черезчур. и следом в [27] воспринял как продолжение про COM и интерфейсы. а про них ты советуешь.
Сергей М. (2007-04-24 15:49:00) [6]
> ты же это советуешь
Ясоветую ?!
Да ты что ! Да бог с тобой).. Где ты это увидел ?)
Это как раз авториспользует "посредником" ком.строку, а не я ему это предлагаю)
sniknik (2007-04-24 15:36:00) [7]> Ну а какой же идиот будет передавать список в параметрах ком.строки ?)
... мммммм. ты?
ты же это советуешь, или это как типа диверсии направить на путь которым сам не пользуешься?
итак пример:
замечания
ListBox1 растянут на всю форму, считаем что это наш "плейлист"
названия типа формы должны быть "буква в букву", мы же по нему ищем.
и при запуске из под дельфи модуль Unit1 с формой должен быть закрыт, форма созданная отладчиком тоже находится... но обработки приема там нет, будет мешаться. вообще лучше скомпилить и запускать готовый exe, с закрытой дельфей (тогда точно не помешается).
program Project1;
uses
Forms,
Windows,
Messages,
Unit1 in 'Unit1.pas' {GetDataForm};
{$R *.res}
var
Hndl: THandle;
i: integer;
function SendMessData(TrgWnd, SrcWnd: THandle; Dt: integer; const St: string): integer;
var
CDate: TCopyDataStruct;
begin
with CDate do begin
cbData:= Length(St) + 1;
if cbData = 1
then Result:= 0
else begin
dwData:= Dt;
lpData:= @St[1];
Result:= SendMessage(TrgWnd, WM_COPYDATA, SrcWnd, integer(@CDate));
end;
end;
end;
begin
Hndl:= FindWindow('TGetDataForm', nil);
if Hndl > 0 then begin //есть окно, мы вторые (проверка первого запуска по окну медленная! только для примера, в реале лучше это делать после проверки по семафору)
if ParamCount = 0
then SetForegroundWindow(Hndl) //"подымаем" первую копию
else
for i:= 1 to ParamCount do //передаем пофайлово
SendMessData(Hndl, 0, i, ParamStr(i));
Exit; //этой копии больше делать нечего
end;
Application.Initialize;
Application.CreateForm(TGetDataForm, GetDataForm);
Application.Run;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TGetDataForm = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
procedure doGetDate(var Message: TMessage); message WM_COPYDATA;
end;
var
GetDataForm: TGetDataForm;
implementation
{$R *.dfm}
procedure TGetDataForm.doGetDate(var Message: TMessage);
begin
ListBox1.Items.Add(PChar(PCopyDataStruct(Message.LParam).lpData)); //ловим, считаем что в любом случае посылка = 1 файлу (т.е. без разбора строк)
end;
procedure TGetDataForm.FormCreate(Sender: TObject);
var i: integer;
begin
for i:= 1 to ParamCount do //первую копию тоже могут с параметрами запустить...
ListBox1.Items.Add(ParamStr(i));
end;
end.
p.s. ну разве сложно?
Сергей М. (2007-04-24 15:08:00) [8]
> sniknik © (24.04.07 15:06) [25]
Ну а какой же идиот будет передавать список в параметрах ком.строки ?)
sniknik (2007-04-24 15:06:00) [9]> Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.
это... чето вы мудрите батенька, простейшую в общем то вещь так запутали... (сам не понял к чему тут COM/интерфейсы присобачивать...)
... ммм. ладно, счас пример оформлю.
Hero (2007-04-24 15:03:00) [10]
Сергей М. © (24.04.07 14:59) [22]
> а по ширша подсказачку.......никак?
Ну отчего ж ?)
Еще "как")
Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.
тобишь искать в той папке в которой юзерь выделил файлы выделенные файлы так?
sniknik (2007-04-24 15:03:00) [11]> дык paramcount = 1 как никрути
в одном из вариантов да... а ты то сам трудишься проверять то что тебе говорят?
> 0 в случае если просто запускаешь exe`шник
нет не просто, имхо, но если копия вторая то при "пустом" запуске нужно "поднять" первую на передний план, и также завершисся как и с параметрами.
второго запуска в принципе не должно быть (вернее не доводить до создания формы), т.к. раз у тебя есть передача в первую копию то вторая запущенная добавит неоднозначности, куда будет посылать файлы третья копия с параметрами?...
Сергей М. (2007-04-24 14:59:00) [12]
> а по ширша подсказачку.......никак?
Ну отчего ж ?)
Еще "как")
Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.
Hero (2007-04-24 14:41:00) [13]
sniknik © (24.04.07 14:16) [20]
даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.
дык paramcount = 1 как никрути (0 в случае если просто запускаешь exe`шник)
Сергей М. © (24.04.07 14:13) [19]
...Задумайся над этим)
иииии.........! а по ширша подсказачку.......никак?
sniknik (2007-04-24 14:16:00) [14]даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.
принимающая же тогда (первая запущенная), просто ловит названия по одному, и добавляет в плейлист.
Сергей М. (2007-04-24 14:13:00) [15]
> выделяет в папке с музыкой файлы и правой кнопкой открывает
.. и при этом внезависимости от кол-ва выбранных файлов открывает юзер только тот файл, на который смотрел курсор мыши в момент выполнения меню "Открыть".
Задумайся над этим)
sniknik (2007-04-24 14:11:00) [16]> это я уже пробовал работает
> но не так как мне нада
а вот как тебе нада система не спрашивает, подстраиваться нужно тебе под то что есть...
> ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится
потрудился, все очень даже хорошо получается... есть всего лиш два варианта... (всего 2 !!! счастье то какое, халява), в первом приходит строка с перечисленными файлами для открытия (если выделить блок файлов и перетащить на ярлык программы) во втором все отмеченные выдаются программе по одному разным копиям (выделить блок и по правой кнопке выбрать "выполнить с помощью").
что в первом случае - разбор строки, что во втором - последовательное по штучное добавление в плейлист (ну и что что посылают разные копии?), не вижу никаких проблем в реализации.
Hero (2007-04-24 13:43:00) [17]ну в самом то деле читайте вниметельней [9]
это я уже пробовал работает
но не так как мне нада
дело в том что при открывании нескольких файлов mp3 как это делает юзер выделяет в папке с музыкой файлы и правой кнопкой открывает при таком коде как вы мне подсказали это работает медленно и вообще не понять чо получается причем первой запущенной в плейлист не все "выделенное" попадает.
вот я и спрашиваю есть ли иной способ кроме как : искать хэндл и посылать message этому хэндлу и потом халт
ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится
sniknik (2007-04-24 12:22:00) [18]> а вот как идентифицировать окно-адресат - это уже иной вопрос.
> нахожу handle вот таким способом
FindWindow видимо слишком прост для тебя... не дает как следует "попариться", прочуствовать суть программирования... ;)
Сергей М. (2007-04-24 11:05:00) [19]
> Hero © (24.04.07 10:45) [14]
> не ужель и впрям из пушки придется по воробьям?
Зачем ? Из пушки, конечно же, не надо , тем более по воробьям)
Решение тебе подсказано в [3], а вот как идентифицировать окно-адресат - это уже иной вопрос.
Hero (2007-04-24 10:45:00) [20]Сергей М. © (24.04.07 09:55) [10]
> т.к. я живу на камчатке только что открыл эту ветку
Однако, прелюбопытная причинно-следственная свящь)
А если по делу?
не ужель и впрям из пушки придется по воробьям?
пробовал реестр копать по поводу того как енто делает WMP никаких существенных результатов мне это не дало.
может подскажете а? Ну.... если знаете конечно ;)