Display Settings (Ekran Çözünürlüğü Değiştirme)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Display Settings (Ekran Çözünürlüğü Değiştirme)

Mesaj gönderen xozcanx »

Merhaba;
Yapmaya çalıştığım işlem uygulamaya ait bir formun actif olup olmama durumuna göre ekran çözünürlüğünü değiştirmek istiyorum. Fakat nerede hata yaptığımı bir türlü çözemedim yada konu hakkında bilgisi olan bir açıklama yapabilir mi.

Form Create;

Kod: Tümünü seç

  ListBox1.items.Add(IntToStr(Screen.Width)+'x'+IntToStr(Screen.Height)+' 1 Colors');// Aktif olan ekran çözünürlüğü
  EnumDisplaySettings(nil,0,Devmode);
  with Devmode do
  ListBox2.Items.Add(Format('%dx%d %d Colors',[dmPelsWidth,dmPelsHeight,1 shl dmBitsperPel])); // bu şekilde Max ekran çözünürşüğünü alıyorum.
  ListBox1.ItemIndex:=0;  ListBox2.ItemIndex:=0; // itemleri seçili hale getiriyorum.
Kontrolüde Form üzerine birtane ApplicationEvents nesnesi ile yapmaya çalışıyorum

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
  Caption :='Pencere Aktif!';
  EnumDisplaySettings(nil, Listbox1.ItemIndex,Devmode);
  ChangeDisplaySettings(DevMode,0);
end;

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  Caption :='Pencere Aktif Değil!';
  EnumDisplaySettings(nil, Listbox2.ItemIndex,Devmode);
  ChangeDisplaySettings(DevMode,0);
end;
Form aktif olduğunda formu açtığım anda sorun yok benim istediğim max. çözünürlüğe ulaşıyor fakat form pasif hale geldiğinde Caption da Pencere Aktif Değil yazısı çıkmasına rağmen herhangi bir değişiklik olmuyor.
İşletim sistemi Win10 Xp ve Win 7 de yaptığım testlerde de sonuç aynı :?
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Display Settings (Ekran Çözünürlüğü Değiştirme)

Mesaj gönderen mrmarman »

Her ikisinde de (0) nolu index'e odaklanıyorsun sorun burada...
Nasıl mı? ListBox1'in itemIndex'i de (0) ListBox2'nin ItemIndex'i de (0).

Önce her iki ListBox'a da tüm destekli çözünürlük listesini yüklemen ve istediğin iki tanesine index ile odaklaman lazım.

Ya da en sadesi, bu iki tane değeri iki farklı global değişkene yüklersin, aktifse birisi değilse diğeri kullanılsın şeklinde düzenleme yaparsın.

Dolayısı ile ChangeDisplaySettings'den önce EnumDisplaySettings ile seçeceğin index her ikisinde de 0 değil, örneğin birisinde 0 yani max ekran çözünürlüğü alırken diğerinde 500 gibi olacaktır.
Resim
Resim ....Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Display Settings (Ekran Çözünürlüğü Değiştirme)

Mesaj gönderen xozcanx »

mrmarman
Hocam cevap verdiğiniz için teşekkürer.
Kodları birazdaha kurcaladım eğer yanlış anlamadıysam olayın mantığı şu şekilde oluyor.
Listbox içine systemden bu çözünürlükler sıralı bir şekilde geliyor. bizde burada istediğimiz çözünürlüğü seçiyoruz. 1024x768 çözünürlüğü 13. sırada ise bizim kod

Kod: Tümünü seç

 EnumDisplaySettings(nil, 13,Devmode);
 ChangeDisplaySettings(DevMode,0);
oluyor. ben ise burada sürekli sıfır değerini atıyorum. dolayısı ile aktif çözünürlüğü sürekli tazelemiş oluyorum.
Şimdi merak ettiğim nokta, işi uzun yoldan yapmak istemiyorum sadece :)
Uygulama açıldığında aktif ekran çözünürlüğünün EnumDisplaySettings functionundaki Cardinal değerini almak için Listbox içinde arama yaparak bu değeri bulmam mı gerekiyor yoksa bu değeri verecek kısa bir kodumuz yada function varmıdır. :?
Şuan için Listbox içinde arama yapma yöntemini yapmaya çalışacağım.Eğer başka bir kısa yolu yok ise bulduğum çözümü paylaşırım.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Display Settings (Ekran Çözünürlüğü Değiştirme)

Mesaj gönderen mrmarman »

Listbox içine liste oluşturmayı gerçekleştir, sonra dilediğin çözünürlüğü bir string değişkene koy. Listbox.Items.Indexof( stringifade) sana ilgili sonucu döndürür.
Resim
Resim ....Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Display Settings (Ekran Çözünürlüğü Değiştirme)

Mesaj gönderen xozcanx »

mrmarman
Hocam şu şekilde ekran çözünürlüklerini 2 ListBox üzerinde topladım(kod kalabalığı var açıklamalı olsun diyerek bu şekilde ekledim)

Kod: Tümünü seç

var
  DevMode : TDevMode;
  liRetValue : Longint;
  i              : Integer;  
/////////////////
  
procedure TForm1.FormCreate(Sender: TObject);
begin  
  ListBox1.Clear; ListBox2.Clear;   Edit2.Clear; Edit3.Clear;

  EnumDisplaySettings(nil,0,Devmode);
  with Devmode do
  Edit1.Text :=IntToStr(Screen.Width)+'x'+IntToStr(Screen.Height);

  i := 0;
  while EnumDisplaySettings(nil,i,Devmode) do
  begin
    with Devmode do
      ListBox1.Items.Add(Trim( Format('%dx%d',[dmPelsWidth,dmPelsHeight])));
   Inc(i);
  end;
  ListBox2.Items  :=ListBox1.items;
  ListBox1.itemindex:=0;
  repeat
    if Edit1.Text=ListBox1.Items[ListBox1.ItemIndex] then
    Edit2.Text :=IntToStr(ListBox1.ItemIndex);
    ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
  until (Edit2.Text<>'');

  ListBox2.itemindex:=0;
  repeat
    if '1920x1080'=ListBox2.Items[ListBox2.ItemIndex] then
    Edit3.Text :=IntToStr(ListBox2.ItemIndex);
    ListBox2.ItemIndex:=ListBox2.ItemIndex+1;
  until (Edit3.Text<>''); 
End;  
Daha sonra uygulmak istediğimde ise

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
  EnumDisplaySettings(nil,  StrToInt(Edit3.Text),Devmode);
  ChangeDisplaySettings(DevMode,0);
end;

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  EnumDisplaySettings(nil, StrToInt(Edit2.Text),Devmode);
  ChangeDisplaySettings(DevMode,0);
end;
istediğim sonucu veriyor fakat Win7 de 16Bit seçmişim gibi arka plan görüntüsünde bir çözünürlük düşüşü var orjinal haline geri getirdiğim zaman :?
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Cevapla