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

Вниз

Хелп!! Как из одной моей проги перетащить текст в другу мою прог   Найти похожие ветки 

 
Hero ©   (2007-04-23 04:16) [0]

запустили второй раз мою прогу нужно передать paramstr(1) первой проге


 
Loginov Dmitry ©   (2007-04-23 07:47) [1]

Способов масса.
Один из наиболее простых - сохранить текст во временном текстовом файле, и уведомить об этом первую прогу с помощью SendMessage().


 
Hero ©   (2007-04-23 09:36) [2]

Да спасибо. Я ужо дотумкался до ентого


 
Leonid Troyanovsky ©   (2007-04-23 09:49) [3]


> Loginov Dmitry ©   (23.04.07 07:47) [1]

> текстовом файле, и уведомить об этом первую прогу с помощью
> SendMessage().

Если уж SendMessage, то WM_COPYDATA и никаких файлов.

--
Regards, LVT.


 
oxffff ©   (2007-04-23 10:07) [4]


> Hero ©   (23.04.07 04:16)  
> запустили второй раз мою прогу нужно передать paramstr(1)
> первой проге


По электронной почте.


 
Hero ©   (2007-04-23 13:46) [5]

oxffff ©   (23.04.07 10:07) [4] не смешно
возникла другая промблема
нахожу handle вот таким способом

Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
  IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0) then
  BEGIN
  GetWindowText (Wnd, buff, sizeof (buff ));
  IF StrPas (buff) = application.Title THEN sendmessage(wnd,1025,0,0).......и т.д.

есть обработчик события

procedure GetMes(var mes :TMessage); message 1025;

однако он не срабатывает так как по моему мнению wnd который находит моя прога есть хдл приложения а не формы в частности mainform и что делать далее по этому поводу незнаю


 
Hero ©   (2007-04-23 17:15) [6]

Неужели нет решения этой проблеммы???


 
novill ©   (2007-04-23 17:32) [7]

А ты уверен, что ты его посылаешь? :)


 
novill ©   (2007-04-23 17:33) [8]

Ну и если посылаешь то почему окну с application.Title, а не mauinform.caption


 
Hero ©   (2007-04-24 04:25) [9]


novill ©   (23.04.07 17:33) [8]

Ну и если посылаешь то почему окну с application.Title, а не mauinform.caption


:))) дык я уже давно енто сделал только никак не мог допетрить почему он 2 раза находит мою прогу пока не дотумкался что он находит окно пректа :))))))
вобчем все у меня получилось только результат меня не радует. Суть вот в чем:
я сделал красивенький медиаплеер и все меня в нем устравает, но вот людь который пользуется моим плеером делает так:
выделяет несколько файлов допустим mp3 и правой кнопкой открывает но запускается сразу несколько плееров . В реестре прописано так:
mp3 по умолчанию (мyplayer)

myplayer
 shell
    open (по умолчанию = воспроизвести)
      command (поумолчанию "C:\Program files\myplayer\player.exe" "%L")

вот я и подумал что при повторном открытии передать paramstr(1)
после получения hwnd записываю paramstr(1) в файл на жестком
после чего postmessage(hwnd,my_msg,0,0);

все это прекрасно работает когда тюкаешь по одному файлу, но когда все одновременно получается белеберда

может есть способ другой, подскажите полалуйста

P.S. т.к. я живу на камчатке только что открыл эту ветку


 
Сергей М. ©   (2007-04-24 09:55) [10]


> т.к. я живу на камчатке только что открыл эту ветку


Однако, прелюбопытная причинно-следственная свящь)


 
StriderMan ©   (2007-04-24 10:04) [11]

по сокету через localhost. (TServerSocket, TClientSocket)


 
Сергей М. ©   (2007-04-24 10:06) [12]


> StriderMan ©   (24.04.07 10:04) [11]


> по сокету


Не жирно ли будет - из пушки да по воробьям ?)


 
StriderMan ©   (2007-04-24 10:14) [13]


> Сергей М. ©   (24.04.07 10:06) [12]
> Не жирно ли будет - из пушки да по воробьям ?)

делов на 5 минут, зато заклад на будущую распределенность ;)

а вообще в шутку конечно.


 
Hero ©   (2007-04-24 10:45) [14]

Сергей М. ©   (24.04.07 09:55) [10]

> т.к. я живу на камчатке только что открыл эту ветку

Однако, прелюбопытная причинно-следственная свящь)

А если по делу?
не ужель и впрям из пушки придется по воробьям?
пробовал реестр копать по поводу того как енто делает WMP никаких существенных результатов мне это не дало.

может подскажете а? Ну.... если знаете конечно ;)


 
Сергей М. ©   (2007-04-24 11:05) [15]


> Hero ©   (24.04.07 10:45) [14]


> не ужель и впрям из пушки придется по воробьям?


Зачем ? Из пушки, конечно же, не надо , тем более по воробьям)

Решение тебе подсказано в [3], а вот как идентифицировать окно-адресат - это уже иной вопрос.


 
sniknik ©   (2007-04-24 12:22) [16]

> а вот как идентифицировать окно-адресат - это уже иной вопрос.

> нахожу handle вот таким способом
FindWindow видимо слишком прост для тебя... не дает как следует "попариться", прочуствовать суть программирования... ;)


 
Hero ©   (2007-04-24 13:43) [17]

ну в самом то деле читайте вниметельней [9]
это я уже пробовал работает
но не так как мне нада
дело в том что при открывании нескольких файлов mp3 как это делает юзер выделяет в папке с музыкой файлы и правой кнопкой открывает при таком коде как вы мне подсказали это работает медленно и вообще не понять чо получается причем первой запущенной в плейлист не все "выделенное" попадает.
вот я и спрашиваю есть ли иной способ кроме как : искать хэндл и посылать message этому хэндлу и потом халт
ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится


 
sniknik ©   (2007-04-24 14:11) [18]

> это я уже пробовал работает
> но не так как мне нада
а вот как тебе нада система не спрашивает, подстраиваться нужно тебе под то что есть...

> ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится
потрудился, все очень даже хорошо получается... есть всего лиш два варианта... (всего 2 !!! счастье то какое, халява), в первом приходит строка с перечисленными файлами для открытия (если выделить блок файлов и перетащить на ярлык программы) во втором все отмеченные выдаются программе по одному разным копиям (выделить блок и по правой кнопке выбрать "выполнить с помощью").
что в первом случае - разбор строки, что во втором - последовательное по штучное добавление в плейлист (ну и что что посылают разные копии?), не вижу никаких проблем в реализации.


 
Сергей М. ©   (2007-04-24 14:13) [19]


> выделяет в папке с музыкой файлы и правой кнопкой открывает


..  и при этом вне зависимости от кол-ва выбранных файлов открывает юзер только тот файл, на который смотрел курсор мыши в момент выполнения меню "Открыть".

Задумайся над этим)


 
sniknik ©   (2007-04-24 14:16) [20]

даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.
принимающая же тогда (первая запущенная), просто ловит названия по одному, и добавляет в плейлист.


 
Hero ©   (2007-04-24 14:41) [21]


sniknik ©   (24.04.07 14:16) [20]

даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.

дык paramcount = 1 как никрути (0 в случае если просто запускаешь exe`шник)

Сергей М. ©   (24.04.07 14:13) [19]

...Задумайся над этим)


иииии.........! а по ширша подсказачку.......никак?


 
Сергей М. ©   (2007-04-24 14:59) [22]


> а по ширша подсказачку.......никак?


Ну отчего ж ?)

Еще "как")

Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.


 
sniknik ©   (2007-04-24 15:03) [23]

> дык paramcount = 1 как никрути
в одном из вариантов да... а ты то сам трудишься проверять то что тебе говорят?

> 0 в случае если просто запускаешь exe`шник
нет не просто, имхо, но если копия вторая то при "пустом" запуске нужно "поднять" первую на передний план, и также завершисся как и с параметрами.

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


 
Hero ©   (2007-04-24 15:03) [24]


Сергей М. ©   (24.04.07 14:59) [22]

> а по ширша подсказачку.......никак?

Ну отчего ж ?)
Еще "как")
Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.


тобишь искать в той папке в которой юзерь выделил файлы выделенные файлы так?


 
sniknik ©   (2007-04-24 15:06) [25]

> Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.
это... чето вы мудрите батенька,  простейшую в общем то вещь так запутали... (сам не понял к чему тут COM/интерфейсы присобачивать...)

... ммм. ладно, счас пример оформлю.


 
Сергей М. ©   (2007-04-24 15:08) [26]


> sniknik ©   (24.04.07 15:06) [25]


Ну а какой же идиот будет передавать список в параметрах ком.строки ?)


 
sniknik ©   (2007-04-24 15:36) [27]

> Ну а какой же идиот будет передавать список в параметрах ком.строки ?)
... мммммм. ты?
ты же это советуешь, или это как типа диверсии направить на путь которым сам не пользуешься?

итак пример:
замечания
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:49) [28]


> ты же это советуешь


Я советую ?!

Да ты что ! Да бог с тобой).. Где ты это увидел ?)

Это как раз автор использует "посредником" ком.строку, а не я ему это предлагаю)


 
sniknik ©   (2007-04-24 16:15) [29]

> Это как раз автор использует "посредником" ком.строку, а не я ему это предлагаю)
ком.строку это командная строка(?) часть которой параметр, а не COM, автор не может ее не использовать т.к. система так передает при обсуждаемых вариантах, с выбором нескольких файлом и "открыть как".

а я в [25] про итерфейсы и COM..., не можно и COM обьектом прогу оформить и передачу на интерфейсах сделать но это както черезчур. и следом в [27] воспринял как продолжение про COM и интерфейсы. а про них ты советуешь.


 
Сергей М. ©   (2007-04-24 16:23) [30]


> sniknik ©   (24.04.07 16:15) [29]


> "открыть как".


Про "как" у автора речи не идет.
У него просто про "Открыть" идет речь.
Впрочем, то не столь важно.


> не можно и COM обьектом прогу оформить


"Не можно" <> "не нужно"

))


 
Hero ©   (2007-04-25 04:34) [31]

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]
Да спасибо, буду читать


 
sniknik ©   (2007-04-25 09:13) [32]

чтобы система записала в параметры 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 10:18) [33]

sniknik ©   (25.04.07 09:13) [32]

Да вот всетаки решил скомпилить твой код и действительно все работает так как надо

извините что заморочил голову всем :)



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

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

Наверх




Память: 0.56 MB
Время: 0.041 c
1-1174296970
San ciz
2007-03-19 12:36
2007.05.13
Иконака из длл в Timage. Возможно ли?


2-1177351731
Kostafey
2007-04-23 22:08
2007.05.13
Запретить визуальному компоненту получение фокуса


15-1176400346
Kostafey
2007-04-12 21:52
2007.05.13
Надежность программного обеспечения


2-1176904358
Neket
2007-04-18 17:52
2007.05.13
Как узнать в путь...


15-1176372251
Erik1
2007-04-12 14:04
2007.05.13
Install Indy 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский