Newsgroup: it.comp.lang.delphi
Titolo: Word by Delphi: riesco a far apparire il dialogo di Ricerca, ma non riesco ad interagirci...

Devo riuscire ad aprire (con Delphi 6-7) un file di Word (2003)
esistente e posizionarmi all'inizio di un suo TextBox.
Detta così sembra semplice, in pratica ci sto impazzendo:
- a colpi di cursore, dentro i TextBox non ci entro proprio
- con i bookmark...nemmeno
- l'alternativa che sto tentando è quella di sfruttare un Find per
spostarmi (ponendo nel file un carattere ben preciso all'inizio del
textbox): facendolo a "mano" funziona, ma non riesco ad automatizzarlo
con Delphi. 
Ho provato con:
   - OfficePartner: già questa funzione aveva mostrato qualche bug in
un'altra occasione, ma in questo caso non fa assolutamente nulla
   - sono riuscito a far comparire il dialogo di ricerca di Word
(simulando la pressione di Alt-E e poi F [in quanto Ctl-F non mi
funziona by Delphi], ma non riesco ad inviargli alcun carattere, poichè
non riesco a trovarne l'handle: ho provato con un programma (InfoSpy
fornito con AutoIt) per conoscerne la classe, il titolo esatto per poi
cercarne l'handle con FindWindow e FindWindowEx, ma non riesco a
trovarlo...ho provato a cercarlo sia del campo che del dialogo in
generale, ma nisba...
Finora l'unica soluzione che funziona, ma che mi repelle alquanto per la
farragginosità, è richiamare da Delphi l'esecuzione di un file di script
AutoIt3 che fa il suo dovere in una riga: Send("^f.!f~{ESC}")
Ecco una delle tante versioni:
(ho messo degli sleep in quanto ho visto che non sempre ottenevo
risposta ai comandi se inviati precocemente)
Hand1 := FindWindow('OpusApp', nil);  // trovo l'handle di Word
sleep(500);
Hand2:=GetWindow( hand1, GW_CHILD );  // ne ricavo la finestra "figlia" 
sleep(500);
PostKeyEx( hand2, Ord('E'), [ssAlt], false ); // Chiamo il menu Edit
sleep(100);
PostKeyEx( hand2, Ord('F'), [], false );  // e premo F (Find)
// FIN QUI FUNZIONA e fa apparire il dialogo di ricerca
// Da qui in poi non so come simulare la pressione di tasti nel dialogo
// Vorrei dire di cercare il carattere '.'
// Nei seguenti commenti alcuni dei molti tentativi che ho provato
sleep(100);
Hand3:=FindWindowex(hand1,0,pchar('bosa_sdm_Microsoft Office Word
11.0'),pchar(''));
//Hand3:=FindWindow('RichEdit20W1','');
//Hand3:=FindWindowex(hand2,0,'RichEdit20W1','');
if hand3 <>0 then ShowMessage('Trovato!') else  ShowMessage('NON ho
trovato nulla');
sleep(100);
PostKeyEx( hand2, Ord('.'), [], false );
sleep(100);
PostKeyEx( hand2, 13, [], false );
Aiuto!
Simone
_______________________________________________________
      "Try not! Do, or do not. There is no try."                           
     by Yoda, Jedi Master  (from anonymous poster)
( remove/togli 'FalselinK' to reply/per rispondere )


[cut]
ma via OLE hai provato?

       "Try not! Do, or do not. There is no try."                           
Ok, but before "Doing" collect enough informations!  :-))))
Ciao, Vittorio

>>>>>>>>>> Hidden Window Text <<<<<<<<<<<
MSO Generic Control Container
MSO Generic Control Container
MSO Generic Control Container
MSO Generic Control Container
Altro dubbio: ricerco l'handler della finestra "madre" (applicazione
Word)con FindWindow, quindi ricerco l'handler dell'elemento "figlio" (il
documento) con FindWindowEx (passando tra i parametri anche l'handler
del "genitore")...e fin qui OK....
...ma nel momento in cui apro il dialogo di ricerca, esso sarŕ figlio
dell'applicazione Word o del Documento (cioč, per cercarlo con
FindWindowEx dovrň passargli come "parent handler" quello
dell'applicazione word o quella del documento ? 
Insomma, č figlio dell'applicazione Word, oppure č figlio di un figlio
(documento) dell'applicazione Word ? 
A spanne direi quest'ultima, ma non sto ottenendo granchč...
Grazie per i pareri.
Simone
P.S. Ora mi informerň meglio sull'OLE, come suggerito...
_______________________________________________________
      "Try not! Do, or do not. There is no try."                           


 che mi sono arenato [cut]
Apri Word, vai su Strumenti\Macro\Visual Basic Editor.
Da Visualizza scegli Visualizzatore Oggetti (F2).
Avrai un dettagliatissimo reference degli oggetti messi a disposizione da 
Office.
Io ho Word 2000 quindi adatta il suggerimento al tuo caso.
Ti basta cercare lė ciō che ti serve, se poi qualcosa non č troppo chiara 
una ricerca con Google chiarirā tutto.

Office.
Che meraviglia: ho installato l'help ed ora proverò a districarmi un po'
tra tutte queste potenzialità: più avanti proverò a cambiare i font (in
rete si trovano diversi esempi in tal senso).
Comunque nel frattempo ho ottenuto qualche risultato :
- facendo il FindWindow con il titolo del dialogo: 
  FindWindow(Nil, PChar('Find and Replace'));
- cercando quello del figlio:
   Hand2:=GetWindow( hand1, GW_CHILD );
- e quindi ricavando il quarto handle successivo con:
 for n:=1 to 4 do
  begin
   Hand3:=GetWindow(hand2, GW_HWNDNEXT );
   hand2:=hand3;
  end;
l'invio di keys funziona (mi riesce inviare solo lettere e tasti Alt- ,
ma questo per ora mi basta).
Grazie a tutti
Simone


 
Se quello che vuoi fare è la sostituzione di frasi, font o formati credo 
che Selection.Find faccia al caso tuo, casomai puoi anche registrarti 
una macro con le operazioni che fresti manualmente e verificare che cosa 
registra Word per poi riprodurlo in Delphi con le dovute modifiche.
ciao, Vittorio
