Como pasar un formulario prg a scx

597 views
Skip to first unread message

ZeRoberto

unread,
Aug 27, 2016, 6:20:51 PM8/27/16
to publicesvfoxpro
Tengo un prg que contiene un formulario, pero lo quiero manejar en scx, como lo hago?

Mario López

unread,
Aug 29, 2016, 11:21:44 AM8/29/16
to Comunidad de Visual Foxpro en Español

@Ze Roberto: 3 alternativas que se me ocurren:

  • armar un parser que analice el .PRG y lo convierta a formato de FoxBin2Prg (*.sc2), luego usar el FoxBin2Prg para generar el par .SCX / .SCT (tendrías que analizar dicho formato para armar el parser)
  • armar un parser que analice el .PRG y convierta el mismo a instrucciones nativas de VFP para generar el par SCX / SCT, algo como:

* Código del form en PRG
DEFINE CLASS TuForm AS Form
    Caption = "Nombre"  
    MiProp1 = 1         
    MiProp2 = 2         

    ADD OBJECT txt01 AS TextBox WITH ControlSource = [c_Tabla.Campo]

    PROCEDURE MiMetodo1 
    * Código
    * .....
    RETURN

    PROCEDURE MiMetodo2
    * Código
    * .....
    RETURN
ENDDEFINE

* Código para generar un SCX / VCX
ASELOBJ(xObj,1)
oForm = xObj[1]
WITH oForm
    .Caption = "Nombre" 
    .AddProperty("MiProp1", 1)
    .AddProperty("MiProp2", 2)

    .AddObject("txt01", "TextBox")
    WITH .txt01
        .ControlSource = [c_Tabla.Campo]
    ENDWITH

    TEXT TO sStr NOSHOW
    * PROCEDURE MiMetodo1 
    * Código
    * .....
    RETURN
    ENDTEXT
    .WriteMethod("MiMetodo1", sStr)


    TEXT TO sStr NOSHOW
    * PROCEDURE MiMetodo2
    * Código
    * .....
    RETURN
    ENDTEXT
    .WriteMethod("MiMetodo2", sStr)

    .SaveAs("TuForm.scx")        && o .SaveAsClass
ENDWITH

Esto a primera instancia no debería ser muy difícil con expresiones regulares, salvo que tuvieras sub-objetos contenidos en objetos del form, ahi ya se complica.

  • hacer esto último pero a mano

HTH
Mario


ZeRoberto

unread,
Aug 31, 2016, 9:46:26 PM8/31/16
to publicesvfoxpro
Encontré un código para tomar foto usando la cámara web, pero esta asi
Camara.txt

HernanCano

unread,
Sep 1, 2016, 1:16:17 AM9/1/16
to Comunidad de Visual Foxpro en Español

Bueno lo tienes en texto. ¿Por qué lo quieres convertir a binario si lo puedes ejecutar de todas formas?
¿Qué hay de malo con el de texto?

((Lo compilé en VFP9 y funciona bien))


El miércoles, 31 de agosto de 2016, 20:46:26 (UTC-5), Ze Roberto escribió:
Encontré un código para tomar foto usando la cámara web, pero esta asi 
<<<Camara.txt>>>

elkin dario uribe torres

unread,
Sep 1, 2016, 8:43:43 AM9/1/16
to publice...@googlegroups.com
Buenos dias sera este mismo?
captura_foto.rar1

Mario López

unread,
Sep 1, 2016, 3:14:54 PM9/1/16
to Comunidad de Visual Foxpro en Español
@Ze Roberto: como te decía, con un editor de texto decente que te permita hacer manejos en bloques de código no es mucho problema convertir un form sencillo al formato de FoxBin2Prg, copiá el bloque como TForm.sc2 y convertilo en un SCX con FoxBin2Prg tform.sc2 :


#INCLUDE "tform.h"

* <<< Crear un tform.h con los #define:
* #DEFINE WM_CAP_START 0x0400
* #DEFINE WM_CAP_DRIVER_CONNECT (WM_CAP_START+10)
* #DEFINE WM_CAP_DRIVER_DISCONNECT (WM_CAP_START+11)
* #DEFINE WM_CAP_DRIVER_GET_CAPS (WM_CAP_START+14)
* #DEFINE WM_CAP_SET_PREVIEW (WM_CAP_START+50)
* #DEFINE WM_CAP_SET_OVERLAY (WM_CAP_START+51)
* #DEFINE WM_CAP_SET_PREVIEWRATE (WM_CAP_START+52)
* #DEFINE WM_CAP_GET_STATUS (WM_CAP_START+54)
* #DEFINE WM_CAP_GRAB_FRAME (WM_CAP_START+60)


