merhabalar öncelikle herkese iyi bayramlar.
soruma gelince:
programın aynı anda 2 kere açılmamasını nasıl sağlarız acaba.
program aynı anda 2 kere açılmasın
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
"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;
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;
Memik YANIK - http://www.memikyanik.com
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;
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;
Memik YANIK - http://www.memikyanik.com
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.
Memik YANIK - http://www.memikyanik.com
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.
- İ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.