Access to address 0 usually happens due to an uninitialized pointer. Try to single step through Button3Click() just to make sure the
exception really is thrown there. As the second parameter of BlockRead() is concerned you are doing alright. The procedure signature states the second parameter as an untyped variable, so you can pass in any variable type you like.
marabu