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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2014, 10:31   #1
sholban
 
Регистрация: 20.05.2012
Сообщений: 6
Печаль Открыть чужое приложение в своей форме, подогнать размеры маоего окна к этой программе

Добрый день, всем!
Требуется, запустить чужую программу внутри моей формы и установить размеры мой формы равным к клиентской программе.
Как запустить разобрался, установить дочернюю программу на начальную позицию тоже (левый верхний угол). А совместить размеры не получается.
Нужны советы.
sholban вне форума Ответить с цитированием
Старый 27.05.2014, 11:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот как я делал:
Код:
var wp:WINDOWPLACEMENT;  hc:integer;
begin
GetWindowPlacement(hw,@wp);
hc:=GetSystemMetrics(SM_CYCAPTION);
Width:=wp.rcNormalPosition.Right-wp.rcNormalPosition.Left+10;
Height:=wp.rcNormalPosition.Bottom-wp.rcNormalPosition.Top+hc;
//WindowState:=wsMaximized;
wp.rcNormalPosition.Top:=-hc-5; wp.rcNormalPosition.Left:=0;
SetWindowPlacement(hw,@wp);
end;
hw - хендл окна, помещаемого в мою форму.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.05.2014, 12:22   #3
sholban
 
Регистрация: 20.05.2012
Сообщений: 6
По умолчанию

Что-то не получается.
Встроил этот код в OnCreate Формы, но при запуске программы форма сворачивается в полоску из заголовка, т.е. как будто нижнюю границу формы перетащили к заголовку, тем самым уменьшив высоту до минимума.
sholban вне форума Ответить с цитированием
Старый 27.05.2014, 12:54   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому что окна еще не нашло.
Тебе этот код нужно втыкнуть после того как окно пересажено в твою форму.
Я вообще у себя сдуру в таймер поставил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.05.2014, 13:04   #5
sholban
 
Регистрация: 20.05.2012
Сообщений: 6
По умолчанию

В таймере написал, теперь через данное время форма по высоте увеличивается. Т.е. изначально свернутая полоска, потом чуть-чуть растягивается вниз и т.д.
Такой код не пойдет?:
Код:
GetWindowRect(H, WindowRect);  //H-это хендл дочернего окна
Width:= WindowRect.Right-WindowRect.left;
Height:=WindowRect.Bottom-WindowRect.Top;
sholban вне форума Ответить с цитированием
Старый 27.05.2014, 13:09   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может и подойдет. Я у себя юзаю именно так как написал, ничего никуда не растягивается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.05.2014, 13:11   #7
sholban
 
Регистрация: 20.05.2012
Сообщений: 6
По умолчанию

Может я неправильно делаю что-то.
Сможешь написать простенькую прогу с запуском простой программы (Сапер, например)? И выложить исходники. Я посмотрю и сравню со своим.
sholban вне форума Ответить с цитированием
Старый 27.05.2014, 13:24   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нет не могу.
Нет у меня сапера. Последний под Славянском взорвался.
Вот тебе для блокнота:
Код:
unit Unit1;

{$MODE Delphi}

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure align_;
  public
    { Public declarations }
  end;

  function OpenThread(dwDesiredAccess:DWORD;bInheritHandle:BOOLEAN;dwThreadId:DWORD):THandle; external 'Kernel32.dll';

var    si: TSTARTUPINFO; hw:HWND;
  pi: TPROCESSINFORMATION;
  Form1: TForm1;

implementation

uses Types;

{$R *.lfm}

procedure TForm1.FormCreate(Sender: TObject);
var  p:String;
begin
p:=ExtractFilePath(ParamStr(0)); delete(p,length(p),1);
if not CreateProcess(nil,pchar('c:\Windows\notepad.exe'), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS {or CREATE_SUSPENDED}, nil, pchar(p), si, pi)
then RaiseLastWin32Error;
repeat
 hw:=FindWindow('Notepad',nil);
until IsWindow(hw);
windows.SetParent(hw,Handle);
windows.SetForegroundWindow(hw);
Left:=10;top:=10;
Timer1.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SuspendThread(pi.hThread);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 
 if ResumeThread(pi.hThread)=$FFFFFFFF then RaiseLastWin32Error else
 windows.SetForegroundWindow(hw);
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
 SuspendThread(pi.hThread);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var h:hwnd;
begin
 align_;
 h:=GetForegroundWindow;
 if (h=hw) then N1.Click else
  if h<>handle then n2.Click;
 
 if not IsWindow(hw) then begin
  Timer1.Enabled:=false;
  Halt;
 end;
end;

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

procedure TForm1.align_;
var wp:WINDOWPLACEMENT;  hc:integer;  
begin
GetWindowPlacement(hw,@wp);
hc:=GetSystemMetrics(SM_CYCAPTION);
Width:=wp.rcNormalPosition.Right-wp.rcNormalPosition.Left+10;
Height:=wp.rcNormalPosition.Bottom-wp.rcNormalPosition.Top+hc;
wp.rcNormalPosition.Top:=-hc-5; wp.rcNormalPosition.Left:=0;
SetWindowPlacement(hw,@wp);
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.05.2014, 13:47   #9
sholban
 
Регистрация: 20.05.2012
Сообщений: 6
По умолчанию

Что-то очень много кода.
Не может найти файл Unit1.lfm
{$MODE Delphi} - на эту строчку тоже ругается.
sholban вне форума Ответить с цитированием
Старый 27.05.2014, 14:33   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это просто пример кода )
Проанализируй его. Копипасте тебе ничего не даст, ибо это Фрипаскаль.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопка с выбором файла в Firefox - как подогнать размеры под высоту картинки ? boraldo HTML и CSS 0 06.08.2012 00:21
quick report открыть в своей форме ScorpioN_T БД в Delphi 0 18.05.2012 19:42
Открыть чужое приложение в окне своего Fainder Общие вопросы Delphi 3 13.02.2009 15:07
чужое приложение Electrod Win Api 12 27.01.2008 17:04