Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Cod, sintaxa si comenzi  Modalitate simp...
 Modalitate simpla lansare in executie programe din VFP
 
 5/19/2011 9:41:07 PM
User is offlineSCHRECK
158 posts
5th


Modalitate simpla lansare in executie programe din VFP
 (N/A)
Poate intereseaza pe cineva o modalitate simpla de lansare in execitie de programe externe
(fisiiere exe) fisiere asociate (PDF, XML etc) linkuri.

variabila fis poate fii un fisier exe, orice fisier asociat, un link

SET CLASSLIB TO _environ.vcx

fis='WWW.GOOGLE.RO'

OB1=CREATEOBJECT('clshell')
ob1._shellexecute1.shellexecute('&fis')
SET CLASSLIB TO

DEFINE CLASS clshell AS CUSTOM OF _environ.vcx
ADD OBJECT _shellexecute1 AS _shellexecute
ENDDEFINE

OBSERVATII:
In dosarul unde se afla acest cod trebuie copiate (sau indicata calea) fisierele _base.vcx, _base.vct, _environ.vcx si _environ.vct
din /Program Files/Microsoft Visual Foxpro 9/Ffc
 5/20/2011 12:45:54 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Modalitate simpla lansare in executie programe din VFP
 (N/A) Modified By Daniel Buduru  on 5/21/2011 8:34:45 AM)
Si asta se numeste "modalitate simpla"?

Modalitatea simpla e asta:

FUNCTION ShellExecute
LPARAMETERS tcFile
Local llretval
DECLARE INTEGER ShellExecuteA IN shell32;
    INTEGER hwnd,;
    STRING  lpOperation,;
    STRING  lpFile,;
    STRING  lpParameters,; 
    STRING  lpDirectory,;
    INTEGER nShowCmd
llRetval=shellexecuteA(0,'open', tcFile, '','',1)
CLEAR DECLARE INTEGER ShellExecuteA
return llretval
ENDPROC

Si o apelezi cu shellexecute(fisier)

Daniel Buduru
 5/20/2011 8:57:27 PM
User is offlineDumitru
172 posts
5th


Re: Modalitate simpla lansare in executie programe din VFP
 (N/A)
... sau asta tot by Daniel

loShell = CREATEOBJECT("wscript.shell")
loShell.Run(lcEXE,0,.f.)
 5/20/2011 11:01:01 PM
User is offlineSCHRECK
158 posts
5th


Re: Modalitate simpla lansare in executie programe din VFP
 (N/A)
Ei bine rectific. 'O ALTA MODALITATE DE A LANSA PROGRAME IN EXECUTIE'

Tu te-ai folosit de bibliteca API eu de o clasa VFP din Foundation Classes

Hai sa facem urmatorul lucru. Cream un Form in care plasam in buton pe care daca dam click sa se lanseze www.google.com

Eu procedez in felul urmator: creez un form (File New Form ) in care plases un buton, dupa care TOOLS COMPONENT GALLERY FOUNDATION CLASSES
UTILITIES, Drag Shell Execute pe form. 4 clickuri si un drag. In fereastra Proprties vor aparea in Form1 2 elemente: _shellexecute1 si command1
In metoda Click al butonului scriu un singur cuvant: THISFORM._SHELLEXECUTE1.SHELlexecute('WWW.GOOGLE.COM') si totul va functiona.

Daca te rog frumos imi descrii cum ajungi la acest rezultat folosind funtia ta ca sa putem compara care metoda este mai rapida
Iti multumedc anticipat
 5/21/2011 12:43:20 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Modalitate simpla lansare in executie programe din VFP
 (N/A) Modified By Grigore Dolghin  on 5/21/2011 12:44:38 AM)
Clasa ShellExecute din Foundation Classes executa la randul ei functia ShellExecute descrisa de Daniel. In esenta codul tau face EXACT acelasi lucru doar ca incarca aplicatia cu inca 4 VCX-uri si executa functia aia API prin 2 intermediari. Acum spune-mi tu care e mai rapida.

One more thing: Daca iti instalezi VFP in alt folder ghici ce-o sa se intample cu formurile care folosesc vcx-ul ShellExecute din Foundation Classes.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/21/2011 8:15:14 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Modalitate simpla lansare in executie programe din VFP
 (N/A) Modified By Daniel Buduru  on 5/21/2011 8:21:55 AM)
 SCHRECK wrote
Ei bine rectific. 'O ALTA MODALITATE DE A LANSA PROGRAME IN EXECUTIE'

Tu te-ai folosit de bibliteca API eu de o clasa VFP din Foundation Classes

Hai sa facem urmatorul lucru. Cream un Form in care plasam in buton pe care daca dam click sa se lanseze www.google.com

Eu procedez in felul urmator: creez un form (File New Form ) in care plases un buton, dupa care TOOLS COMPONENT GALLERY FOUNDATION CLASSES
UTILITIES, Drag Shell Execute pe form. 4 clickuri si un drag. In fereastra Proprties vor aparea in Form1 2 elemente: _shellexecute1 si command1
In metoda Click al butonului scriu un singur cuvant: THISFORM._SHELLEXECUTE1.SHELlexecute('WWW.GOOGLE.COM') si totul va functiona.

Daca te rog frumos imi descrii cum ajungi la acest rezultat folosind funtia ta ca sa putem compara care metoda este mai rapida
Iti multumedc anticipat


Uite codul clasei _shellexecute din _environment.vcx (listat cu classbrowser):

**************************************************
*-- Class:        _shellexecute (c:\vfp9\ffc\_environ.vcx)
*-- ParentClass:  _custom (c:\vfp9\ffc\_base.vcx)
*-- BaseClass:    custom
*-- Time Stamp:   10/30/04 01:12:07 PM
*-- Opens a file in the application that it's associated with.
*

DEFINE CLASS _shellexecute AS _custom


    Name = "_shellexecute"


    *-- Runs ShellExecute API routine, which is simlar to double-clicking file in explorer.  Parameters: (cFileName, cWorkDir, cOperation, cParams)
    PROCEDURE shellexecute
        * WinApi :: ShellExecute
        **  Function: Opens a file in the application that it's
        **            associated with.
        **      Pass: lcFileName -  Name of the file to open
        **  
        **  Return:   2  - Bad Association (e.g., invalid URL)
        **            31 - No application association
        **            29 - Failure to load application
        **            30 - Application is busy
        **
        **            Values over 32 indicate success
        **            and return an instance handle for
        **            the application started (the browser)
        **
        ** ShowWindow() Commands
        **  #define SW_HIDE             0
        **  #define SW_SHOWNORMAL       1
        **  #define SW_NORMAL           1
        **  #define SW_SHOWMINIMIZED    2
        **  #define SW_SHOWMAXIMIZED    3
        **  #define SW_MAXIMIZE         3
        **  #define SW_SHOWNOACTIVATE   4
        **  #define SW_SHOW             5
        **  #define SW_MINIMIZE         6
        **  #define SW_SHOWMINNOACTIVE  7
        **  #define SW_SHOWNA           8
        **  #define SW_RESTORE          9
        **  #define SW_SHOWDEFAULT      10
        **  #define SW_FORCEMINIMIZE    11
        **  #define SW_MAX              11


        LPARAMETERS tcFileName,tcWorkDir,tcOperation,tnShowWindow
        LOCAL lcFileName,lcWorkDir,lcOperation,lnShowWindow

        IF EMPTY(tcFileName)
            RETURN -1
        ENDIF

        lcFileName=ALLTRIM(tcFileName)
        lcWorkDir=IIF(TYPE("tcWorkDir")="C",ALLTRIM(tcWorkDir),"")
        lcOperation=IIF(TYPE("tcOperation")="C" AND NOT EMPTY(tcOperation),ALLTRIM(tcOperation),"Open")
        lnShowWindow=IIF(TYPE("tnShowWindow")="N",tnShowWindow,1)

        *-* HINSTANCE ShellExecute(hwnd, lpszOp, lpszFile, lpszParams, lpszDir, wShowCmd)
        *-*
        *-* HWND hwnd - handle of parent window
        *-* LPCTSTR lpszOp - address of string for operation to perform
        *-* LPCTSTR lpszFile - address of string for filename
        *-* LPTSTR lpszParams - address of string for executable-file parameters
        *-* LPCTSTR lpszDir - address of string for default directory
        *-* INT wShowCmd - whether file is shown when opened

        DECLARE INTEGER ShellExecute ;
                IN SHELL32.DLL ;
                INTEGER nWinHandle,;
                STRING cOperation,;  
                STRING cFileName,;
                STRING cParameters,;
                STRING cDirectory,;
                INTEGER nShowWindow
        RETURN ShellExecute(0,lcOperation,lcFilename,"",lcWorkDir,lnShowWindow)
    ENDPROC


