Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2010, 13:20   #1
ЖенёкСупер
Пользователь
 
Аватар для ЖенёкСупер
 
Регистрация: 09.06.2010
Сообщений: 18
Вопрос Приложение внутри формы

Здравствуйте!
Подскажите пожалуйста! Мне необходимо запустить приложение (C:\File.exe) внутри Delphi формы. (Как запускать одну форму в другой я разобрался (Windows.SetParant(Form2.Handle, Form1.Handl))).
ЖенёкСупер вне форума Ответить с цитированием
Старый 12.08.2010, 13:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вот. с помошью FindWindow находишь окно запущенного приложения и через SetParent перецепляешь ей родителя - свою форму или панель...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2010, 13:47   #3
ЖенёкСупер
Пользователь
 
Аватар для ЖенёкСупер
 
Регистрация: 09.06.2010
Сообщений: 18
По умолчанию

А можете дать готовый код как это сделать?
ЖенёкСупер вне форума Ответить с цитированием
Старый 12.08.2010, 14:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну почему бы нет?
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var           pi:_PROCESS_INFORMATION; si:_STARTUPINFOA;
  Form1: TForm1;  CanvasH,OfficeH:Hwnd;

  function WindowClass(wind:hwnd):string;

implementation

{$R *.dfm}
 //********** FUNCTION **********
 function WindowClass;
 var Nm:Array[0..255] of Char;
 begin
    nm:='';
    GetClassName(Wind,Nm,sizeof(nm)); // считываем  текст заголовка окна
    result:=string(nm);
 end;
 //********** END FUNCTION ******

procedure TForm1.FormCreate(Sender: TObject);
var exc:pchar;cdir,filea:string;
//**************************************************************************
   function enumChildWindow__Enum(h:THandle;l:integer):boolean; stdcall;
begin
 if WindowClass(h)='_WwG' then begin
  CanvasH:=h;
  result:=false
 end
 else result:=true;
end;
//**************************************************************************
   function enumThreadWindow_Enum(h:THandle;l:integer):boolean; stdcall;
begin
 if WindowClass(h)='OpusApp' then begin
  OfficeH:=h;
  result:=false
 end
 else result:=true;
end;
begin
filea:='c:\temp\q.doc';
getmem(exc,2550);
FindExecutable(pchar(filea),pchar(cdir),exc);
 cdir:=ExtractFilePath(filea);
 if not CreateProcess(exc,pchar(exc+' "'+filea+'"'),0,0,
 false,0,nil,pchar(cdir),si,pi) then
  RaiseLastWin32Error;
  freemem(exc);
sleep(1000);
 EnumThreadWindows(pi.dwThreadId,@enumThreadWindow_Enum,0);

 //**************************************************************************
 EnumChildWindows(OfficeH,@enumChildWindow__Enum,0);
 SetWindowPos(OfficeH,0,Screen.Width+100,0,0,0,SWP_SHOWWINDOW);
//  caption:=inttostr(CanvasH);
 windows.SetParent(CanvasH,GroupBox1.Handle);
 SetWindowPos(CanvasH,0,0,0,GroupBox1.Width,GroupBox1.Height,SWP_SHOWWINDOW);

  //**************************************************************************
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TerminateProcess(OfficeH,0);
end;

end.
Тут правда я усложненно писал, но смысл в том чтоб после запуска получить хендл окна.
Можно написать чуть попроще, но уже на стал разбираться - самому только из интереса это нужно было.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2010, 15:19   #5
ЖенёкСупер
Пользователь
 
Аватар для ЖенёкСупер
 
Регистрация: 09.06.2010
Сообщений: 18
По умолчанию

Что-то это не работает. Вы не могли бы кинуть исходник?
ЖенёкСупер вне форума Ответить с цитированием
Старый 12.08.2010, 15:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы не могли бы кинуть исходник?
Это он и есть. Целиком и полностью.
Кинь на форму GroupBox. Единственное что я там поставил sleep(1000); чтоб подождать пока Ворд окно создаст, при больших документах этого маловато будет, и там нужно либо похитрее чем задержка писать либо похитрее механизм.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение excel таблицы внутри моей формы samouelson Компоненты Delphi 4 25.05.2010 15:53
Чтобы приложение не уходило за пределы моей формы Marsel737 Общие вопросы Delphi 24 28.01.2010 09:56
Как сделать, чтобы форму можно было перемещать только внутри главной формы SeregaKo Общие вопросы Delphi 7 26.03.2009 12:48
Перемещение рисунков внутри формы Marsik Помощь студентам 10 01.11.2007 09:48
Приложение без формы Wiggle Общие вопросы Delphi 12 18.04.2007 20:20