Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Gövdesiz Fonksiyon
#1
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.
Cevapla
#2
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;
Cevapla
#3
@elixir84 kardes örnek aramıyorum sorum farklı bır hususta. tesekkurler yınde
Cevapla
#4
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.
WWW
Cevapla
#5
(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.
DelphiCan'dır!
Cevapla
#6
Tesekkurler @"Fesih ARSLAN" ,@sadettinpolat
Kopyala yapıstırla bir sey ogrenılmez satır satır kavramak gerekir Smile
Cevapla
#7
Nam-ı diğer function pointer  Smile 

Buradaki makaleyi de okumak isteyebilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
@Tuğrul HELVACI hocam pointerlar kendini unutturmaya hiç gelmiyor. br gun mutluka ben burdayım dıyorSmile)
Makale cok guzel tesekkurler sitenizi takip ediyorum
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Fonksiyon çağırma ermanispir@gmail.com 2 219 29-10-2024, Saat: 15:51
Son Yorum: ermanispir@gmail.com
  [Ödüllü Soru] Object türüne göre nesne üreten fonksiyon Abdullah ILGAZ 2 1.746 16-07-2023, Saat: 20:18
Son Yorum: Tuğrul HELVACI
  String Fonksiyon Kullanımıyla ilgili ermanispir@gmail.com 2 717 01-06-2023, Saat: 11:28
Son Yorum: ermanispir@gmail.com
  SQL Server Fonksiyon hatası sametb 1 961 06-04-2022, Saat: 13:39
Son Yorum: sabanakman
  Delphi C# Fonksiyon Sonuç Döndürme Farkı Hayati 5 1.903 19-12-2021, Saat: 19:14
Son Yorum: Hayati



Konuyu Okuyanlar: 1 Ziyaretçi