Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Abrir archivo de texto con el bloc de notas (https://www.clubdelphi.com/foros/showthread.php?t=59830)

noob 10-09-2008 13:02:27

Abrir archivo de texto con el bloc de notas
 
Hola soy nuevo y he hecho una prueba en Delphi 6 con un TMemo y un TButton para que cuando pulse en el botón se me abra con el block de notas un archivo de texto y que se refleje en el TMemo también.

He metido este código en el evento OnClick del TButton basándome en esto:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  linea: string;
  St: Array[0..255] of char;
  SW_SHOW: longint;
begin
  SW_SHOW := 0;
  // Archivo está declarado como atributo privado del formulario --> Archivo: Text;
  System.Assign(Archivo,'prueba.txt'); 
  System.Rewrite(Archivo);
  System.Writeln(Archivo,'Hola');
  System.Close(Archivo);
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Formulario creado.');
  Memo1.Lines.Add('Archivo creado.');
  System.Reset(Archivo);
  System.Readln(Archivo,linea);
  Memo1.Lines.Add(linea);
  System.Close(Archivo);
  // Pongo en el uses ShellAPi para que reconozca ShellExecute
  ShellExecute(Handle,'open',StrPCopy(St,'C:\a\a.txt'),nil,nil,SW_SHOW);
end;

Pero lo único que ocurre es que se rellena el TMemo pero no se abre el archivo de texto con el block de notas.

Salu2.

dec 10-09-2008 13:16:39

Hola,

¿Quieres decir que se abre el "bloc de notas" pero se muestra vacío? ¿Estás seguro de que existe el archivo "C:\a\a.txt"? Porque tú, según me parece, estás trabajando con archivos distintos para el "memo" y para el "bloc de notas". Por otro lado, no sé si podrías usar el método "LoadFromFiles()" conque cuenta la propiedad "Lines" del "TMemo".

tcp_ip_es 10-09-2008 13:24:57

a parte de lo que te dice dec....

Código Delphi [-]

ShellExecute(Handle, 'open', 'notepad.exe', 'c:\a\a.txt', '', SW_SHOW);

noob 10-09-2008 13:33:41

Cita:

Empezado por dec (Mensaje 313072)
¿Quieres decir que se abre el "bloc de notas" pero se muestra vacío? ¿Estás seguro de que existe el archivo "C:\a\a.txt"? Porque tú, según me parece, estás trabajando con archivos distintos para el "memo" y para el "bloc de notas". Por otro lado, no sé si podrías usar el método "LoadFromFiles()" conque cuenta la propiedad "Lines" del "TMemo".

Te contesto por partes:

Directamente no se abre el block de notas.
El archivo C:\a\a.txt si que existe, tienes razón al decir que este archivo y el del memo son distintos, lo cambié al escribir el post porque la ruta del archivo prueba.txt era muy larga.
Lo de usar el método LoadFromFile para el memo es lo de menos porque eso ya veo que funciona, lo que quiero es que se abra el archivo de texto con el block de notas.

Cita:

Empezado por tcp_ip_es (Mensaje 313073)
a parte de lo que te dice dec....

Código Delphi [-]
ShellExecute(Handle, 'open', 'notepad.exe', 'c:\a\a.txt', '', SW_SHOW);

Hago esto que me dices y sigue sin abrirse el block de notas...

dec 10-09-2008 13:41:00

Hola,

Comprueba el error de "ShellExecute()", si existe: intenta con la función "GetLastError()", porque es muy raro eso que ocurre... ¿igual es que no existe "notepad.exe" en tu sistema?

seoane 10-09-2008 14:08:25

Siguiendo el consejo de dec, coloca esto justo despues del ShellExecute:
Código Delphi [-]
ShowMessage(SysErrorMessage(GetLastError));

noob 10-09-2008 14:15:14

Cita:

Empezado por dec (Mensaje 313077)
Hola,

Comprueba el error de "ShellExecute()", si existe: intenta con la función "GetLastError()", porque es muy raro eso que ocurre... ¿igual es que no existe "notepad.exe" en tu sistema?

Jeje, si, si que existe notepad.exe en mi sistema.

Cita:

Empezado por seoane (Mensaje 313083)
Siguiendo el consejo de dec, coloca esto justo despues del ShellExecute:
Código Delphi [-]
ShowMessage(SysErrorMessage(GetLastError));

He he hecho esto y obtengo el mensaje "La operación se ha completado correctamente" eso si, no se abre el notepad con el archivo de texto. Esto es mazo de raro.

Este es el código que tengo:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPi;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    Archivo: Text;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  linea: string;
  St: Array[0..255] of char;
  SW_SHOW: longint;
begin
  SW_SHOW := 0;
  // Archivo está declarado como atributo privado del formulario --> Archivo: Text;
  System.Assign(Archivo,'C:\a\b.txt');
  System.Rewrite(Archivo);
  System.Writeln(Archivo,'Hola');
  System.Close(Archivo);
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Formulario creado.');
  Memo1.Lines.Add('Archivo creado.');
  System.Reset(Archivo);
  System.Readln(Archivo,linea);
  Memo1.Lines.Add(linea);
  System.Close(Archivo);
  // Pongo en el uses ShellAPi para que reconozca ShellExecute
  ShellExecute(Handle,'open','notepad.exe','C:\a\b.txt','',SW_SHOW);
  ShowMessage(SysErrorMessage(GetLastError));
end;

end.

dec 10-09-2008 14:25:10

Hola,

Lo raro es que no te funcionara "a la primera". Yo quitaría el "notepad.exe", o bien proporcionaría la ruta completa al "notepad.exe", pero,... desde luego es algo raro esto. ¿No puedes ver siquiera el proceso del "bloc de notas" funcionando? Quizá se esté ejecutando, pero, no se esté terminando de mostrar...

noob 10-09-2008 14:32:05

Cita:

Empezado por dec (Mensaje 313088)
Hola,

Lo raro es que no te funcionara "a la primera". Yo quitaría el "notepad.exe", o bien proporcionaría la ruta completa al "notepad.exe", pero,... desde luego es algo raro esto. ¿No puedes ver siquiera el proceso del "bloc de notas" funcionando? Quizá se esté ejecutando, pero, no se esté terminando de mostrar...

Ahora que lo dices he hecho Ctrl + Alt + Supr y me he ido a Administrador de tareas / Procesos para ver los procesos que están corriendo y hay como más de veinte procesos notepad.exe corriendo, ¿esto es malo verdad?

dec 10-09-2008 14:38:53

Hola,

Se ve que algo ha ido mal en un momento dado, y a partir de ahí todos los "notepad" que se ejecutaban quedaban ahí... como "muertos"... Así que comienza de nuevo: cierra todos los "notepad" (claro, guarda el que sea si estás trabajando con el mismo) y vuelve a probar a ver...

noob 10-09-2008 14:45:05

He matado todos los procesos notepad.exe desde el Administrador de tareas / Procesos, he vuelto a probar y nada, sigue sin abrirse el archivo de texto mediante el block de notas y si me voy a Administrador de tareas / Procesos para ver los procesos que están corriendo veo que hay un proceso notepad.exe que antes no estaba.

Caro 10-09-2008 14:55:17

Hola noob, comenta estas dos líneas de tu codigo.

Código Delphi [-]
  ............
  //SW_SHOW: longint; esta
begin
  //SW_SHOW := 0; y esta
  // Archivo está declarado como atributo privado del formulario --> Archivo: Text;
  System.Assign(Archivo,'C:\a\b.txt');
  .....................
  .....................

Saluditos

dec 10-09-2008 14:57:40

Hola,

Ahí está a buen seguro el problema (?) Caro, muy bien visto. :) ;)

