Newsgroup: it.comp.lang.delphi
Titolo: Notepad.exe

Avrei bisogno di aprire in un applicazione D7 una istanza
di Notepad e caricarci dentro alcune linee di testo da
prelevare da una Tmemo.
Per aprire il notepad.exe nessun problema:
uses ShellApi;
...
ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', nil, nil, SW_SHOWNORMAL) ;
ma per "ficcarci" dentro del testo ?
Grazie
GP 

 ma per "ficcarci" dentro del testo ?
Salvi il testo in un file pippo.txt e lo carichi con:
"notepad.exe pippo.txt"
(occhio che i parametri alla ShellExecute devi passarli separatamente)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 -- 
Grazie
ma come avevo specificato, non ho il file pippo.txt ma una Tmemo.
Col file esterno era facile.....  :-)
Ciao
GP 

 ma come avevo specificato, non ho il file pippo.txt ma una Tmemo.
Già, e l'avevo letto.  Davo per scontato che avessi capito di salvare il
contenuto del memo in un file esterno ;-)



Se potevo passare per un file l'avevo già fatto, era implicito nella soluzione facile.
Grazie lo stesso.
GP 

 Se potevo passare per un file l'avevo già fatto[...]
Non avevi specificato di non poterlo fare ;-)



Devi ritrovare la finestra del notepad, cercarne la prima finestra 
figlia e poi mandare tanti messaggi WM_CHAR quanti sono i caratteri 
della stringa da mandare:
// non testato!
var
   wnd, chld : HWND
   S : string;
begin
    S := Memo1.Lines.Text;
    wnd := FindWindow( 'NOTEPAD', nil );
    chld := GetWindow( wnd, GW_CHILD );
    for i:= 1 to length(S) do
      SendMessage( chld, WM_CHAR, Ord(S[i]), 0 );
end;
Alternativamente, invece di usare la ShellExecute, puoi usare la 
CreateProcess per creare il processo, poi dall'handle del processo 
ricavi l'handle della finestra, mi sembra se ne sia parlato poco fa 
proprio su questo ng.
ciao
Giacomo

Ciao.
Non vorrei sbagliarmi, e magari non ti dico niente di nuovo, ma puoi
esportare il contenuto del TMemo su file di testo:
      TMemo.Lines.SaveToFile('c:\pippo.txt');
certo, a patto che tu sia disposto a creare, apposta, un file di testo
di appoggio.
Ciao

 ha scritto nel messaggio

Grazie Giacomo
di seguito il tuo esempio corretto, testato e funzionante.
var
   wnd, chld : HWND;
   S : string;
   i: integer;
begin
  ShellExecute(Handle, 'open', 'notepad.exe', nil, nil, SW_SHOWNORMAL) ;
  S := Memo1.Lines.Text;
  wnd := FindWindow('notepad', nil );
  chld := GetWindow(wnd, GW_CHILD );
  for i:= 1 to length(S) do
      SendMessage(chld, WM_CHAR, Ord(S[i]), 0 );
 end;
Grazie ancora
GP 


Una piccola correzzione:
//  ShellExecute(Handle, 'open', 'notepad.exe', nil, nil, SW_SHOWNORMAL) ;
  WinExec( 'notepad.exe', SW_SHOWNORMAL );
nella versione precedente il notepad veniva riempito solamente al secondo click (seconda istanza aperta)
Con WinExec invece il problema non si presenta ed il notepad viene riempito immediatamente con il contenuto
del testo del campo memo.
GP 

del testo del campo memo.
Non è un problema di API, la ShellExecute/ShellExecuteEx va bene; è
solo che devi aspettare che il thread abbia creato la coda di
messaggi, quindi devi ciclare con una PostMessage di un WM_USER fino a
che non ottieni un risultato positivo, prima di inviare i messaggi
WM_CHAR.  In ogni caso, tieni presente che WinExec non va usata[*] ed
è un wrapper per CreateProcess.
[*] Dal Platform SDK: "Win32-based applications should use the
CreateProcess function rather than this function. The WinExec function
exists in Win32 to provide compatibility with earlier versions of
Windows".


Grazie per la precisazione.
Descrivo la situazione:
una procedura riempie un Tmemo con dei messaggi. Al termine con un click
su un pulsante, il testo del memo deve venire copiato nel notepad. Sembrerebbe facile.
Con ShellExecute dopo la *prima* pressione viene aperto notepad ma rimane vuoto.
Aspetta..., aspetta... non sucecde niente. Ri-premo il pulsante. Si apre un nuovo notepad e dentro
vengono inserite immediatamente le righe del memo. Chiudo l'applicazione e Delphi. La eseguo da esplora
risorse con doppio click sull'eseguibile, per capire se il problema č Delphi7 aperto. Tutto va come prima;
al primo click si apre subito notepad vuoto. Se riclicco si apre un altro notepad con le righe del memo.
Ovviamente il primo notepad riamane vuoto.
Se invece uso WinExec appena premo il pulsante si apre notepad con dentro le righe del memo.
Questi sono i fatti.
Non so perchč, ma č cosě.
Ciao
GP 

Non so perchè, ma è così.
Il perché mi sembrava di avertelo spiegato... Hai provato ad applicare
le modifiche che ti ho detto ?

G.P. ha scritto:

da un esempio nel mio catalogo.
Nun me ammazzate..
unit Unit1;
interface
uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
Forms,
   Dialogs, StdCtrls;
type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
var
   Form1: TForm1;
implementation
{$R *.dfm}
function SendTextToWindow(const hWnd: HWND; const text: string):boolean;
var
   pText: PChar;
begin
   pText := StrNew(PChar(text));
   try
     result := SendMessage(hWnd, WM_SETTEXT, 0, Integer(pText)) = 
Integer(true);
   finally
     StrDispose(pText);
   end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
   hNotepad: HWND;
   hNotepadEdit: HWND;
begin
   hNotepad := FindWindow('notepad', nil);
   hNotepadEdit := FindWindowEx(hNotepad, 0, 'Edit', nil);
   if IsWindow(hNotepadEdit) then
     SendTextToWindow(hNotepadEdit, timetostr(now)+#13#10)
   else
     raise Exception.Create('Impossibile determinare l''handle 
dell''edit del Notepad.');
end;
end.