|
1
|
Programación / Programación Visual Basic / Re: Conectar o Bajar un MDB situado en un servidor FTP
|
en: 10 Enero 2006, 17:25 pm
|
Para eso tendrías que crear el proceso usando CreateProcess y luego llamar a WaitForSingleObject hasta que termine dicho proceso. Escribí un ejemplo para que te quede más claro. El siguiente procedimiento ExecuteAndWait no volverá hasta que termine la descarga o hasta que la variable global CancelDownload se establezca a True. Option Explicit
Const STARTF_USESHOWWINDOW = &H1
Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type
Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type
Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public CancelDownload As Boolean
Sub ExecuteAndWait(CommandLine As String, Optional ShowWindow As VbAppWinStyle) Dim lpProcess As PROCESS_INFORMATION Dim lpStartup As STARTUPINFO Dim r&
' Oculta la ventana del proceso. ' lpStartup.dwFlags = STARTF_USESHOWWINDOW lpStartup.wShowWindow = ShowWindow ' Se debe establecer el valor inicial del ' tamaño de la estructura. ' lpStartup.cb = LenB(lpStartup) ' Crea el proceso. ' r = CreateProcess(vbNullString, CommandLine, 0&, 0&, False, 0&, 0&, _ vbNullString, lpStartup, lpProcess) If r Then ' Si el proceso se creo correctamente. ' Do While WaitForSingleObject(lpProcess.hProcess, 100) ' Espera hasta que termine el proceso. ' If CancelDownload Then 'Cancelar la espera. ' Exit Sub End If DoEvents Loop CancelDownload = False ' Libera el controlador de proceso. ' Call CloseHandle(lpProcess.hProcess)
End If End Sub
Saludos.
|
|
|
3
|
Programación / Programación Visual Basic / Re: ayuda con un control text
|
en: 5 Enero 2006, 21:34 pm
|
Lo que dice Gangrel es correcto, pero quiero hacer una pequeña correción porque eso es muy lento. Las llamadas a interfaces son muy lentas porque llevan bastante llamadas en el medio, mejor concatenar los datos en la variable y luego establecer la propiedad el TextBox. Do sDatos = sDatos & var & vbCrLf Loop
txtDatos.Text = sDatos
Saludos.
|
|
|
4
|
Programación / Programación Visual Basic / Re: Timer Grande
|
en: 5 Enero 2006, 17:13 pm
|
Poné el siguiente código en un módulo estándar, y crea un formulario que se llame frmMain. Este ejemplo utiliza la función SetTimer de la API para disparar un temporizador controlado mediante un bucle y la función Timer, de Visual Basic. Establece la constante TIMER_INTERVAL a la cantidad de segundos que quieres que sea el intervalo del temporizador. Esto es sólo de prueba, luego verás cómo manejas ese tema. Para iniciar el temporizador llama al procedimiento StartLongTimer, y para detenerlo a TerminateLongTimer. Cuando se cumpla cada intervalo de tiempo el temporizador lo notificará llamando al procedimiento LongTimer_Timer, y allí realizarás las tareas que necesites. Option Explicit
Const TIMER_INTERVAL = 86400 ' Intervalo del Timer, en segundos (le puse 1 día).
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private bTerminateTimer As Boolean
Sub Main() Call frmMain.Show End Sub
Sub StartLongTimer() bTerminateTimer = False ' Crea el temporizador del sistema que se ejecuta de ' forma asíncrona, de esta manera se evita el bloqueo ' del programa. ' Call SetTimer(0&, 0&, 1000&, AddressOf LongTimerProc) End Sub
Sub TerminateLongTimer() ' Establece la variable a verdadero para que ' se termine el procedimiento del temporizador. ' bTerminateTimer = True End Sub
Sub LongTimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Integer, ByVal dwTime As Long) Dim snTime!
Call KillTimer(0&, idEvent) ' Guarda el intervalo de tiempo actual. ' snTime = Timer Do While (Timer - snTime) < TIMER_INTERVAL ' Espera hasta que pase el tiempo especificado ' a menos que se cancele. ' If bTerminateTimer Then Exit Do DoEvents Loop If Not bTerminateTimer Then ' Si no se canceló el temporizador notifica del evento ' y vuelve a inicializar el contador. ' Call LongTimer_Timer Call StartLongTimer End If End Sub
Sub LongTimer_Timer() ' Este procedimiento se llamará cada vez que pase el lapso de tiempo ' configurado para el temporizador. ' ' Acá se puede hacer cualquier cosa que desee. ' Debug.Print "Timer interval: " & Time$ End Sub
Saludos.
|
|
|
5
|
Programación / Programación Visual Basic / Re: ¿Como llamar un control de un UserControl desde un modulo?
|
en: 5 Enero 2006, 16:41 pm
|
Crea una propiedad del tipo de objeto que necesitas. Por ejemplo si en el UserControl tenés un control Label que es el texto del control, creas una propiedad para acceder a la etiqueta. Vamos a poner un ejemplo hipotético que el Label se llama lblCaption, entonces quedaría algo así: Property Get TextLabel() As Label Set TextLabel = lblCaption End Property
Si el UserControl es privado esto va a funcionar bien, en el caso que sea público no se puede declarar el valor de retorno de la propiedad como Label, porque Label es un objeto privado, por lo tanto deberá quedar como Object pero lo que devolverá será el label, en resumen es lo mismo. Property Get TextLabel() As Object Set TextLabel = lblCaption End Property
Saludos.
|
|
|
8
|
Programación / Programación Visual Basic / Re: Error----->"invalid outside procedure"
|
en: 3 Enero 2006, 06:19 am
|
intenta cambiarla el tipo no le pongas byte ponele otra como integer y no lo tenes que declarar en el form_load poruqe no te dejaria usarla en otro lado declarada asi como esta, esta bien arriba pone y si pones vidas = 3 estarias declarandola como constante y encima creo qeu esta mal al vidas = 3 declarada como habias dicho antes en el form_load ya que al principio va a ser 3 y la podes usar con el valor que tenga en el momento por cualquier procedimiento, ya que estamos de que es el juego de que se trata??? a mi no me funciona eso de yo habia hecho en un timer seg = seg + 1 y simepre me qeudaba en uno el timer no las sumaba y estaba declarado el tipo de la variable y tambioen lo probe sin option explicit y nada, ahsta declare en forma global la variable y anda porque puede ser yo queria hacer un tipo reloj cuando se activara el timer iba a sumar de a uno (es la uinica forma que se hacer un reloj). Gracias y salu2. PD: si no esta claro postealo y te lo hago un poco mas mejor . espero que eso solucione tu problema Mejor relee el tutorial porque tenés errores muy graves de conceptos básicos. JoKker, tenés que declarar la variable en el sector de Declaraciones, arriba de todo del módulo antes de cualquier procedimiento. Saludos.
|
|
|
|
|
|
|