Şimdi Ara

delphide programın birden fazla açılmaması

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
3
Cevap
0
Favori
759
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba ben delphide yazdıgım programın birden fazla açılmamasını saglayan kodları arıyorum
    yardımlarınız için tşk



  • Aşağıdaki kod, delphi2005 ile sıfır bir projede calisiyor. program ikinci kez calistirildiginda, eger eski bir instance varsa onu bulup one getiriyor.

    unit Unit1;

    interface

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

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

    var
    Form1: TForm1;

    const
    MAX_BUFFER_SIZE = 260; // MAX_PATH = 260

    var
    MyAppName, MyClassName: array[0..MAX_BUFFER_SIZE] of char;
    MyPopup, LastFound: HWND;
    NumFound: integer;

    implementation

    {$R *.dfm}

    function LookAtAllWindows(Handle: HWND; Temp: longint): BOOL; stdcall;
    var
    WindowName, ClassName: array[0..MAX_BUFFER_SIZE] of char;
    begin
    Result := True;
    if (GetClassName(Handle, ClassName, SizeOf(ClassName)) > 0) then
    begin
    if (StrComp(ClassName, MyClassName) = 0) then
    begin
    if (GetWindowText(Handle, WindowName, SizeOf(WindowName)) > 0) then
    begin
    if (StrComp(WindowName, MyAppName) = 0) then
    begin
    Inc(NumFound);
    if (Handle <> Application.Handle) then
    LastFound := Handle;
    end;
    end;
    end;
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    NumFound := 0;
    LastFound := 0;
    GetWindowText(Application.Handle, MyAppName, SizeOf(MyAppName));
    GetClassName(Application.Handle, MyClassName, SizeOf(MyClassName));
    EnumWindows(@LookAtAllWindows, 0);
    if (NumFound > 1) then
    begin
    MyPopup := GetLastActivePopup(LastFound);
    BringWindowToTop(LastFound);
    if IsIconic(MyPopup) then
    ShowWindow(MyPopup, SW_RESTORE)
    else
    SetForegroundWindow(MyPopup);
    Application.Terminate;
    end;
    end;

    end.




  • Birlikte var olmaması gereken "birbirini dışlayan" nesne oluşturarak yapılabilir :
    Bellekte mutex nesnesi oluşturmaya çalışırsak, sistem bunu
    kaydeder ve 2. kez oluşmasına izin vermez.
    Adına örn. "abc_XYZ" diyelim.

     
    : // program-unit bölümü
    :
    var
    mHandle: THandle; // Mutexhandle
    :
    :
    initialization
    mHandle := CreateMutex(nil, True, 'abc_XYZ');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
    ShowMessage('* UYARI *'+#13#10+ 'Program şu an bellekte çalışıyor;'+#13#10+
    'Birden fazla kez çalıştırmayınız..');
    halt; // program burada sonlansın
    end;

    finalization
    if mHandle <> 0 then CloseHandle(mHandle)
    end.

    NT, XP ve Vista'da çalışır. Daha önceki sürümlerde çalışır mı denemedim..
    Windows sdk ile gelen yardım dosyasında; win95 ve üzerinde çalıştığı yazılı.




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.