DEFINE CLASS Tform As Form
     *< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />

    *<DefinedPropArrayMethod>
        *m: *activate
        *m: *destroy
        *m: *getframe
        *m: *createcapturewindow
        *m: *driverconnect
        *m: *driverdisconnect
        *m: *releasecapturewindow
        *m: *msg
        *m: *iscaptureconnected
        *m: *getcapturedimensions
        *m: *startpreview
        *m: *stoppreview
    *</DefinedPropArrayMethod>


    *Width = 540 && para poner imagenes del click.
    Width = 340
    Height = 310
    Autocenter = .T.
    Caption = "Captura de Foto del Interno"
    MinButton = .F.
    MaxButton = .F.
    *Icon = wicoform
    hWindow = 0
    hCapture = 0
    capWidth = 0
    capHeight = 0
    capOverlay = 0

    ADD OBJECT 'cmdGetFrame' As CommandButton WITH ;
        Default = .T. ,;
        Left = 10 ,;
        Top = 264 ,;
        Height = 27 ,;
        Width = 90 ,;
        Caption = "Tomar Foto" ,;
        Enabled = .F.
        *< END OBJECT: BaseClass="CommandButton" />

    ADD OBJECT 'cmdPreview' As CommandButton With ;
        Default = .T. ,;
        Visible = .F. ,;
        Left = 100 ,;
        Top = 264 ,;
        Height = 27 ,;
        Width = 120 ,;
        Caption = "Video" ,;
        Enabled = .F.
        *< END OBJECT: BaseClass="CommandButton" />

    ADD OBJECT 'cmdClose' As CommandButton WITH ;
        Cancel = .T. ,;
        Left = 202 ,;
        Top = 264 ,;
        Height = 27 ,;
        Width = 130 ,;
        Caption = " Salir "
        *< END OBJECT: BaseClass="CommandButton" />


    PROCEDURE Activate
    IF THIS.hWindow = 0
    DECLARE INTEGER GetFocus IN user32
    THIS.hWindow = GetFocus()
    THIS.CreateCaptureWindow
    THIS.DriverConnect
    ENDIF
    ENDPROC


    PROCEDURE Destroy
    THIS.ReleaseCaptureWindow
    *!*    DO FORM entradam.scx
    ENDPROC


    PROCEDURE cmdClose.Click
    THIS.Destroy
    ThisForm.Release
    ENDPROC


    PROCEDURE cmdGetFrame.Click
    ThisForm.GetFrame
    ENDPROC


    PROCEDURE cmdPreview.Click
    ThisForm.StartPreview
    ENDPROC


    PROCEDURE GetFrame
    #DEFINE WM_CAP_FILE_SAVEDIB (WM_CAP_START + 25)

    LOCAL lcFile

    lcFile = lnombrefoto + '.JPG'

    THIS.msg(WM_CAP_GRAB_FRAME0,0)
    THIS.msg(WM_CAP_FILE_SAVEDIB0, lcFile,1)
    ENDPROC


    PROCEDURE CreateCaptureWindow
    #DEFINE WS_CHILD 0x40000000
    #DEFINE WS_VISIBLE 0x10000000

    DECLARE INTEGER capCreateCaptureWindow IN avicap32;
    STRING lpszWindowName, LONG dwStyle,;
    INTEGER x, INTEGER y,;
    INTEGER nWidth, INTEGER nHeight,;
    INTEGER hParent, INTEGER nID

    THIS.hCapture = capCreateCaptureWindow("",;
    WS_CHILD+WS_VISIBLE,;
    10,8,320,240THIS.hWindow, 1)
    ENDPROC


    PROCEDURE DriverConnect
    THIS.msg(WM_CAP_DRIVER_CONNECT0,0)
    IF THIS.IsCaptureConnected()
    THIS.GetCaptureDimensions
    STORE .TTO THIS.cmdGetFrame.Enabled,;
    THIS.cmdPreview.Enabled
    this.cmdPreview.Click
    ELSE
    THIS.Caption = THIS.Caption + ": failed to connect"
    ENDIF
    ENDPROC


    PROCEDURE DriverDisconnect
    THIS.msg(WM_CAP_DRIVER_DISCONNECT0,0)
    ENDPROC


    PROCEDURE ReleaseCaptureWindow
    IF THIS.hCapture <> 0
    THIS.DriverDisconnect
    DECLARE INTEGER DestroyWindow IN user32 INTEGER hWnd
    = DestroyWindow(THIS.hCapture)
    THIS.hCapture = 0
    thisform.Release
    ENDIF
    ENDPROC


    PROCEDURE msg(msg, wParam, lParam, nMode)
    IF THIS.hCapture = 0
    RETURN
    ENDIF

    IF VARTYPE(nMode) <> "N" Or nMode = 0
    DECLARE INTEGER SendMessage IN user32;
    INTEGER hWnd, INTEGER Msg,;
    INTEGER wParam, INTEGER lParam
    = SendMessage(THIS.hCapture, msg, wParam, lParam)
    ELSE
    DECLARE INTEGER SendMessage IN user32;
    INTEGER hWnd, INTEGER Msg,;
    INTEGER wParam, STRING @lParam
    = SendMessage(THIS.hCapture, msg, wParam, @lParam)
    ENDIF
    ENDPROC


    PROCEDURE IsCaptureConnected
    * analyzing fCaptureInitialized member of the CAPDRIVERCAPS structure
    #DEFINE CAPDRIVERCAPS_SIZE 44
    LOCAL cBuffer, nResult
    cBuffer = Repli(Chr(0),CAPDRIVERCAPS_SIZE)
    THIS.msg(WM_CAP_DRIVER_GET_CAPS, Len(cBuffer), @cBuffer, 1)
    THIS.capOverlay = buf2dword(SUBSTR(cBuffer,5,4))
    nResult = Asc(SUBSTR(cBuffer, 21,1))
    RETURN (nResult<>0)
    ENDPROC


    PROCEDURE GetCaptureDimensions
    * reading uiImageWidth and uiImageHeight members
    * of the CAPSTATUS structure
    #DEFINE CAPSTATUS_SIZE 76
    LOCAL cBuffer
    cBuffer = Repli(Chr(0), CAPSTATUS_SIZE)
    THIS.msg(WM_CAP_GET_STATUS, Len(cBuffer), @cBuffer, 1)
    THIS.capWidth = buf2dword(SUBSTR(cBuffer,1,4))
    THIS.capHeight = buf2dword(SUBSTR(cBuffer,5,4))
    ENDPROC


    PROCEDURE StartPreview

    THIS.msg(WM_CAP_SET_PREVIEWRATE30,0)
    THIS.msg(WM_CAP_SET_PREVIEW1,0)
    IF THIS.capOverlay <> 0
    THIS.msg(WM_CAP_SET_OVERLAY1,0)
    ENDIF

    ENDPROC


    PROCEDURE StopPreview
    THIS.msg(WM_CAP_SET_PREVIEW0,0)
    ENDPROC
