Delphi Can
Gövdesiz Fonksiyon - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Gövdesiz Fonksiyon (/showthread.php?tid=4502)



Gövdesiz Fonksiyon - serdar - 07-02-2020

Merhaba arkadaşlar
Ekran görüntüsünü resim olarak alan bir fonksiyon arıyordum aşağıdaki gibi bir fonksiyon buldum
function tform1.WindowSnap(windowHandle: HWND; bmp: TBitmap): boolean;
var
 r: TRect;
 user32DLLHandle: THandle;
 printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC;nFlags: UINT): BOOL; stdcall;
begin
 result := False;
 user32DLLHandle := GetModuleHandle(user32) ;
 if user32DLLHandle <> 0 then
 begin
   @printWindowAPI := GetProcAddress(user32DLLHandle, 'PrintWindow') ;
   if @printWindowAPI <> nil then
   begin
     GetWindowRect(windowHandle, r) ;
     bmp.Width := r.Right - r.Left;
     bmp.Height := r.Bottom - r.Top;
     bmp.Canvas.Lock;
     try
       result := printWindowAPI(windowHandle, bmp.Canvas.Handle, 0) ;
     finally
       bmp.Canvas.Unlock;
     end;
   end;
 end;
end;

Dikkat ederseniz var blogunda soyle bır tanım var;
var printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC;nFlags: UINT): BOOL; stdcall;
 
Fonksiyonun ne adı var nede gövdesi var.
Aşağıdaki satırda da ne işlem yapıpta result 'a aktarabılıyor ? Yani bir govdesi ,kod kısmı yok. 
try
       result := printWindowAPI(windowHandle, bmp.Canvas.Handle, 0) ;

Daha once bu kullanım şekline hiç rastlamadım bılgısı olan arkadaslar varmıdır. 
Örnekte yapılan işlem önemli değil yapının kullanımını merak ediyorum.


Cvp: Gövdesiz Fonksiyon - elixir84 - 07-02-2020

procedure TForm1.ekrangoruntusual();
Const
{$j+} i : Integer = 0; {$j-}
var
  DCDesk: HDC;
  image1:TImage;
  vJpg: TJpegImage;
begin
If Not DirectoryExists(ExtractFileDir(Application.Exename) + '\Temp') Then CreateDir(ExtractFileDir(Application.Exename) + '\Temp');
  image1 := TImage.Create(self);
  vJpg := TJpegImage.Create;
try
image1.Width:=Screen.Width;;
image1.Height:=Screen.Height;
DCDesk:=GetWindowDC(GetDesktopWindow);
BitBlt(image1.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,DCDesk, 0, 0,SRCCOPY);
ReleaseDC(GetDesktopWindow, DCDesk);
try
vJpg.Assign(image1.Picture.Bitmap); //bmp nesnesi jpg’e aktarıldı
vJpg.CompressionQuality := 60;
vJpg.SaveToFile(ExtractFileDir(Application.Exename)+'\Temp\Ekran.jpg');
finally
vJpg.Free;
end;

finally
image1.Free;
end;

end;


Gövdesiz Fonksiyon - serdar - 07-02-2020

@elixir84 kardes örnek aramıyorum sorum farklı bır hususta. tesekkurler yınde


Gövdesiz Fonksiyon - sadettinpolat - 07-02-2020

Gövdesiz fonksiyon dediğiniz şey aslında user32.dll dosyası içerisindeki metoda bir işaretçi aslında.
metodun gövdesi user32.dll içerisinde. siz sadece user32.dll içerisindeki şu metodu kullanmak istiyorum diye bir tanımlama yapıyorsunuz.


Cvp: Gövdesiz Fonksiyon - Fesih ARSLAN - 07-02-2020

(07-02-2020, Saat: 09:03)serdar Adlı Kullanıcıdan Alıntı: Merhaba arkadaşlar
Ekran görüntüsünü resim olarak alan bir fonksiyon arıyordum aşağıdaki gibi bir fonksiyon buldum
function tform1.WindowSnap(windowHandle: HWND; bmp: TBitmap): boolean;
var
 r: TRect;
 user32DLLHandle: THandle;
 printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC;nFlags: UINT): BOOL; stdcall;
begin
 result := False;
 user32DLLHandle := GetModuleHandle(user32) ;
 if user32DLLHandle <> 0 then
 begin
   @printWindowAPI := GetProcAddress(user32DLLHandle, 'PrintWindow') ;
   if @printWindowAPI <> nil then
   begin
     GetWindowRect(windowHandle, r) ;
     bmp.Width := r.Right - r.Left;
     bmp.Height := r.Bottom - r.Top;
     bmp.Canvas.Lock;
     try
       result := printWindowAPI(windowHandle, bmp.Canvas.Handle, 0) ;
     finally
       bmp.Canvas.Unlock;
     end;
   end;
 end;
end;

Dikkat ederseniz var blogunda soyle bır tanım var;
var printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC;nFlags: UINT): BOOL; stdcall;
 
Fonksiyonun ne adı var nede gövdesi var.
Aşağıdaki satırda da ne işlem yapıpta result 'a aktarabılıyor ? Yani bir govdesi ,kod kısmı yok. 
try
       result := printWindowAPI(windowHandle, bmp.Canvas.Handle, 0) ;

Daha once hiç rastlamadım bılgısı olan arkadaslar varmıdır. 
Örnekte yapılan işlem önemli değil yapının kullanımını merak ediyorum.

Merhaba,
Function'un sonundaki stdcall direktifi (metod çağırımında duruma ve OS'ye bağlı olarak, şunlar da kullanılabilir; register, pascal, cdecl) fonksiyonun harici bir kaynaktan alındığını belirtiyor. Yani bu fonksiyon harici bir platform (muhtemelen Windows) API'si (dll vb.)'dir.
Bu tip fonksiyonları kullanabilmek için öncelikle kütüphanenin (dll vb.) load edilmesi gerekiyor. Load işleminden sonra kütüphane içerisindeki herhangi bir fonksiyonu kod içerisinde değişken veya tip tanımlar gibi tanımlarsınız. Daha sonra bu tip veya değişkeni kullanılarak, metodu çağrırsınız.


Gövdesiz Fonksiyon - serdar - 07-02-2020

Tesekkurler @Fesih ARSLAN ,@sadettinpolat
Kopyala yapıstırla bir sey ogrenılmez satır satır kavramak gerekir Smile


Cvp: Gövdesiz Fonksiyon - Tuğrul HELVACI - 07-02-2020

Nam-ı diğer function pointer  Smile 

Buradaki makaleyi de okumak isteyebilirsiniz.


Gövdesiz Fonksiyon - serdar - 07-02-2020

@Tuğrul HELVACI hocam pointerlar kendini unutturmaya hiç gelmiyor. br gun mutluka ben burdayım dıyorSmile)
Makale cok guzel tesekkurler sitenizi takip ediyorum