[delphi] [HGG] opcja wyboru w komendzie

0

Witam, to moj pierwszy post, ale to nie istotne, otóż:

wiem, jak przez gg i podanie ustalonej komendy otworzyc stronę www w domyślnej przeglądarce

if messageContent='strona' then
begin
  ShellExecute(Handle,'open','http://www.ekmll.com',nil,nil,SW_SHOWNORMAL);
  HGG1.SendMessage(moj_numer, 'Strona otwarta ;)',[]);
end;

jednak jak wszyscy widzimy po podaniu komendy "strona" otworzy się url na stałe wprowadzony do programu. Moje pytanie: JAK/za pomocą czego mogę zrobić otwieranie strony także podanej jako komende, np. "strona http://google.pl" otworzy google, a "strona http://4programmers.net" otworzy mi 4programmers.net ... czyli jak mam wprwadzic parametr (?!). Moze drugi przykladem bedzie wysylanie np. D:\KMLL\plik.txt z mozliwoscia wyslania via mail lub na FTP. W tej chwili wyglada to tak, ze komenda wyslij_mail odpowaida za wyslanie pliku via mail, a wyslij_ftp na serwer. Oczywiscie plik takze wprowadzony na stale, i tez chcialbym zrobic cos w stylu wyslij ftp/mail sciezka (wyslij ftp D:\KMLL\plik2.txt). Mam nadzieje, że wyraziłem się wystarczająco jasno. Jeśli odpowiedź jest na forum przepraszam, przeszukałem chyba cały dział i proszę o naprowadzenie mnie do opowiedniego tematu.

Z góry dzięki za pomoc, pozdrawiam

0

na przykład :

var
www:string;
begion
if Pos('www@', messageContent) > 0 then  begin // jeśli znajdzie w otrzymanej wiadomości  znaki "www@" 
 www :=(LowerCase(Trim(messageContent))); // obcina spacje z tyłu i z przodu oraz zmienia wszystkie znaki na małe
  Delete(www, 1, 4);  // po czym odcina pierwsze 4 znaki ze stringa
ShellExecute(0, 'open', PChar(www),nil, nil, sw_show); // a to uruchamia podaną scieżkę 
gg.SendMessage(GGNumber,'Otwarto: '+www,['']); // na koniec wysłany zostanie raport ze strona o podanym adrasie została uruchomiona a raczej zainicjowane zostało jej uruchomienie .
end;

pisałem z pamięci ale powinno działać .
Pozdrawiam

P.S.
//Edit
wysyłasz tekst o treści :"www@http://www.google.pl" i otwierają się google

0

niestety, po podaniu http://www.google.plle.pl otrzymuje tylko komunikat Otwarto: http://www.google.pl, ale niestety nie jest to prawdą. Mógłbyś to sprawdzić?? I jesli możesz wytłumaczyć mi na jakiej zasadzie to działa, żebym reszte(ściezki plików) mógł zrobić sam??

//edit
wybacz, pisalismy w tym samym momencie, nie zauważyłem Twojej zmiany i spacji. Już wszystko działa :) ale nadal prośba o wytłumaczenie na przykładzie ścieżki pliku ..

0

Postępuj analogicznie jak w przypadku strony www
czyli bo otworzyć plik wyślij wiadomośc o treści :

www@c:\program files\winamp\winamp.exe

zostanie uruchomiony winamp
chyba oto ci chodziło z tymi plikami :)

0

no tak, to jeśli chodzi o uruchomienie...

a np. pobranie??

var
url_plik:string;
if Pos('pobierz@', messageContent) > 0 then
begin
  url_plik := (LowerCase(Trim(messageContent)));
  if URLDownloadToFile(nil, PChar(url_plik), 'A ŚCIEŻKA ZAPISU??', 0, nil) <> 1 then
  Delete(www, 1, 8);
  hgg1.SendMessage(x, 'Plik na dysku',[])
end;

tak samo bedzie z kopiowaniem, czy przenoszeniem pliku. Co ze sciezka docelowa??
I kolejne pytanie, czy nie daloby sie tego zalatwic w jakis "ladniejszy" stosob, np www.google.ple.pl a nie [email protected] czyli kulturalnie bez @ ?? :)

0

