menu kontekstowe explorera i wybór wielu folderów

0

Witam.
chciałbym dodac do menu kontekstowego explorera pozycje skojarzona z moim programem tak bym mógł prawym myszki otwierac swój program skojarzony przez to wywołanie z okreslonymi plikami/folderami. do Zarejestrowania swojego programu w menu explorera uzywam procedury:

procedure explorerset(name,nwpisu,app:string);
var
Reg : TRegistry;
begin
Reg := Tregistry.create;

 with Reg Do
  begin
    RootKey := HKEY_CLASSES_ROOT;
      OpenKey('Directory\shell',false);
       if not KeyExists(name{'DelphiTest'}) then CreateKey(name{'DelphiTest'});
      CloseKey;
      OpenKey('Directory\shell\'+name,False);
        WriteString('',nwpisu);
        if not KeyExists('command') then CreateKey('Command');
      Closekey;
      OpenKey('Directory\shell\'+name+'\command',false);
        WriteString('','"'+app+'"'+' "%1"')
      CloseKey;
  end;
reg.Free;
  end;

To działa poprawnie.Przy wywołaniu folder na którym kliknięto prawym myszki jest podawany jako parametr w paramstr(1). Jednak kiedy chcę zaznaczyć kilka folderów i wywołać program, windows dla każdego folderu uruchamia osobną kopię programu a ja chciałbym by uruchomił jedną podając zaznaczone foldery jako kolejne parametry. Oczywiście można nie zezwolić na wielokrotne uruchomienie programu a jedynie przekazywać parametry uruchomionej juz pierwszej kopii programu i w ten sposób uzyskćc pożądany efekt. Czy nie można tego zrobić prościej wymuszając na windows by uruchomił raz program podając jako parametry wszystkie zaznaczone foldery/pliki? Jak to zrobić? z góry dziękuję za wszelkie sugestie.

P.S. i jeszcze jedno małe pytanko. W jaki sposób w menu kontekstowym explorera przy mojej pozycji dodać ikonkę albo coś narysować?

0

Zlicz ile folderów odczytujesz: ParamCount
A następnie w pętli leć po wszystkich parametrach i wczytuj je: ParamStr(i)

Poza tym zrób, aby program uruchamiał się tylko w jednej kopii (są nawet proste komponenty).

0

Dzięki Opi za zainteresowanie ale Twoja sugestia niczego nie załatwia. Dodatkowo chyba nie przeczytałeś tego co napisałem. Napisałeś tak jak chciałbym by działało a jednak tak nie działa. Windows przy zaznaczeniu kilku folderów uruchamia kilka kopii programu dla każdego folderu z osobna podając każdej kopii tylko jeden parametr (paramcount=1 ZAWSZE) Mnie właśnie zależy na tym by wymusić by windows otwierało jedna kopie programu podając jako parametry (paramstr(i)) wszystkie zaznaczone foldery(paramcount=liczba zaznaczonych folderów). Pytanie moje brzmi : jak to zrobić najprościej?
Bardzo proszę o pomoc i z góry za nią dziękuję.

0

poczytaj o DDE i OLE to jest rozwiazanie!

0

Witam.
Dzięki kwaśny ale to wygląda skomplikowanie a ja chciałbym coś prostego co w miarę szybko by działało.
Jeśli ktoś zna konkretne rozwiązanie, które mógłby podać to byłbym wdzięczny. Przejrzałem klasy w delphi do komunikacji DDE i musiałbym sporo czasu poświęcić by tą drogą dojść do rozwiązania choć nie jestem pewien czy w ogóle bym doszedł.
Pytanie jest konkretne: Jak przekazać z menu explorera wiele parametrów (ścieżek zaznaczonych plików bądź folderów) do uruchamianej aplikacji.
Z góry dziękuję za konkretne i konstruktywne posty.
Kwasny jeśli możesz podać coś konkretniejszego bez konieczności zapoznawania sie z całym mechanizmem DDE to podaj proszę.
Pozdrawiam:-)

0

Proszę bardzo.

Umieść na formularzu komponent DdeServerConv i zmień jego nazwę na "System".
Obsłuż zdarzenie OnExecuteMacro, w nim otrzymujesz komunikaty.
Poniżej masz to co musisz zapisać do rejestru.

if OpenKey('Directory\shell\DelphiTest\command', True) then
    begin
      WriteString('', Format('"%s"', [ParamStr(0)])); //ścieżka do aplikacji
      CloseKey;
    end;

    if OpenKey('Directory\shell\DelphiTest\ddeexec\Application', True) then
    begin
      WriteString('', 'DelphiTest'); //nazwa pliku aplikacji bez rozszerzenia
      CloseKey;
    end;

    if OpenKey('Directory\shell\DelphiTest\ddeexec\Topic', True) then
    begin
      WriteString('', 'System'); //serwer dde
      CloseKey;
    end;
procedure TForm1.systemExecuteMacro(Sender: TObject; Msg: TStrings);
begin
  ShowMessage(Msg.Text);
end;
0

Dzięki Kwasny. To wygląda dość prosto ale niestety nie działa tak jak powinno. Oczywiście pojawia sie w menu kontekstowym odpowiednia pozycja i można wywołać nią program. Jednak do każdego folderu uruchamiana jest kolejna kopia programu (a nie jedna do wszystkich co było moim zamiarem) a zdarzenie onExecuteMacro obiektu System (TDdeServerConv) w ogóle nie jest wywoływane:(. Czy mógłbyś to sprawdzić i ewentualnie skorygować?
Z góry dziękuję.

0

Wartość jaka jest zapisywana w kluczu ddexec\Application musi być zgodna z nazwą pliku programu bez rozszerzenia,
np. jeśli plik wykonywalny ma nazwę "mojprogram.exe" to w rejestrze zapisujesz "mojprogram".

0

No tak zrozumiałem i tak zrobiłem. Niestety efekt jest taki jak napisałem wyżej.

0

Eh ale ze mnie lol zapomniałem o parametrze, w kluczu ddeexec w wartości domyślnej trzeba zapisać %1.

if OpenKey('Directory\shell\DelphiTest\ddeexec', True) then
begin
  WriteString('', '%1');
0

No teraz działa. Ale:

  1. Zdarzenie onexecutemacro jest wywoływane dla każdego elementu (ścieżki zaznaczonego katalogu) oddzielnie i zawsze jest msg.count=1 a miało podać za jednym razem wszystkie. Czy da się to zmienić?

  2. Działa to wolniej niż to o czym pisałem na początku bez dde, czyli metodą przez uruchamianie kolejnej kopii przesyłanie do istniejącej w pamięci kopii parametru i zamykanie nowej kopii. Więc trochę się rozczarowałem , miałem nadzieję, że będzie szybciej. Nie da się zrobić tak by w jednym zdarzeniu onexecutemacro przekazać wszystkie ścieżki? Pewnie byłoby szybciej.

0

a spróbuj po prostu dopisać za %1 %*

0

to, to w ogóle nie działa :(

0

Ok ale tamten wątek skończył się na haśle "serwer rozszerzający +książka". Ja tej książki nie mam i nie wiem jak to zrobić więc nic mi po tym linku. SNW jeśli wiesz jak to zrobić to napisz może po prostu:-) Intuicja mi podpowiada, że skoro zadanie jest proste i konkretne to i jego rozwiązanie takim powinno być tylko trzeba je skądś wziąć/znać. Ja niestety nie znam choć szukałem i liczę teraz na pomoc forumowiczów w tym Kwasnego i może Twoją jeśli będziesz chciał pomóc.

0

inny, prostszy sposób to taki (patrz na dół):
http://delphi.about.com/od/adptips2006/qt/activaterunning.htm

a ja nie mam co pisać bo to niestety nie hop siup.

książkę zawsze możesz pożyczyć z biblioteki

0

No ten sposób akurat znam , pisałem o tym na początku tego topicu. ale to działa dość wolno i jest mało eleganckie, dlatego chciałbym poznać coś lepszego. No jeśli nie możesz napisać to trudno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1