![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;
.... |