ENDDEFINE
*
*-- EndDefine: _shellexecute
**************************************************


Daniel Buduru
 5/21/2011 10:23:42 AM
User is offlineSCHRECK
158 posts
5th


Re: Modalitate simpla lansare in executie programe din VFP
 (N/A)
Cand am intrebat 'care este mai rapida' m-am referit la timpul necesar
pt.implementarea al codului nu la timpul de executie.

In ceea-ce priveste timpul de executie, la capacitatea de procesare a calculatoarelor
actuale oricum timpul este incomensurabil la nivelul prceptiilor noastre, chiar daca codul lui
Daniel este mai rapid diferenta de viteza bamuiesc este de ordinul nanosecundelor.

Am facut rutina pt.generarea fisierului XML pt D112 cate este destul de complicat si contine multe randuri.
In schimb cand ruleaza rezultatul apare instantaneu chiar daca am in angajat sau 1000 de angajati.


In continuare m-ar interesa pentru cultura mea generala cum se rezolva problema
folosind metoda lui Daniel (unde se declara functia, inafara Formului sau in el in cadrul unei metode etc)
 5/21/2011 11:18:02 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Modalitate simpla lansare in executie programe din VFP
 (N/A) Modified By Daniel Buduru  on 5/21/2011 11:19:48 AM)
Interventia mea a pornit de la primul tau post din acest thread "Modalitate simpla lansare in executie programe din VFP".
Asa cum este redactat, postul nu este o intrebare, ci un fel de "Buna practica", pe care o recomanzi.

Solutia pe care ai prezentat-o creeaza programatic o clasa prin subclasarea unei alte clase, apoi instantiaza noua clasa intr-un obiect, apoi apeleaza o metoda a acestui obiect.
Metoda cu pricina contine tocmai un apel al functiei api shellexecutr.
Pentru acest apel, recomanzi aducerea in aplicatie a doua biblioteci. _base.vcx si _environ.vcx, care au impreuna 370KB (vcx+vct).

Faptul ca tie iti este usor sa tragi _shellexecute in form si sa apelezi metoda in cod e una, procedura pe care ai recomandat-o ca buna practica e alta.
Ce anume folosesti in aplicatiile proprii, nu e treaba nimanui.
Cand intra in discutie "buna practica", aici discutia e libera, si fiecare isi poate prezenta opiniile. In acelasi scop ca si al threadului pe care l-ai deschis: informarea celor care urmaresc acest forum.

Ca sa-ti raspund si la ultima intrebare:
Functia se poate pune intr-un prg, numit shellexecute - in care caz se comenteaza declaratia de functie, Daca acest program se gaesete in calea de acces vfp, sau este inclus in proiect la compilare, e suficienta apelarea functiei.shellexecute(numefisier).

Acum am si eu doua intrebari:
De ce nu ai instantiat direct clasa _shellexecute, si ai recurs in schimb la sublcasarea intr-o clasa definita in prg?
De ce nu ai folosit comanda ob1=createobject('_shellexecute','_environ.vcx') in loc de SET CLASSLIB TO _environ.vcx ?




Daniel Buduru
 5/21/2011 12:21:09 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Modalitate simpla lansare in executie programe din VFP
 (N/A)

 SCHRECK wrote
In continuare m-ar interesa pentru cultura mea generala cum se rezolva problema
folosind metoda lui Daniel (unde se declara functia, inafara Formului sau in el in cadrul unei metode etc)

Functiile API se declara oricand si nu ies din scop (sunt vizibile de oriunde in cursul unei sesiuni a aplicatiei). Altfel spus, in main.prg apelezi "DeclareAPIFunctions.prg" si uiti de el; functiile API vor putea fi apelate de oriunde.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
  Visual FoxPro  Cod, sintaxa si comenzi  Modalitate simp...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement