Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir archivos con OpenDialog (https://www.clubdelphi.com/foros/showthread.php?t=81498)

radenf 20-11-2012 12:47:38

Abrir archivos con OpenDialog
 
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". 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)

Código Delphi [-]
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 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:
Código Delphi [-]
...
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:

Código Delphi [-]
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 !

Código Delphi [-]
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

Cita:

Empezado por radenf (Mensaje 450006)
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


La franja horaria es GMT +2. Ahora son las 10:03:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi