program aynı anda 2 kere açılmasın

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

program aynı anda 2 kere açılmasın

Mesaj gönderen zaxacm »

merhabalar öncelikle herkese iyi bayramlar.

soruma gelince:
programın aynı anda 2 kere açılmamasını nasıl sağlarız acaba.
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

"Arkadaşlar aşağıda verdiğim metni kitaptan aldım bazı fazlalıklar veya başka konulara göndermeler olabilir."

Projede birden fazla form varsa proje başlatıldığında ilk olarak hangi formun ekrana geleceği konusunda seçim yapılabilir. Projeler, varsayım olarak projeye ilk olarak dahil edilen formdan başlarlar. Projeyi başka bir form ile başlatmak istiyorsanız Main form liste kutusunu açıp başlangıç formunu seçmeniz gerekir.

Project Options diyalog kutusunda Forms sekmesinde Main Form kutusu dışında Auto create forms adında bir liste kutusu daha bulunmaktadır. Bu liste kutusunda listelenen formlar, üzerinde çalışılan projeye CreateForm() metodu ile otomatik olarak hazırlanıp Application nesnesine dahil edilecek formlardır.

Daha önceki konulardan bildiğiniz gibi File menüsünden New Form komutu ile projeye yeni formun dahil edilmesi halinde DPR uzantılı dosyaya müdahale edilmektedir. Benzer şekilde projenin başlangıç formu değiştirilirse proje dosyasına müda¬hale edilmektedir.

begin
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Tasarım anında çok sayıda form hazırlayıp projenize dahil ettiyseniz ve proje çalıştırıldığında bütün formların DPR dosyasında kullanılan CreateForm() metodu ile hazırlanmasını istemiyorsanız bu formları Auto-create forms liste kutusundan Avaiable forms liste kutusuna taşımanız gerekir.

Project Options diyalog kutusunda “Auto-create forms” liste kutusunda “Available forms” liste kutusuna taşınan formlarla ilgili satırlar DPR dosyasından silinir. “Available forms” liste kutusuna aktarılan formlardan birisine ne zaman gerek duyulursa Application nesnesinin CreateForm() metodu ile hazırlanabilir. Aşağıda verilen kodu Form2’yi “Auto-create forms” kutusundan “Available forms” kutusuna aktardıktan sonra aldım.

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Bu şartlarda proje çalıştırılırsa “Form1” kendiğinden Create edilip ekrana getirilir. Bu şartlarda Form2 ekrana getirilmek istendiğinde önce TApplication sınıfının CreateForm() metodu ile oluşturulması gerekir. Bu işlemin nasıl yapıldığını anlatmak için Uses deyimi ile Unit2’yi Unit1’e dahil ettikten sonra aşağıda verdiğim kodu hazırladım.

implementation
{$R *.dfm}
Uses Unit2;
procedure TForm1.FormClick(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;

Bu kod sayesinde çalışma anında Form1’in üzeri tıklandığında Form2 oluşturulup Show metodu ile ekrana getirilir. Ancak Form1 ikinci kez tıklanıp bu kod tekrar işletildiğinde 2. kez TForm Class’ından yararlanıp form hazırlanır. Bunun önüne geçmek için bu kodu aşağıdaki gibi düzenledim.

procedure TForm1.FormClick(Sender: TObject);
begin
if not Assigned(Form2) Then
Begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
end;

Ancak bu kod ile ekrana getirilmiş olan Form2 kapatılıp tekrar ekrana getirilmek istendiğinde gelmez. Bunun önüne geçmek için TForm2 sınıfının FormClose metodunda bu form aşağıdaki gibi “nil” yapılabilinir.

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2 := nil;
end;

Yukarıda Unit2’de tanımlı olan “TForm2” adlı Class’tan yola çıkıp Form2’yi oluştururken TApplication sınıfının CreateForm() metodunu kullandım. Form2’yi oluştururken TForm sınıfının Create() metodunu kullanabilirsiniz. TForm sınıfının Create() metodunun nasıl kullanıldığını aşağıda görebilirsiniz.

begin
If not Assigned(Form2) Then
Begin
Form2 := TForm2.Create(Self);
Form2.Show;
End;
end;
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

Mesaj gönderen zaxacm »

teşekkürler ancak benim demek istediğim programın exesi 2.kez çalışmasın yani programı açtık açık olduğunun farkında değiliz birdaha denedik ozaman bize "program zaten açık uyarısını versin" biraz acmiyim kusura bakmayın bilmem anlatabildim mi
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Dalgınlık, sorunuzu dikkatli okumamışım. Dediğiniz işlem API fonksiyonları ile yapılabilmektedir. Ancak isterseniz program ilk çalıştırıldığında geçici bir dosya hazırlayıp çıkarken silebilirsiniz. Program aynı oturumda ikinci kez çalıştırıldığında dosya olacağı için...

Bazen kullanıcı bir dosya veya programı çalıştırmaya yarayan kısayolun üzerinde tıklama yapar. Hemen tepki almadığında sanki tıklama yapmamış gibi 2. kez tıklama yapabilir. Bu durumda aynı program 2 kez üst üste çalıştırılır. Bu gibi sorunların önüne geçmek veya Delphi ile hazırladığınız programın 2. kez çalıştırılmasını önlemek istiyorsanız GlobalAddAtom() fonksiyonundan yararlanabilirsiniz. Projenizin başlangıç formunu aşağıdaki gibi düzenlemeniz halinde aynı program 2. kez çalıştırılamaz.

var
Form1: TForm1;
Sonuc : Integer;
implementation
{$R *.dfm}
Uses ShellApi;

procedure TForm1.FormCreate(Sender: TObject);
begin
if GlobalFindAtom('Project1') = 0 Then
Sonuc := GlobalAddAtom('Project1')
else
Begin
ShowMessage('Bu program zaten çalışıyor');
Halt;
End;
end;

Bu yordamda önce GlobalFindAtom() fonksiyonu ile söz konusu programın daha önce çalıştırılıp çalıştırılmadığı araştırılıyor. Program veya proje daha önce çalıştırılmadıysa GlobalFindAtom() geriye 0 göndereceğinden programın çalışması engellenmez. Ancak bu sırada GlobalAddAtom() metodu işletilerek sistem programın çalıştırıldığı konusunda bilgilendirilir. Program 2. kez çalıştırıldığında GlobalFindAtom() fonksiyonu geriye 0’dan farklı bir değer göndereceği için programın daha önce çalıştırıldığı mesajı verilip Halt deyimi ile programın çalışması sona erdirilir.

Ancak bu durumda projenin ana formunun Destroy yordamı aşağıdaki gibi düzenlenerek programın çalışması sona erdirildiğinde sistemin bundan haberdar edilmesi gerekir. Destroy yordamında GlobalDeleteAtom() fonksiyonu kullanılmazsa bu şartlarda Windows tekrar başlatılana kadar aynı program tekrar çalıştırılamaz.

procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(Sonuc);
end;
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

Mesaj gönderen zaxacm »

Çok teşekkürler hazır sizi bulmuşken bir soru daha sorayım programı kapatırken yani dolayısı ile anaformu kapatırken bir kod ile tüm formları belleği zorlamasın diye hafızadan silebilirmiyiz. bir de msn nizi almamda sakınca var mı çok nadir de olsa bazen yardım istemek için
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Delphi'de form gibi görsel nesnelerin görüntülenmesinden ve yok edilmesinden sorumlu nesneler vardır. Projeyi sona erdirdiğinizde dolayısıyla ana form yok edildiğinde Application nesnesi zaten formları bellekten temizler. Bu nedenle projenin çalışmasının sona ermesinden sonrasını merak etmenize gerek yok. Beni MSN listenize ekleyebilirsiniz. DelphiTürkiye'nin bütün üyeleri ekleyebilir. Ne yazık ki sınırlı saatlerde MSN'yi açabiliyorum. iyi çalışmalar, iyi bayramlar
En son memiky tarafından 25 Eki 2006 03:17 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

Mesaj gönderen zaxacm »

teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam. bir saplama yapıcam...

- İstediğiniz bu işlemi gerçekleştiren metodlardan birisi olan GlobalFindAtom('Project1') kullanmış iseniz; programınız hatalı işlem yürütmüş veya başka bir sebeple Windows Task Manager'den (Windows Görev Yöneticisi) kullanıcı tarafından kırılmışsa bir sorununuz olacaktır.

- Örnekte görülen OnDestroy olayındaki kodu başka bir proje yazıp servis yapmak dışında Windows yeniden başlatılana kadar "zaten program çalışıyor" ile karşılaşırsınız. Bilgi haznenizde bulunsun.
Resim
Resim ....Resim
Cevapla