- Bugüne değin Delphi BDS (Win32) kullanıyorken bir de Vista uyumunu göreyim diye Delphi 2007 (Win32) deneyim dedim. Tabiri yanlış olmazsa -Dakika 1- golü yedim.
(Kullandığım İşletim sistemi Windows Vista Home Premium )
Şöyle ki :
- Daha önce TSaveDialog lazım olduğunda kalabalıklık yapmasın diye Form'a koymaz dinamik olarak lazım olduğu yerde CREATE eder, sonra da işim bir daha olmayacağından FREE ederdim.
- TSaveDialog kullanırken olmazsa olmaz özelliklerinden FilterIndex özelliği ile, kullanıcının hangi dosya tipiyle "kaydetmek istediğini" / "tercih kullandığını" okuyup ona göre basit bir CASE bloğuyla işlem gerçekleşirdi.
- Sorunsal : FilterIndex değeri, If EXECUTE sorgusunda BDS2006 ve daha eski sürümlerde herhangi bir ek uygulamaya gerek kalmaksızın kullanıcının tercihine göre kendiliğinden güncellenirken, Delphi 2007 ile varsayılan değerde kaldığını farkettim. Bunun varsayılan değerden kullanıcının tercihi doğrultusunda değiştiğini görmek için illaki de boş ta olsa bir tane OnTypeChange eventini eklemek gerekiyor olmuş.
- Bu BUG mı GEREKLİLİK mi tartışmaya açık ama daha önce bu şekilde tercih sunanlar için bilinmesi gereken bir durum olduğunun altını çizmek istedim.
- Artık her formda (Sender: TObject); parametreli boş bir EVENT koyup, bu ve benzeri varsa başkaları varsa hepsini oraya yönlendirmek lazım gelir olduğunu bilmek beni üzdü.
Örnek Kod :
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
Var
Secili : String;
begin
Secili := '';
With TSaveDialog.Create(Nil) do begin
// eskiden aşağıdaki bu tek satır olmadan da çalışırdı...
// Dilerseniz deneyebilirsiniz, başına // ekleyin ve devre dışı bırakın...
// ------------------------------------------------------
OnTypeChange := KulkaEvent;
Filename := 'TEST';
Filter := 'DOC Dosyaları|*.doc|XLS Dosyaları|*.xls|CSV Dosyaları|*.csv';
FilterIndex := 2; // Varsayılan olarak XLS olanlar seçilsin dedik..
if Execute then begin
case FilterIndex of
1: Secili := 'DOC Dosyaları|*.doc';
2: Secili := 'XLS Dosyaları|*.xls';
3: Secili := 'CSV Dosyaları|*.csv';
end;
ShowMessage( Secili );
end;
Free; // With SaveDialog
end;
end;
Kod: Tümünü seç
procedure TForm1.KulkaEvent(Sender: TObject);
begin
; // bu şekilde boş bir Event koymazsak kullanıcı tercihini yapsa da / değiştirse de FilterIndex değişmiyor..
end;
// KuklaEvent'i Private altında otomatik olarak oluşturmak için üzerinde "CTRL + SHIFT + C" basın. Ya da aşağıdaki kısmı da en yukarı ekleyin.
Kod: Tümünü seç
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure KulkaEvent(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;