21-06-2018, Saat: 10:04
Kısmen dil dosyası işlemi yaptım. Fakat daha eksikleri de var. Kod olarak da paylaşmak istedim. Daha öncede dediğim gibi bir Framework yapıyorum. Daha eksikleri var. Bittiğinde linkini paylaşacağım.
Yapı şu şekilde Her bir Output form(DBGrid ile listelenen form) ve Input form(Girişlerin yapıldığı edit ve label kontrollerin olduğu form) içinde bir tane Table (TTable) sınıf bilgisi var.
Output ve Input form açılırken bu table sınıfı create edilerek parametre olarak gönderiliyor. Böylece her form kendi sınıfını biliyor.
Output ve Input formlar kendi baz form sınıflarından miras ile çalışıyor.
İlk programa giriş ekranında(login form) dil seçeneğini soruyorum. Girilen dil bilgisini ConnSetting.Language içinde tutuyorum. Bu bilgi benim dil için referansım oluyor.
Aşağıdaki fonksiyon bana veri tabanından istediğim bilginin istenilen dile göre sonucunu getiriyor. Veri tabanında sorun olması durumuna karşın varsayılan değer olarak birde bilgi gönderiyorum. Sonucu veri tabanında bulamaz ise varsayılan bilgi kullanıcıya sunuluyor. Böyle program dil bilgisi olmasa/veri tabanında bu girişe ait bir dil kaydı olmasa bile varsayılan bilgiler ile çalışmaya devam ediyor.
Örnek Veri tabanı bilgileri
Input ve Output Formlar için Form başlıkları,
Bu record SingletonDB sınıfı içinde tanımlı durumda. Bu record framework için kullanılan standart mesaj veya buton başlıkları için kullanılıyor.
Veri tabanından dil seçeneğine göre bilgileri çeken fonksiyon
Bu kod DBGrid içinde Kolonların başlıklarını değiştiriyor.
Butonlar ve diğer mesajlar içinde işlemler yaptım.
Yazımda umarım eksik yoktur. Yazmak epey yorucu oldu ve zaman aldı.
Fakat bu bilgiler ek olarak birde sorunum var.
İlk program çalıştırıldığında giriş formunda (login) kullanıcı adı ve şifre girildikten sonra onay butonuna tıklanınca veri tabanına bağlanıyorum. Kontrol yaparak doğruysa o zaman giriş yapıyorum.
Bu veri tabanı bağlantı işlemini nasıl yapmamı tavsiye edersiniz. Program ilk çalıştırıldığında veri tabanına bağlantı yaptıktan sonra login formda onay butonu tıklanınca kullanıcılar tablosunda kullanıcı adı ve şifre kontrolü mü yapmalıyım?
Yapı şu şekilde Her bir Output form(DBGrid ile listelenen form) ve Input form(Girişlerin yapıldığı edit ve label kontrollerin olduğu form) içinde bir tane Table (TTable) sınıf bilgisi var.
Output ve Input form açılırken bu table sınıfı create edilerek parametre olarak gönderiliyor. Böylece her form kendi sınıfını biliyor.
Output ve Input formlar kendi baz form sınıflarından miras ile çalışıyor.
İlk programa giriş ekranında(login form) dil seçeneğini soruyorum. Girilen dil bilgisini ConnSetting.Language içinde tutuyorum. Bu bilgi benim dil için referansım oluyor.
Aşağıdaki fonksiyon bana veri tabanından istediğim bilginin istenilen dile göre sonucunu getiriyor. Veri tabanında sorun olması durumuna karşın varsayılan değer olarak birde bilgi gönderiyorum. Sonucu veri tabanında bulamaz ise varsayılan bilgi kullanıcıya sunuluyor. Böyle program dil bilgisi olmasa/veri tabanında bu girişe ait bir dil kaydı olmasa bile varsayılan bilgiler ile çalışmaya devam ediyor.
CREATE TABLE public.sys_lang_contents ( id serial, --sequence incremental validity boolean NOT NULL DEFAULT true, lang character varying(3), code character varying(64), value text, is_factory_settings boolean NOT NULL DEFAULT false, CONSTRAINT sys_lang_contents_pkey PRIMARY KEY (id), CONSTRAINT sys_lang_contents_lang_fkey FOREIGN KEY (lang) REFERENCES public.sys_lang (language) MATCH SIMPLE ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT sys_lang_contents_lang_code_key UNIQUE (lang, code) )
Örnek Veri tabanı bilgileri
Input ve Output Formlar için Form başlıkları,
----------------------------------------------------------- | lang | code | value ----------------------------------------------------------- | TR | FormCaption.Input.city | Şehir | EN | FormCaption.Input.city | City | TR | FormCaption.Output.city | Şehirler | EN | FormCaption.Output.city | Cities | TR | GridFieldCaption.city.city_name | ŞEHİR | EN | GridFieldCaption.city.city_name | CITY | TR | LabelCaption.Input.city.city_name | Şehir Adı | EN | LabelCaption.Input.city.city_name | City Name | TR | BUTON KAPAT | KAPAT | EN | BUTON KAPAT | CLOSE | TR | HATA ERİŞİM HAKKI | Erişim hakkı hatası!!! | EN | HATA ERİŞİM HAKKI | Access right failure! -----------------------------------------------------------
type TLang = record ... ButonKapat: string; ... HataErisimHakki: string; ... end;
Bu record SingletonDB sınıfı içinde tanımlı durumda. Bu record framework için kullanılan standart mesaj veya buton başlıkları için kullanılıyor.
public LangFramework: TLang write FLangFrameworkİlk proje açılışında aşağıdaki gibi sabit bilgi olarak giriyoruz.
FLangFramework.ButonKapat := 'BUTON KAPAT'; FLangFramework.HataErisimHakki := 'HATA ERİŞİM HAKKI';
Veri tabanından dil seçeneğine göre bilgileri çeken fonksiyon
function TSingletonDB.GetTextFromLang(pDefault, pCode: string): string; var Query: TFDQuery; begin Result := pDefault; if Self.FInstance.DataBase.Connection.Connected then begin Query := Self.FInstance.DataBase.NewQuery; try with Query do begin Close; SQL.Text := 'SELECT value FROM sys_lang_contents WHERE lang=:lang and code=:code;'; ParamByName('lang').Value := Self.FInstance.DataBase.ConnSetting.Language; ParamByName('code').Value := pCode; Open; if not Fields.Fields[0].IsNull then Result := Fields.Fields[0].AsString; if Result = '' then Result := pDefault; EmptyDataSet; Close; end; finally Query.Free; end; end; end;
Bu kod DBGrid içinde Kolonların başlıklarını değiştiriyor.
procedure TfrmBaseDBGrid.RefreshDataFirst(); var nIndex: Integer; begin Table.SelectToDatasource(FQueryDefaultFilter + FQueryDefaultOrder, True); for nIndex := 0 to Table.DataSource.DataSet.FieldCount - 1 do begin with dbgrdBase.Columns.Add do begin FieldName := Table.DataSource.DataSet.Fields[nIndex].FieldName; Title.Caption := Table.DataSource.DataSet.Fields[nIndex].DisplayName; Title.Caption := TSingletonDB.GetInstance.GetTextFromLang(Title.Caption, 'GridFieldCaption.' + Table.TableName + '.' + FieldName); Title.Color := clBlack; ... end; end; end;
procedure TfrmBaseInputDB.FormShow(Sender: TObject); var vCtx : TRttiContext; vRtf : TRttiField; vRtt : TRttiType; vLabel: TLabel; begin //Bu kod Input form üzerindeki Label Caption bilgilerini dil dosyasına göre getiriyor. inherited; vCtx := TRttiContext.Create; vRtt := vCtx.GetType(Self.ClassType); for vRtf in vRtt.GetFields do //label component isimleri lbl + db_field_name olacak şekilde verileceği varsayılarak bu kod yazildi. örnek: lblcountry_code if vRtf.FieldType.Name = 'TLabel' then begin vLabel := TLabel(FindComponent(vRtf.Name)); TLabel(vLabel).Caption := TSingletonDB.GetInstance.GetTextFromLang(TLabel(vLabel).Caption, 'LabelCaption.Input.' + Table.TableName + '.' + RightStr(TLabel(vLabel).Name, Length(TLabel(vLabel).Name)-3)); end; Self.Caption := TSingletonDB.GetInstance.GetTextFromLang(Self.Caption, 'FormCaption.Input.' + Table.TableName); end;
Butonlar ve diğer mesajlar içinde işlemler yaptım.
//örnek buton başlığı btnClose.Caption := TSingletonDB.GetInstance.GetTextFromLang('CLOSE', TSingletonDB.GetInstance.LangFramework.ButonKapat); //örnek mesaj hata kodu raise Exception.Create(TSingletonDB.GetInstance.GetTextFromLang('Access right failure!', TSingletonDB.GetInstance.LangFramework.HataErisimHakki));
Yazımda umarım eksik yoktur. Yazmak epey yorucu oldu ve zaman aldı.
Fakat bu bilgiler ek olarak birde sorunum var.
İlk program çalıştırıldığında giriş formunda (login) kullanıcı adı ve şifre girildikten sonra onay butonuna tıklanınca veri tabanına bağlanıyorum. Kontrol yaparak doğruysa o zaman giriş yapıyorum.
Bu veri tabanı bağlantı işlemini nasıl yapmamı tavsiye edersiniz. Program ilk çalıştırıldığında veri tabanına bağlantı yaptıktan sonra login formda onay butonu tıklanınca kullanıcılar tablosunda kullanıcı adı ve şifre kontrolü mü yapmalıyım?
PostgreSQL - Linux - Delphi, Poliüretan