wszystko jest analogiczne jak w przypadku otwierania pliku , jednak kopiowania pliku czy jego pobierania niewykonasz za pomocą ShellExecute ta funkcja słóży głównie do otwierania zasobów , wykorzystaj do tego inne funkcje np.

Kopiowanie plików

pobieranie pliku np. za pomocą komponetu HTTPGet.

jeśli chodzi o forme w jakiej to zrobisz a wieć czy użyjesz @ czy nie zależy od ciebie ja podałem tylko przykład jak to było niegdyś umnie zrobione .
Szukaj inforamcji na forum bo są , google też nie boli .
P.S.
a tak swoją stroną to domyślam się co tam szykujesz

0

heh jaki jesteś domyslny :) tonie dla mnie ;) wykla zabawka ...

wiem wiem, dzieki za pomoc ...

0

a jednak nie daje rady :/ pomoz mi prosze jeszcze ze sciezka docelowa?!

tak, zeby komenda wygladala pobierz@URL Docelowa. Ścieżke docelową chce podstawić pod sc_plik:String; ale nie wiem jak to zrobic w komendzie :/

0

Tu wystarczy troszkę pomyślec , wymyśłiłem dwa sposoby z których realizacją niepowinieneś mieć większych problemów.

pierwszy sposób :
Wyślij najpierw komędę np. "[email protected]/plik"
gdy twój program odbierze ten komunikat obrobi go do formy linku czyli do : "www.serwer.pl/plik"
wrzucisz ten link naprzykład do pola Edit
poczym program wyśle ci zapytanie gdzie chcesz zapisać np.
hgg1.SendMessage(x, 'gdzie zapisać',[])
wtedy ty wysyłasz drugą wiadomość np o treści : "zapisz@C:\plik"
widomość dotrze do twojego programu (czy jak ty to nazwałeś "zabawki" )
a wiec wiadomosć dociera i zostaje obrobiona do formy "C:\plik"
po czym wrzucisz komponent do pobierania plików choćby HTTPGet
pobierzesz z edita scieżke url , pobierasz scieżkę docelową czyli tą "C:\plik"
i rozpoczynasz pobieranie pliku .

drugi sposób :
wysyłasz wiadomość "[email protected]/plik@C:\plik"
twój program szuka ostaniego znaku @ poczym dzieli na pół słowa przed małpą i za małpą
słowa przed małpą obrabiasz do formy linku i ustawiasz jako adres url a słowa za małpą ustawiasz jako scieżkę docelową i rozpoczynasz pobieranie pliku .

0

niestety, musze Cie rozczarowac :/ walcze z tym juz cala noc i za nic nie chce mi wyjsc.

if Pos('pobierz ', messageContent) > 0 then                                  
begin
  url_plik :=(LowerCase(Trim(messageContent)));
  Delete(url_plik, 1, 8);
hgg1.SendMessage(x,'Gdzie zapisac??',[]);
if Pos('daj ', messageContent) > 0 then
begin
  sc_plik :=(LowerCase(Trim(messageContent)));
  Delete(sc_plik, 1, 4);
if URLDownloadToFile(nil, PChar(url_plik), PChar(sc_plik), 0, nil) <> 0 then
hgg1.SendMessage(x, 'Plik na dysku :D ',[]);
end;
end;

1.wprowadzam pobierz www.serwer.pl/plik.txt
2.otrzymuje pytanie gdzie zapisac
3.wprowadzam daj d:\plik.txt
4.nic wiecej sie nie dzieje ;/

tak samo mam przy uploadzie plikow:

if Pos('wyslij ',messageContent) > 0 then                                        
begin
   wysylany := (LowerCase(Trim(messageContent)));
   Delete(wysylany, 1, 7);
    begin
    HGG1.SendMessage(x, 'Podaj nazwe pliku na serwerze:',[]);
      begin
      if Pos('nazwa ',messageContent) > 0 then
        begin
          nazwa := (LowerCase(Trim(messageContent)));
          Delete(nazwa, 1, 6);
          IdFTP1.Connect;
          IdFTP1.Put(wysylany, nazwa, true);
          IdFTP1.Disconnect;
   HGG1.SendMessage(x, 'Plik umieszczony na serwerze ...',[]);
end;
end;
end;
end;
  1. wpowadzam wyslij d:\plik.txt
  2. otrzymuje wiadomosc "Podaj nazwe pliku na serwerze:"
  3. wprowadzam nazwa plik.txt
  4. znow nic sie nie dzieje:/

moglbys mi pomoc??

widoczne kody przerabialem juz na rozne sposoby, raz wiecej raz mniej beginow, ale te wydaja mi sie poprawne(?!) ...

a moze powiesz cos wiecej na temat szukania znaku w srodku ciagu?? :)

0
uses: urlmon;
var
U,T: string;
begin
T:=messageContent;
if pos('url@', T) > 0 then  begin // jeżeli w wiadomości jest słowo url@
U :=(Trim(T));  // wtedy obcinamy spację z tyłu i z przodu
  Delete(U, 1, 4);  //odcinamy słowo url@
  Sendfilee.Text:=U; //Sendfilee to pole edycyjne do którego przypiszesz adres url 
gg.SendMessage(x,'ustawiono_url'+U,['']); // teraz wyślemy raport że ustawiono url
end;

if pos('pobierz@', T) > 0 then  begin // jeżeli w wiadomości jest słowo pobierz@
U :=(Trim(T)); //wtedy obcinamy spację z tyłu i z przodu
  Delete(U, 1, 8); odcinamy słowo pobierz@
URLDownloadToFile(nil,PChar(Sendfilee.Text), PChar(U),0,nil); // funkcja pobierania pliku, Sendfilee.Text z tego pola odczytamy url do pliku zmienna U to scieżka docelowa 
gg.SendMessage(x,'Pobieranie pliku z: '+Sendfilee.Text+' do: '+U,['']); // wysyłamy raport o pobieraniu
end;
end;

więc wysyłasz najpierw komedę "url@http://www.google.pl/intl/en_com/images/logo_plain.png"
poczym dostajesz widomość że ustawiono url
wysyłasz komede "pobierz@C:\plik.png"
i plik zostanie pobrany.

Można to nieco ulepszyć , domyślam się że twoją zabaweczką steruje inny program z którego wysyłasz komędy , więc :
dodaj w nim dwa pola edit i jeden button .

W pierwszym edicie wpisuj adres url w drugim scieżkę docelową ,
button1 wysyłasz komęde o pobieraniu pliku:

procedure TForm1.Button1Click(Sender: TObject);
begin
   gg.SendMessage(x,'url@'+Edit1.text,['']); // wysyłasz wiadomość  o treści url@ + zawartość pola edit1 z adresem url
end;

w message content piszesz :

var
U,T: string;
begin
T:=messageContent;
if pos('ustawiono_url', T) > 0 then  begin // jeżeli w wiadomości jest słowo ustawiono_url@
gg.SendMessage(x,'pobierz@'+Edit2.text,['']); // wyślij wiadomość o treści pobierz@ + zawartośc pola edit2 z scieżką docelową
end;
end;

I masz wszystko za pomocą jednego klinknięcia myszy , rozważ terz drugi sposób z mojego poprzedniego posta bo jest lepszy w newbie ostanio widziałem post na temat dzielenia tekstu może ci się przyda , w sumie to ten wątek terz mógł by się znaleźć w newbie jednak chyba może tu chyba zostać ;)

Pozdrawiam

0

Lub coś w tym stylu

To mój drugi sposób raczej lepszy od pierwszego:

var
 oki,url:string ;
 Position1,Position2:integer;
 ST,BT:string;
begin
ST :=MessageContent;
if pos('pobierz@', ST) > 0 then begin // jeżeli w wiadomości jest słowo pobierz@
 oki:=(LowerCase(Trim(ST))); //wtedy obcinamy spację z tyłu i z przodu
 Position1 := Pos('@', oki); // Funkcja zwraca wartość indeksu, pierwszego znaku określonego w parametrze SubStr. Szukanie odbywa się w łańcuchu oki
 Position2 := PosEx('@', oki, Position1+1);//Funkcja zwraca wartość indeksu, pierwszego znaku określonego w parametrze SubStr. Szukanie odbywa się w łańcuchu oki
if Position2 > 0 then begin
  ST:=oki;
  ST := Copy(ST,9,Position2-9); //funkcja Zwraca fragment łancucha znaków od - do wyznaczonych miejsc 
// jeśli twoja komęda będzie się rozpoczynała od słowa innego niż słowo "pobierz@" np. "geturl@" zamiast 9 musisz wpisać długość komędy+1
  BT:=oki ;
  BT := Copy(BT,Position2+1,length(oki));//funkcja Zwraca fragment łancucha znaków od wyznaczonych miejsc do końca stringa
  URLDownloadToFile(nil,PChar(ST), PChar(BT),0,nil); // pobieranie pliku zmienna ST - adres url zmienna BT - scieżka docelowa
  gg.SendMessage(x,'Pobieranie pliku z adresu: '+ST+' do pliku: '+ BT,['']); // wysyłanie raportu
 end;end;

a więc wysyłasz tylko raz komedę : "pobierz@http://www.google.pl/intl/en_com/images/logo_plain.png@C:\logo.png"

Plik zostanie pobrany.

opis :

"pobierz@" = komeda informująca o pobieraniu pliku
"http://www.google.pl/intl/en_com/images/logo_plain.png" = url do pliku
"@" = oddziela url od scieżki
"C:\logo.png" = scieżka docelowa

Pozdrawiam

0

nie, nie jest sterowany inna aplikacja. Wszystko za pomoca komend przez gg.

OK, pobieranie dziala =D WIELKIE dzieki ;)

ale ...

chcialem tym samym sposobem zrobic upload, wiec umiescilem:

T:=messageContent;                                                                
if pos('test ', T) > 0 then
begin
U :=(Trim(T));
  Delete(U, 1, 5);
  Edit1.Text:=U;                                                                 
hgg1.SendMessage(x,'Sciezka pliku zapisana...wpisz: wyslij nazwa_pliku',[]);
end;

if pos('wyslij ', T) > 0 then
begin
U :=(Trim(T));
  Delete(U, 1, 7);
    IdFTP1.Connect;
    IdFTP1.Put(PChar(Edit1.Text),PChar(U), true);
    IdFTP1.Disconnect;
    hgg1.SendMessage(x,'Plik umieszczony na sewerze ;)',[]);
end;

i co??

  1. wprowadzam test C:\plik.txt (sciezka poprawnie pojawia sie w edit1)
  2. dostaje wiadomosc "Sciezka pliku zapisana...wpisz: wyslij nazwa_pliku"
  3. wprowadzam wyslij plik.txt
  4. nic sie nie dzieje (plik nie pojawia sie na serwerze, nie przychodzi wiadomosc na gg)

pomocy ;)

0

No cóż ja od siebie dodam tyle , sprawdz czy dobrze podajesz dane do serwera FTP

if pos('wyslij ', T) > 0 then
begin
U :=(Trim(T));
  Delete(U, 1, 7);
    IdFTP1.Host:= '***';
    IdFTP1.Username:= '***';
    IdFTP1.Password:= '***';
  if not IdFTP1.Connected then
begin
 IdFTP1.Connect();
 IdFTP1.Put(PChar(Edit1.Text),PChar(U));
 IdFTP1.Disconnect;
end;
end;

przeglądnij ten wątek może się czegoś dowiesz ,
http://4programmers.net/Forum/421926#421926
P.S. połórz na formę komponent IdAntiFreeze lub zrób przesyłanie pliku w innym wątku bo w przeciwnym wypadku na czas łączenia się i wysyłania pliku twój program przestanie odpowiadać
P.S. IdThreadComponent terz pomoże

0

poradzilem sobie :)

roznica taka, ze przy przypisanym na stale pliku mam:

IdFTP1.Put(C:\test\screen.jpg','screen.jpg', <b>true</b>)

a na zmiennych

IdFTP1.Put(PChar(Edit1.Text),PChar(U));

a wczesniej tu tez mialem na koncu true i dlatego nie wysylalo :/

wiec teraz dziala i download i upload :D ale ... z "mala" wada przy uploadzie:
otoz gdy wysle na serwer plik lol.txt w tresci ktorego bedzie

a

i potem wysle go jeszcze raz na serwerze mam plik lol.txt a w tresci:

a
a

przy pliku lol.jpg jest gorzej...gdy wysle go poraz drugi obraz nie zostaje podmieniony, ale waga pliku wzrasta o wage pliku wysylanego :/

jakies pomysly jak to rozwiazac??

0

może spróbUj usunąć z najpierw z serwera plik który chcesz podmienić a potem go dopiero wyślij

służy do tego :

IdFTP1.Delete(U)
0

Wszystko działa jak należy :)

Wielkie "Dziękuję Ci" za pomoc ;)

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