Konuyu Oyla:
  • Derecelendirme: 4/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Otomatik Tamamlama
#11
(23-08-2016, Saat: 14:12)SimaWB Adlı Kullanıcıdan Alıntı:
(23-08-2016, Saat: 09:42)vkamadan Adlı Kullanıcıdan Alıntı: Tuğrul abi,
Bu çok faydalı paylaşımın için teşekkür ederim.
SHAutoComplate  fonksiyonunun formun OnCreate olayında etki etmemesinin sebebi nedir ?

Formun OnCreate'inde Edit1 için SHAutoComplate'i çalıştırdığımda düzgün çalıştığını gözlemledim. Problemi yanlış mı anladım acaba?


Bende Form OnCreate'de denedim çalıştı.
WWW
Cevapla
#12
(23-08-2016, Saat: 13:12)esistem Adlı Kullanıcıdan Alıntı: Selam, 
Tuğrul hocam izninizle, ufak bir araştırmayla bulduğum Delphi 7 de ki kullanımına bir örnek vereyim. Malum hala benim gibi eskilerden ilerleyen arkadaşlarda vardır foruma gelen Smile

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

Const
    shlwapi = 'shlwapi.dll';
  SHACF_FILESYSTEM  = $1;

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean;

implementation

{$R *.dfm}
function SHAutoComplete(hwndEdit: HWND; dwFlags: dWord): LongInt; stdcall; External shlwapi Name 'SHAutoComplete';

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean;
begin
     Result := (SHAutoComplete(editField.Handle, dwFlags) = 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AutoComplete(Edit1, SHACF_FILESYSTEM);
end;

end.

Ellerinize sağlık, ilgili metodu shlwapi.dll içinden static olarak elde etmek yerine dinamik olarak LoadLibrary & GetProcAddress ile temin eder iseniz daha faydalı olacaktır. Static olarak tanımladığınızda ilgili DLL içinde ilgili metod bulunamaz ise uygulamanız başlar iken garip hatalar alabilir ve belki de uygulamanızı başlatamayabilirsiniz. Oysa dinamik olarak ilgili fonksiyonu elde etmeye çalışır iseniz; uygulamanız çalışmış olur ve hatanın yerini yurdunu daha kolay tespit edebilirsiniz Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#13
Uyarınız için teşekkürler Tuğrul hocam.
Son tahlilde, foruma bakan arkadaşlar örneği aşağıdaki şekilde kullanırlarsa bahsettiğiniz sorunlar ortadan kalkmış olacaktır.

unit Unit1;

interface

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

type
   TAutoComplateFunc = function (hwndEdit: hwnd; dwFlags: DWORD): Boolean; stdcall;
   EDLLLoadError = class(Exception);

 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 LibHandle : THandle;

Const
 SHACF_FILESYSTEM  = $1;

function OtomatikTamamla(editField: TEdit; dwFlags: DWORD): Boolean;

implementation

{$R *.dfm}

function OtomatikTamamla(editField: TEdit; dwFlags: DWORD): Boolean;
Var
AutoComplate : TAutoComplateFunc;
begin
         LibHandle:=LoadLibrary('shlwapi.dll');
         try
           If LibHandle=0 Then raise EDLLLoadError.Create('shlwapi.dll yüklenemedi.');
           @AutoComplate:=GetProcAddress(LibHandle,'SHAutoComplete');
           If @AutoComplate = nil
             then raiseLastWin32Error
             else result := AutoComplate(editField.Handle, dwFlags);
         finally
           FreeLibrary(LibHandle);
         End;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OtomatikTamamla(Edit1, SHACF_FILESYSTEM);
end;

end.
WWW
Cevapla
#14
(23-08-2016, Saat: 11:03)SimaWB Adlı Kullanıcıdan Alıntı: Emeğine sağlık Tuğrul Hocam.

(23-08-2016, Saat: 14:12)SimaWB Adlı Kullanıcıdan Alıntı:
(23-08-2016, Saat: 09:42)vkamadan Adlı Kullanıcıdan Alıntı: Tuğrul abi,
Bu çok faydalı paylaşımın için teşekkür ederim.
SHAutoComplate  fonksiyonunun formun OnCreate olayında etki etmemesinin sebebi nedir ?

Formun OnCreate'inde Edit1 için SHAutoComplate'i çalıştırdığımda düzgün çalıştığını gözlemledim. Problemi yanlış mı anladım acaba?

Veli bey merhaba,
Delphi 2007 kullanıyorum aynen aşağıdaki gibi kullanımda çalışmıyor,
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SHAutoComplete(Edit1.Handle, SHACF_FILESYSTEM);
end;

end.
Cevapla
#15
İlginç   Cool
Delphi XE ve Delphi 5 ile Windows 7 Pro x86'da denedim çalışıyor.
There's no place like 127.0.0.1
WWW
Cevapla
#16
Selam,
Delphi 7 de Xp de yukarıda verdiğim örneği FormCreate de yazdığım zaman bende de sorunsuz çalıştı, acaba Delphi 2007 den kaynaklı bir sorun olabilirmi? Ayrıca Edit in handle ını FormCreate de kontrol ettiğimde gayet düzgün alıyor. Sizde handle ı bi kontrol edermisiniz volkan hocam.
WWW
Cevapla
#17
Delphi 10 Seattle

7APoLY.png
WWW
Cevapla
#18
Volkan Bey; vaktiniz olduğunda CoInitialize kullanarak deneyebilir misiniz? (Sırf neden çalışmadığını merak ettiğim için. Kıl oldum açıkçası Smile )
Formun OnCreate'inde ilk önce CoInitialize(nil). Tabiki OnDestroy'da CoUninitialize Wink
ShLwApi'de SHAutoComplete ile ilgili şöyle bir uyarı var:
// WARNING:
//    Caller needs to have called CoInitialize() or OleInitialize()
There's no place like 127.0.0.1
WWW
Cevapla
#19
(25-08-2016, Saat: 10:32)SimaWB Adlı Kullanıcıdan Alıntı: Volkan Bey; vaktiniz olduğunda CoInitialize kullanarak deneyebilir misiniz? (Sırf neden çalışmadığını merak ettiğim için. Kıl oldum açıkçası Smile )
Formun OnCreate'inde ilk önce CoInitialize(nil). Tabiki OnDestroy'da CoUninitialize Wink
ShLwApi'de SHAutoComplete ile ilgili şöyle bir uyarı var:
// WARNING:
//    Caller needs to have called CoInitialize() or OleInitialize()

Veli bey merhaba , 
Delphi XE2 de denediğimde OnCreate de sorunsuz çalıştı,
Dediğiniz gibi Delphi 2007 de OnCreate ye CoInitialize i ekleyince çalıştı. şimdi şu soruyu soracağız neden OnCreate de CoInitialize çağırmak gerekirken formun üzerinde ki bir buton ile yaptığımızda CoInitialize eklemeye gerek olmadan da işliyor Smile
Cevapla
#20
takip güzel ve kullanışlı.
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi