Yo creo que si bien te funciona, no es la solucion correcta. Los parametros fueron pensados para que uno pueda enviar los datos de "alto nivel", en este caso, una fecha, y no tener que andar lidiando con conversiones. En el primer codigo que muestras estas usando la propiedad DateTime del DateTimePicker, la cual es de tipo TDateTime. es decir, fecha + hora
Mientras que en el segundo caso, si bien estas conviertiendo a string mediante la funcion DateToStr, la propiedad que estas accediendo del DateTimePicker es la Date, la cual devuelve un TDate lo cual es fecha unicamente, sin la hora
Ademas la funcion DateToStr realiza la conversion teniendo en cuenta la configuracion regional del equipo, lo cual de modificarse, podria alterar el comportamiento de tu programa de manera inadvertida
No entendi la ultima consulta que planteaste:
En una ibqueri tengo una variable (:datavend) lo que necesitaba es poder agarrar el valor de esa variable,y compararla con el datetimepicker,con este codigo mas arriba consegui resolver.
No podes tener "variables" dentro de un componente Query. Lo que podes llegar a tener son parametros, esto es informacion de entrada que le mandas a la sentencia SQL (ok, existen parametros de salida tambien, pero creo que no es el caso y no quiero complicar mas la situacion) ; o podes tener campos o "fields", que es la informacion de salida, nada mas y nada menos que los campos de las tablas de la base de datos
Si es el segundo caso, simplemente podes obtener el campo y su valor de esta manera:
field := tuQuery.FieldByName('nombreDelCampo'); // --> esto devuelve un objeto TField
// TField entiende varios mensajes muy utiles, sobre todo los que se usan para acceder a sus campos:
field.AsString; // el valor del campo como un string
field.AsInteger; // idem pero de tipo integer
field.AsDateTine; // para fecha+hora
Aca hay una lista de metodos que entiende la clase TField
No es necesario que guardes en una variable el TField como el ejemplo de arriba. De hecho, por lo general, la forma idiomatica es la siguiente:
tuQuery.FieldByName('nombreCampo').AsInteger;
tuQuery.FieldByName('nombreCampo').AsString;
tuQuery.FieldByName('nombreCampo').AsFloat;
tuQuery.FieldByName('nombreCampo').AsLoQueCorresponda;