PDA

Ver la Versión Completa : Abrir archivos con OpenDialog


radenf
20-11-2012, 12:47:38
Hola amigos

Quisiera saber cómo se pueden seleccionar simultáneamente todos los archivos de un tipo específico (por ejemplo .jpg) contenidos en una carpeta determinada, al seleccionar dicha carpeta en un OpenDialog.
Por defecto el OpenDialog permite abrir uno o varios archivos al seleccionarlos individualmente, pero yo necesito que se abran todos los archivos con una extensión determinada, al hacer click en la carpeta contenedora.

Saludos y muchas gracias

dec
20-11-2012, 12:54:19
Hola,

El componente "TOpenDialog" sirve para escojer uno o más archivos, pero, si lo que quieres es trabajar con los archivos de un determinado directorio, tal vez puedas usar la función "SelectDirectory" (http://www.delphibasics.co.uk/RTL.asp?Name=SelectDirectory). De este modo el usuario podrá escojer un determinado directorio, y, sabiendo su ruta, tú podrás buscar los archivos que te interesen dentro del mismo y hacer lo que sea menester con ellos.

P.D. Acaso podrías usar el "TOpenDialog" si extraes la ruta del directorio del archivo o archivos elejidos, sin embargo, me parece más apropiado usar "SelectDirectory", puesto que, en definitiva, no se trata de elegir entre uno o más archivos, sino más bien todos los archivos de un determinado directorio.

radenf
20-11-2012, 13:13:28
Muchas gracias dec .
Voy a probar y te cuento.
Salu2

radenf
20-11-2012, 13:47:57
No es exactamente lo que necesito.
Mi intención es simplificarle el trabajo al usuario del programa.
Yo utilizo el siguiente código para cargar una tabla que después leo con un componente específico (DicomMultiViewer1)

var i:Integer;
begin
CnsDMTable1.Clear;
DicomMultiViewer1.DicomDatasets.Clear;
if OpenDialog1.Execute then
begin
for i := 0 to OpenDialog1.Files.Count - 1 do
begin
CnsDMTable1.LoadFromFile(OpenDialog1.Files[i], true);
end;
end;
DicomMultiViewer1.Update;
end;

La idea es que al seleccionar ya sea el directorio que contiene los archivos o bien cualquiera de los archivos existentes en dicho directorio, se seleccionen todos automáticamente.
¿Existe algo que pueda agregar a mi código que me permita hacerlo?

Salu2 y gracias nuevamente

movorack
20-11-2012, 14:18:16
Creo que lo que necesitas va por el camino que te ha mostrado dec.

Si seleccionas solo el directorio con SelectDirectory o si seleccionas un archivo y a este le extraes el path es totalmente válido.

El siguiente paso es buscar todos loas archivos de ese directorio que se ajusten a tu requerimiento.

En About.com encontré un articulo (http://delphi.about.com/cs/adptips1999/a/bltip1199_5.htm) de como leer los archivos de un directorio. Podrías echarle un vistazo.

radenf
20-11-2012, 18:24:42
Muchas gracias [movorack] :
¿Cómo puedo extraer el path del directorio desde el OpenDialog y pasarselo a mi código?
Salu2

ecfisa
20-11-2012, 18:24:51
Hola radenf.

De este modo carga todos los archivos de la carpeta cuya extensión sea la misma que el archivo abierto mediante TOpenDialog:

...
procedure GetFileNames(Path: string; TS: TStrings);
var
sr: TSearchRec;
toFind: string;
begin
if FindFirst(ExtractFilePath(Path)+'*'+ExtractFileExt(Path),faArchive,sr) = 0 then
repeat
TS.Add(sr.Name);
until FindNext(sr) <> 0;
end;

procedure TForm1.btnCargarToCnsClick(Sender: TObject);
var
i: Integer;
begin
with OpenDialog1 do
if Execute then
begin
GetFileNames(FileName, Files);
for i:= 0 to Files.Count-1 do
CnsDMTable1.LoadFromFile(Files[i]);
end;
end;


Saludos. :)

radenf
20-11-2012, 18:48:05
Muchas gracias ecfisa :

El código que me has propuesto me genera los siguientes errores:

Al compilar señala:

[DCC Warning] VisorDicom.pas(932): W1002 Symbol 'faArchive' is specific to a platform
[DCC Warning] VisorDicom.pas(930): H2164 Variable 'toFind' is declared but never used in 'GetFiles'

Al ejecutarse envía el siguiente mensaje de error:

Cannot open file "C:\Users\IV\Documents\Proyectos Delphi 2007\Proyecto Dicom Viewer\1.2.840.157.dcm". El sistema no puede encontrar el archivo especificado.

Sin embargo el archivo al que se refiere si lo carga, pero no el resto de los archivos que poseen la misma extensión (.dcm) que se encuentran en el directorio seleccionado.
La variable 'toFind' la eliminé y el resultado fue el mismo.


Saludos

ecfisa
20-11-2012, 19:19:29
Hola radenf.

En realidad no son errores, son advertencias.

La primera indica que ese símbolo está atado a funcionar bajo W32, si queremos hacer como el avestruz :) y que no muestre la advertencia, basta con reemplazar faArchive por el número 32.
La segunda es un residuo:o de cuando evaluaba si quedaba más legible asignar la larga línea de composición del nombre a una cadena... podes borrar la variable sin problema.


En cuanto al mensaje de error es extraño... No se produjo en ninguna de las pruebas que hice, lógicamente como no poseo el componente CnsDMTable1, probé con otros tipos de archivos.

Hace la siguiente prueba para ver si los nombres de archivos de la carpeta "C:\Users\IV\Documents\Proyectos Delphi 2007\Proyecto Dicom Viewer" son cargados correctamente:


procedure GetFileNames(Path: string; TS: TStrings);
var
sr: TSearchRec;
begin
if FindFirst(ExtractFilePath(Path)+'*'+ExtractFileExt(Path),32,sr) = 0 then
repeat
TS.Add(sr.Name);
until FindNext(sr) <> 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
with OpenDialog1 do
if Execute then
begin
GetFileNames(FileName, Files);
for i:= 0 to Files.Count-1 do
ListBox1.Items.Add(Files[i]); // agrega un ListBox y cambia por esta línea
end;
end;


Saludos.:)

ecfisa
20-11-2012, 19:33:28
Hola radenf.

Hoy no estoy con el mejor de los días... :o Claro que no iba a encontrar los archivos, no agregué la ruta al nombre !


procedure GetFileNames(Path: string; TS: TStrings);
var
sr: TSearchRec;
begin
if FindFirst(ExtractFilePath(Path)+'*'+ExtractFileExt(Path),32,sr) = 0 then
repeat
TS.Add(ExtractFilePath(Path) + sr.Name);
until FindNext(sr) <> 0;
end;


Saludos. :)

radenf
20-11-2012, 20:21:21
Muchas gracias ecfisa .

Funciona a la perfección. Era justo lo que necesitaba.
¿Es posible lograr lo mismo seleccionando la carpeta que contiene los archivos?

Salu2

ecfisa
20-11-2012, 20:43:27
Muchas gracias ecfisa .

Funciona a la perfección. Era justo lo que necesitaba.
¿Es posible lograr lo mismo seleccionando la carpeta que contiene los archivos?

Salu2
Me temo que con el componente TOpenDialog no lo es, ya que sólo permite aceptar algún archivo o cancelar la operación.

Saludos.:)

radenf
20-11-2012, 20:56:03
Muchas gracias de nuevo ecfisa.
Salu2