Hola como estan .
Mi pequeño gran problema es ...
Que cuando compilo en RadASM ... me sale error
Ejerc2IV.asm(32) : error A2033: invalid INVOKE argument : 2
Ejerc2IV.asm(32) : error A2114: INVOKE argument type mismatch : argument : 2
Quisiera saber como solucionarlo ... o que me dean una pista :xD una explicacion
Lo que quiero hacer es :
Crear una calculadora que sume 2 cantidades, debe tener 3 campo edit
donde:
El primer y segundo campo edit.- se ingresara los valores que se va a sumar.
El tercer campo edit.- mostrara el resultado.
Ademá s debe tener 3 botones con las siguientes funciones:
El primer botón.- Debe hacer la suma.
El segundo botón.- Debe borrar todo los campos edit.
El tercer botón.- cerrar la ventana.
Para desarrollar este programa es necesario usar lo siguiente:
1.- la funciones atodw y dwtoa descritas en el capitulo III.
2.- Debes usar la instrucción add (suma).
Se pide el resultado en decimales, la idea es algo parecido a esta:
(http://img146.imageshack.us/img146/3193/parecido.jpg)
Archivo Ejercicio2VI.ASM :
Citar.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include Ejerc2IV.inc
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
.elseif eax==WM_COMMAND
mov edx,wParam
.if eax==Boton01 ; aqui comparo si e presionado el Boton01 que seria Sumar
;si es asi ... realiza la siguiente funcion
mov ebx,Edit01
mov eax,Edit02
add ebx,eax
invoke dwtoa,ebx,addr Edit03 ; aqui dice que esta el error ...
.elseif edx==Boton02 ; este seria el boton de Limpiar pero no se como se hace
.elseif edx==Boton03 ; el boton Salir
invoke SendMessage,hWin,WM_CLOSE,0,0
.endif
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
Archivo Ejercicio2VI.inc :
Citar
include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include masm32.inc
include rvlcnrand.Inc
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
includelib masm32.lib
includelib rvlcnrand.lib
DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
.const
IDD_DIALOG1 equ 101
Edit01 equ 1001
Edit02 equ 1002
Edit03 equ 1003
Boton01 equ 1004
Boton02 equ 1005
Boton03 equ 1006
;#########################################################################
.data
.data?
buffer db 225 dup (?)
hInstance dd ?
;#########################################################################
Desde ya Gracias :)
PD : Estoy estudiando los manuales de RadASM + MASM ... Ejercicio 2 del Capitulo VI.
Edit03 es un ID (un numero), no podes usar addr con el. Si lo que queres es obtener el valor de esos Edits podes usar GetDlgItemText (ahora ebx cuando llamas a dwtoa siempre es 1001 + 1002 = 2003).
Intenta cambiando estos valores:
.if eax==Boton01
mov ebx,Edit01
mov eax,Edit02
add ebx,eax
invoke dwtoa,ebx,addr Edit03
Por este:
.if edx==Boton01
mov ebx,Edit01
mov eax,Edit02
add ebx,eax
invoke dwtoa,ebx,Edit03
1001 + 1002 + 1003 ;)
Cita de: Eternal Idol en 18 Septiembre 2009, 21:48 PM
Edit03 es un ID (un numero), no podes usar addr con el. Si lo que queres es obtener el valor de esos Edits podes usar GetDlgItemText (ahora ebx cuando llamas a dwtoa siempre es 1001 + 1002 = 2003).
pero GetdlgItemtext no es para cadenas de texto ?
osea 1001 + 1002 = 10011002
:S
Me confundo mas :xD
Para sacar numeros de los edit mejor usa GetDlgInt :P
http://msdn.microsoft.com/en-us/library/ms645485(VS.85).aspx
Si, pero siempre es mejor que usar el ID del control y despues sacar el numero :D Tambien podes usar la funcion que menciono YST que hace eso mismo internamente pero si usas dwtoa supongo que no es el objetivo (tambien podrias usar SetDlgItemInt y no dwtoa en ese caso ...).
Tenes que obtener los dos primeros numeros y sumarlos, el valor de Edit03 lo tenes que poner vos de acuerdo al resultado de la suma y para eso vas a tener que usar un buffer (donde escribe dwtoa) y SetDlgItemText.
Bueno es que me confundi mucho :S
por que si lees en una parte dice :
Citar
Para desarrollar este programa es necesario usar lo siguiente:
1.- la funciones atodw y dwtoa descritas en el capitulo III.
2.- Debes usar la instrucción add (suma).
Asi que no consideraba mas funciones ... :S ...
PD : YST ... firefox no me deja entrar a Paginas de Microsoft :S :S :S ...
Gracias a los dos
EDIT : Probe con Opera , IE y pasa lo mismo .. me tira error al visitar cualquier pagina raiz de Microsoft
Mmm.
Talvez podrias crear una funcion llamada "Suma", creo que describen en esos tutoriales como hacerla con ejemplo de una resta pero no estoy seguro.
Creo que son asi pero no estoy seguro:
Suma proc cantidad1:DWORD,cantidad2:DWORD
mov eax,cantidad1
add eax,cantidad2
.inc
Suma PROTO :DWORD,:DWORD
Y por ultimo seria cambiar estas funciones:
mov edx,wParam
.if edx==Boton01
invoke Suma,Edit01,Edit02 ;esta es la funcion que creamos, aqui se supone que realiza la suma de ambas cantidades
invoke dwtoa eax,Edit03 ;Creo que asi debes mostrar el resultado (Inseguro)
Y esto lo podrias cambiar ya que talvez cause error en el programa:
.elseif edx==Boton03 ; el boton Salir
invoke SendMessage,hWin,WM_CLOSE,0,0
Por este codigo:
.elseif edx==Boton03 ; el boton Salir
invoke EndDialog,hWin,0
Estoy algo confundido por la escuela que no estoy seguro sobre como crear la funcion "Suma" pero puedes revisar el capitulo mencionado (creo que el 2) y por favor alguien de los buenos en ASM pueda corregirme a mi tambien ya que soy nuevo en ASM. :D
Cita de: JorGexD] link=topic=267886.msg1313102#msg1313102 date=1253574596]Asi que no consideraba mas funciones ... :S ...
A la fuerza vas a tener que usar alguna mas, de alguna manera tenes que obtener el numero (si es que lo es je) que el usuario escribe en el Edit.
AleX Inc. : es lo mismo de antes pero en una funcion, la clave es que no hay que usar los identificadores (valores constantes) sino lo que el usuario haya escrito.
La cosa vendria a ser algo asi (depuralo que no tengo el Ejerc2IV.inc ni muchas ganas tampoco):
invoke GetDlgItemInt, hWin, Edit01, 0, 0
mov ebx, eax
invoke GetDlgItemInt, hWin, Edit02, 0, 0
add eax, ebx
;ahi tenes la suma correcta en eax
invoke dwtoa, ebx, buffer
PD. Al final ahora me doy cuenta de que ya tenes un buffer declarado en la sección de datos ;D