ENDDEFINE




Punto más punto menos con algo como eso debería funcionar :)

HTH
Mario

---

ZeRoberto

unread,
Sep 1, 2016, 8:40:39 PM9/1/16
to publicesvfoxpro
Lo que pasa es que me gustan mas en SCX por que los puedo personalizar mejor que asi.

Mario López

unread,
Sep 1, 2016, 9:46:35 PM9/1/16
to Comunidad de Visual Foxpro en Español

@Ze Roberto: ¿y no te sirvió el .SC2 que mandé? Solamente lo tenés que pasar x el FoxBin2Prg y te queda el .SCX

HTH
Mario


ZeRoberto

unread,
Sep 3, 2016, 8:14:26 PM9/3/16
to publicesvfoxpro
Gracias de todas maneras, al final termine digitandolo todo.

Saludos

HernanCano

unread,
Sep 5, 2016, 12:05:25 AM9/5/16
to Comunidad de Visual Foxpro en Español

Era más fácil hacer lo que te indicó Mario.... (estás en un foro donde muchos hacemos éso...)...



El sábado, 3 de septiembre de 2016, 19:14:26 (UTC-5), Ze Roberto escribió:
Gracias de todas maneras, al final termine digitandolo todo.

Saludos

Jose Mario

unread,
Sep 5, 2016, 10:32:18 AM9/5/16
to Comunidad de Visual Foxpro en Español
lo mas facil de comprender es que no tienen foxbin2prg
o no lo sabe utilizar
Reply all
Reply to author
Forward
0 new messages