noob 10-09-2008 14:58:28

Cita:

Empezado por Caro (Mensaje 313101)
Hola noob, comenta estas dos líneas de tu codigo.

Código Delphi [-]
  
  ............   
  //SW_SHOW: longint; esta 
begin   
  //SW_SHOW := 0; y esta   
  // Archivo está declarado como atributo privado del formulario --> Archivo: Text;   
  System.Assign(Archivo,'C:\a\b.txt');   
  .....................   
  .....................

Saluditos

Ahora si que funciona, gracias a todos.

Saluditos.

tcp_ip_es 10-09-2008 15:11:06

es cierto, y no nos dimos cuenta :eek: .....

cita: ayuda delphi

Cita:


If lpFile specifies a document file, nShowCmd should be zero.
pero como es un ejecutable... aunque SW_SHOW debería ser sololectura y no poderle asignarle 0 no???

en fin otra cosa más que sabemos...

PallyRS 30-12-2008 16:02:02

Hola amigos:

Pues resulta que incomprensivamente me dice esto mi Delphi.
[Error] UInventario.pas(110): Undeclared identifier: 'ShellExecute'

¿Por qué puede ser eso?

Gracias

Edición: Resuelto el error. Agregué en USES ShellAPI

PallyRS 30-12-2008 16:49:02

pude resolver el problema anterior. Ahora la duda principal es la siguiente:

En los ejemplos de este hilo, siempre se trata de una fichero con un camino predefinido. ¿Cómo darle solución al mismo problema pero el nombre del fichero es variable?

Ejemplo para que tengan una idea del planteamiento

ShellExecute(Handle,'open','notepad.exe','C:\Archivos de Programa\emprequin\inventariopc\txt\',+DBEOrdenador.Text'',SW_SHOW);


Lo expuesto en rojo por supuesto que da error, pero la cuestión como lograr que cada vez que me desplace por una tabla y oprima un botón me sea mostrado el txt correspondiente al nombre de la pc mostrada.

Gracias

PallyRS 30-12-2008 18:29:48

Hola Foro:

Solución encontrada. La respuesta que me sirvió fue la que ofrece el Forista dec, es sencilla y muy bien pensada, todo un hacking (Hachazo) como en los viejos tiempos.

Saludos a todos:

La respuesta está aqui: http://www.clubdelphi.com/foros/show...t=shellexecute

En específico la #7


La franja horaria es GMT +2. Ahora son las 18:59:42.

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