PDA

Ver la Versión Completa : Enviar Varios archivos susesivamente a ap. externa?


jonydread
25-11-2011, 14:40:11
Hola amigos,
Tengo un problemilla que no he podido resolver, uso una aplicación externa la cual recibe de a un archivo y he estado tratando de enviarle múltiples archivos pero necesito enviarlos de a uno sucesivamente
uso una función que me paso Ecfisa para darle una entrada y salida del fichero convertido

Origen := listbox1.Items.Strings[i];
Destino := ChangeFileExt(Origen,'.inf');
LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
la única forma que encuentro es manual ir eliminando archivo ya convertido de la lista y darle de nuevo al botón
si alguien sabe de alguna forma agradecería mucho.
muchas gracias
Saludos!

ecfisa
25-11-2011, 16:03:24
Hola.

Pienso que el problema se presenta por que Reg2Inf.exe no devuelve el control a la aplicación que lo invoca. Como te imaginas, me es imposible comprobarlo ya que ni siquiera sé que es lo que hace Reg2Inf.exe. Pero supongo que es una aplicación DOS. Si es así, quizá la prueba que realizé te pueda servir de algo.

Primero create 3 archivos de texto con algún contenido y llamalos ARCHIVO1.TXT, ARCHIVO2.TXT y ARCHIVO3.TXT. (En mi caso los situe en C:\TEMP)

Hacé un archivito de texto con el siguiente contenido:

@ECHO OFF
CLS
ECHO %1 %2

Guardalo como Reg2Inf.bat (en mi caso C:\'), lo único que hace es mostrar los parámetros enviados.

Luego desde Delphi:

...
implementation

uses
ShellApi;

{ Archivos .TXT al Combo }
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i:= 1 to 3 do
ComboBox1.Items.Add('C:\TEMP\ARCHIVO'+IntToStr(i)+'.TXT');
end;

{ funcion que llama a Reg2Inf }
procedure LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string;
const Destino: string);
begin
ShellExecute(Hnd,
'OPEN',
PChar(App),
Pchar(Origen+' '+Destino),
PChar(ExtractFilePath(App)),
SW_SHOW); // quité SW_HIDE para visualizar el efecto
end;

{ cambia la extension .TXT por .INF (o la que gustes) }
function CambiarExt(Nom: string): string;
begin
SetLength(Nom, Length(Nom)-Length(ExtractFileExt(Nom)));
Result:= Nom+'.INF';
end;

{ Ejecuta y queda command prompt }
procedure TForm1.btnExecAndStayClick(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to ComboBox1.Items.Count -1 do
LlamarReg2Inf(Handle,'CMD', '/K C:\Reg2Inf.BAT '+ComboBox1.Items[i],
CambiarExt(ComboBox1.Items[i]));
end;

{ Ejecuta y devuelve el control }
procedure TForm1.btnExecAndExitClick(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to ComboBox1.Items.Count -1 do
LlamarReg2Inf(Handle,'CMD', '/C C:\Reg2Inf.BAT '+ComboBox1.Items[i],
CambiarExt(ComboBox1.Items[i]));
end;
end.

Como podrás comprobar funciona correctamente: Si enviás como parámetro '/K' muestra los nombres y queda en el command prompt y si envias '/C' hace lo propio y se devuelve el control.

Resumiendo, probá cambiando Reg2Inf.BAT por Reg2inf.EXE a ver que nos dice Reg2Inf.exe ... :rolleyes:

Un saludo.

jonydread
26-11-2011, 03:55:46
Hise la prueba y funciona de lujo ahora a trabajar en mi codigo para añadirlo
una consulta
en esta parte del codigo para insertar mediante opendialog los archivos, se puede?
y 1 al 3 se puede poner algo asi asta el ultimo archivo cargado
for i:= 1 to 3 do

for i:= 1 to 3 do
Listbox1.Items.Add('C:\TEMP\ARCHIVO'+IntToStr(i)+'.reg');

Gracias por la ayuda :D

jonydread
26-11-2011, 05:20:33
Hise la prueba y funciona de lujo ahora a trabajar en mi codigo para añadirlo
una consulta
en esta parte del codigo para insertar mediante opendialog los archivos, se puede?
y 1 al 3 se puede poner algo asi asta el ultimo archivo cargado

for i:= 1 to 3 do
Listbox1.Items.Add('C:\TEMP\ARCHIVO'+IntToStr(i)+'.reg');

Gracias por la ayuda :D

que pregunta :o ya solucione eso
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Opendialog1.Execute;
for i:= 0 to Opendialog1.Files.Count-1 do
Listbox1.Items.Add(opendialog1.files[i]);
end;

jonydread
26-11-2011, 06:40:21
disculpa tantos post pero he ido avanzando y me surgen dudas que no he podido realizar solo, es si puedo modificar esta funcion para obtener nombre corto conservando el nombre completo porque he probado en otra parte del codigo con getshortname funciona pero el nombre lo tira con esos tildes
function CambiarExt(Nom: string): string;
begin

nom:= AnsiReplaceStr(nom,' ','');
SetLength(Nom, Length(Nom)-Length(ExtractFileExt(Nom)));
Result:= Nom+'.inf';
end;

antes lo hacia asi

Path:=GetshortName(ExtractFilePath(Opendialog1.FileName));
Filename := Extractfilename(opendialog1.FileName);
Origen := GetshortName(opendialog1.FileName);
Filename:= AnsiReplaceStr(Filename,' ','');

y colocaba origen, path+filename pero ahora no da resultados...