PDA

Ver la Versión Completa : Problemas con Topenpicuredialog


oregon
18-10-2006, 10:08:56
Saludos,

Tal vez la pregunta sea de lo más tonta, pero no llevo mucho tiempo en esto y he visto que por aquí andan auténticos expertos.
Trabajo con Turbo Delphi 2006 en windwos xp -Home.

Tengo un problema con Topenpicturedialog. En un form tengo un Timage. Para asignarle una imagen en runtime, tengo un componente Topenpicturedialog. He añadido la clausula jpeg a Uses.
Para asignar la imagen, en el onclose del componente topenpicturedialog he hecho:

image1.picture.loadfromfile(topendialog1.filename);

y me da error. Me dice que no reconoce la extensión. He probado con bmp, ico, png,... en fin, todo tipo de imágenes y no hay manera.

Por ver si era otro tipo de error, he creado una variable y la he llamado de la siguiente manera en el onclose:
var
img:string;
beging
img:=topenpicturedialog1.filename;
image1.picture.loadfromfile(img);
end

y nada de nada. Con el fin de ver cual es el problema, he creado un label y le he asignado el valor de img en el caption, y oh sorpresa!, me muestra símbolos y no el path a ninguna imagen.

¿Estoy haciendo bien las cosas? ¿donde estoy metiendo la pata? Solo quiero que el usuario busque y carge la imagen que quiera en el componente timage...

Muchas gracias por ayudarme con esto.
Ciao!

M.A. de Pablo

dec
18-10-2006, 10:15:09
Hola,

Generalmente no es en el evento "OnClose" del componente que mencionas donde se accede a la imagen en cuestión. De hecho es posible que en ese evento la propiedad "FileName" no sea la correcta: esto deberías comprobarlo, simplemente, echándola un vistazo ("ShowMessage") o, directamente, viendo si existe el archivo con "FileExists" por ejemplo.

Pero, como he dicho, como norma general (vale para el resto de cuadros de diálogo similares) se accede a la propiedad "FileName" acto seguido de presentar al usuario el diálogo en cuestión. Es más fácil verlo que otra cosa:


begin
with TOpenPictureDialog.Create(Self) do
begin
if(ShowModal = mrOk)
begin
ShowMessage(FileName);
end;
end;
end;


O, de otro modo:


var
dlg: TOpenPictureDialog;
begin
dlg := TOpenPictureDialog.Create(Self);
try
if dlg.ShowModal = mrOk then
begin
ShowMessage(dlg.FileName);
end;
finally
dlg.Free;
end;
end;


Nota que el código, aunque sencillo, no está comprobado: puede que se me fuera alguna cosa, pero, la idea que trata de exponer es la siguiente: se muestra al usuario el diálogo de forma "modal", esto es, el usuario deberá elegir un archivo de imagen (en este caso) o, simplemente, cancelar el diálogo.

Tú únicamente estarás pendiente de que cuando se cierre el diálogo "ShowModal" te retorne la constante "mrOk", lo que significará que el usuario ha elegido, efectivamente, un archivo. Entonces puedes obrar en consecuencia y hacer lo que tengas que hacer con dicho archivo. En todo caso no dejes de revisar las opciones conque cuentan estos tipos de diálogos.

seoane
18-10-2006, 12:56:01
if dlg.ShowModal = mrOk then


:confused: Hasta donde yo se los diálogos no cuentan con el método ShowModal. ¿Por que no usar el clásico Execute?


if dlg.Execute then

dec
18-10-2006, 13:30:50
Hola,

Así es la verdad Domingo. Obviamente me equivoqué y donde dije "ShowModal" quería decir "Execute". ;)

Con la particularidad de que sobra la comparación "Execute = mrOk", que, además de no funcionar, no es precisa.

Pido disculpas.

oregon
18-10-2006, 16:40:26
Perfecto!

Muchas gracias a todos, porque siempre encuentro soluciones interesante navegando por el foro y aprendiendo de toda vuestra experiencia.

Ciao!