![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Снова привет. 
		
	
		
		
		
		
		
		
			Объясните недалекому. Есть: Код: 
	function CaptureScreenRect( ARect: TRect )
: TBitmap;
var
  ScreenDC: HDC;
begin
  Result := TBitmap.Create;
    Result.Width := ARect.Right - ARect.Left;
    Result.Height := ARect.Bottom - ARect.Top;
    ScreenDC := GetDC( 0 );
    try
       BitBlt ( Result.Canvas.Handle, 0, 0,  Result.Width,
      Result.Height, ScreenDC,
        ARect.Left, ARect.Top, SRCCOPY );
    finally
      ReleaseDC( 0, ScreenDC );
    end;
end;Код: 
	  procedure GetSceen;
 var
    pt : TPoint;
    r  : TRect;
    h  : HWND;
    bit: TBitmap;
  begin
    bit:=TBitmap.Create;
       GetCursorPos(pt);
    h:=WindowFromPoint( pt );
    GetWindowRect( h, r );
    bit:=CaptureScreenRect( r );
    bit.SaveToFile(ExtractFilePath(Application.ExeName)+'123.bmp');
  with ScreenFRM do
  begin
   Image1.Picture.Bitmap:=bit;Вызов В: Если вызвать в OnShow То все прекрасно работает. Код: 
	procedure TScreenFRM.FormShow(Sender: TObject);
 var
    pt : TPoint;
    r  : TRect;
    h  : HWND;
    bit: TBitmap;
  begin
    bit:=TBitmap.Create;
    h:=WindowFromPoint( Mouse.CursorPos );
    GetWindowRect( h, r );
    Image1.Picture.Bitmap:= CaptureScreenRect( r );Последний раз редактировалось nixon232, 27.05.2017 в 21:54.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Все нормально работает 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	function CaptureScreenRect( ARect: TRect ): TBitmap;
var
  ScreenDC: HDC;
begin
  Result := TBitmap.Create;
    Result.Width := ARect.Right - ARect.Left;
    Result.Height := ARect.Bottom - ARect.Top;
    ScreenDC := GetDC( 0 );
    try
       BitBlt ( Result.Canvas.Handle, 0, 0,  Result.Width,
      Result.Height, ScreenDC,
        ARect.Left, ARect.Top, SRCCOPY );
    finally
      ReleaseDC( 0, ScreenDC );
    end;
end;
 
procedure GetSceen;
var
   pt : TPoint;
   r  : TRect;
   h  : HWND;
   bit: TBitmap;
 begin
   bit:=TBitmap.Create;
      GetCursorPos(pt);
   h:=WindowFromPoint( pt );
   GetWindowRect( h, r );
   bit:=CaptureScreenRect( r );
   //bit.SaveToFile(ExtractFilePath(Application.ExeName)+'123.bmp');
 with Form1 do
 begin
  Image1.Picture.Bitmap:=bit;
 end;
 bit.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   GetSceen;
end;Протестировал в XE2  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Снова попробую апнуть тему. Вот листинг. Как я понимаю, он не работает только у меня? 
		
	
		
		
		
		
		
		
			Код: 
	
procedure GetScreen;
  var
    pt : TPoint;
    r  : TRect;
    h  : HWND;
    bit: TBitmap;
  begin
   try bit:=TBitmap.Create;
    h:=WindowFromPoint( Mouse.CursorPos );
    GetWindowRect( h, r );
//    Form2.Image1.Picture:=nil;
    bit:= CaptureScreenRect( r );
    form2.Image1.Picture.Bitmap:=bit; // вылетаем тут
  finally
  bit.Free;
   end;Код: 
	procedure TWinControl.MainWndProc(var Message: TMessage);
begin
  try
    try
      WindowProc(Message);
    finally
      FreeDeviceContexts;
      FreeMemoryContexts;
    end;
  except
    Application.HandleException(Self); // вот сюда.
  end;
end;Последний раз редактировалось nixon232, 06.08.2017 в 15:25.  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Если вторую форму создавать вот так 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	Form2:=TForm2.Create(Self); Form2.Show; Код: 
	Application.CreateForm(TForm2, Form2); Form2.Show;  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Она же так и создается? 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	procedure TForm1.Button1Click(Sender: TObject); var f: TForm2; begin f := TForm2.Create(self); f.Show; end; Код: 
	---
var
  Form1: TForm1;
  form2: TForm2;
implementation
{$R *.dfm}
---- | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вот весь код Shoot.pas все работает, а по началу тоже было AV 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	unit Shoot;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  Unit2,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Form2.Show;
end;
end. | 
| Этот пользователь сказал Спасибо Shaft за это полезное сообщение: | ||
 
nixon232 (06.08.2017)
  | ||
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Да, в таком варианте АВ нет, но чем создание по первому варианту не проходит? Такое чувство, что Image1 не создается в конструкторе. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 В первом варианте f: TForm2; объявлена и создана как локальная в процедуре Button1Click из Form1, а обращение идет к Form2: TForm2; которая объявлена но не создана. 
		
	
		
		
		
		
		
		
			Иными словами, есть две объявленные f: TForm2; и Form2: TForm2; f создана а Form2 нет но тем не менее обращение идет к form2.Image1.Picture.Bitmap:=bit; поэтому AV а к f мы не можем обратиться так как она локальная Последний раз редактировалось Shaft, 06.08.2017 в 13:50.  | 
| Этот пользователь сказал Спасибо Shaft за это полезное сообщение: | ||
 
nixon232 (06.08.2017)
  | ||
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Все верно. и решение тогда логичное и простое 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	...
type
  TForm2 = class(TForm)
    btn1: TButton;
    Image1: TImage;
    procedure btn1Click(Sender: TObject);
    procedure GetScreen;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
.... |