Relantis üyesi avatar
Selamlar, bi sorunum var. Projem sadece 1 kere çalıştırılsın istiyorum. Projem açıkken 2.sini açmaya çalıştığım zaman zaten program çalışıyor hatasını almak istiyorum. Şimdiden yardım eden herkeze teşekkürler ..
MadBlazer üyesi avatar
Sizin istediğiniz gibi bir unit var isterseniz verebilirim. ?
Relantis üyesi avatar
çok memnun olurum
MadBlazer üyesi avatar
Dün pek online değildim cevap yazamadım üzgünüm şimdi yazıyorum.
 procedure TForm1.FormActivate(Sender: TObject);
begin
  hMyMutex := CreateMutex(nil,FALSE,'Deneme');
  if (hMyMutex <> 0) then try
    if (GetLastError <> ERROR_ALREADY_EXISTS) then begin
      Application.Initialize;
      Application.CreateForm(TForm1,Form1);
      Application.Run;
    end else ShowMessage ('Program zaten çalışıyor');
close;
  finally
    CloseHandle (hMyMutex);
  end else ShowMessage ('Program tanım oluşturmada hata : ' + IntToStr(GetLastError));
end;
Relantis üyesi avatar
hMyMutex hata veriyor :S
KralMAS üyesi avatar
Delphi bilmediğini var sayarak, basit şekilde anlatmaya çalışayım. Üst menüden, sırasıyla Project + View Source'ye gir. Bu alanda projenin .dpr dosyasında yer alan ve program çalıştırıldığında, ilk işletilecek olan kodları göreceksin. Boş bir proje açmışsan, aşağı yukarı şöyle bir kod kümesi yer alacak;

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Burada uses kısmında, projenin kullanacağı kütüphaneler yer almaktadır. Öncelikle, projemizin başlık bilgilerini kontrol etmemizi sağlayacak olan Windows kütüphanesini, Forms'un altına ekle.
-----------------------------------
uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};
-----------------------------------
Daha sonra, projenin görev yöneticisinde de tanımlanmasını sağlayacak olan, başlık bilgilerini belirtmen gerekiyor. Aksi taktirde, programı, aşağıda belirteceğim metotla tespit etmem mümkün olmayacak. Bunun içinde, programın yüklenmeye başladığı kısma (Application.Initialize;), başlık bilgilerini Application.Title şeklinde belirtmen gerekiyor. Örnek olarak programın başlığını ultimastrike yapalim.
-----------------------------------
Application.Initialize;
Application.Title := 'ultimastrike';
Application.MainFormOnTaskbar := True;
-----------------------------------
Son olarakta, programın başlığını bellek üzerinde kontrol edip, açık olup olmadığını tespit edeceğimiz ve açıksa çalışmasını engelleyeceğimiz (Halt(0);) kodu, program bilgileri yüklenmeye başlamadan, çalıştırıyoruz. Bunun içinde, aşağıda ki kodu eklemen gerekiyor.
-----------------------------------
{$R *.res}

begin
CreateMutex(nil,FALSE,'ultimastrike');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Halt(0);
end;


Application.Initialize;
-----------------------------------
Bu koduda eklediğimizde, kodun tamamı, aşağı-yukarı (kendi uygulamandaki formlar ve düzenlemelere göre değişebilir) bu şekilde görünecektir.
-----------------------------------
program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
CreateMutex(nil,FALSE,'ultimastrike');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Halt(0);
end;


Application.Initialize;
Application.Title := 'ultimastrike';
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
-----------------------------------
Artık, program birden fazla açılmayacak. Eğer program tekrar açılmaya çalışınca, uyarı görüntülemek istersen de, uses kısmına, Dialogs kütüphanesini ekledikten sonra, ShowMessage(); fonksiyonunu kullanabilirsin.
-----------------------------------
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Program zaten çalışıyor.');
Halt(0);
end;
-----------------------------------
Kolay gelsin...
Relantis üyesi avatar
Çok Teşekkür ediyorum KralMAS. Birde ;

if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Program zaten çalışıyor.');
Halt(0);
end;

Bunu nereye ekleyebilriz ?

Bu konu yyyyyy tarafından düzenlendi(2010-01-11 23:52, 15 yıl önce)
KralMAS üyesi avatar
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Halt(0);
end;

olan kısmı

if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Program zaten çalışıyor.');
Halt(0);
end;

olarak değiştireceksin sadece, yani Halt(0); (programı kapat) kısmından önce,
ShowMessage('Program zaten çalışıyor.');
satırını ekliyeceksin, okadar.
Relantis üyesi avatar
Tamamdır, Çok Sağol =)

birde https://www.ultima-strike.com/forum/yazilim/program-varsa-kapansin-de-q43770#bottom Bu konu hakkında bilgin varsa çok makbule geçer abi.

Üye Ol veya Giriş Yap

Bu forum başlığına mesaj atmak istiyorsanız hemen üye olun veya giriş yapın.