✪ DeathKO ✪ | v.1098 MYKO | ASCEND | Rekor Ödül Havuzu | Büyük Academy : 06 Mart 2026 - HAZIR OL!
emostyle,
Kral olayını iyi oldu söylediğin, onu da ekleyeyim. Ama listeleme ekranı çok kalabalık oldu gibi ,oraya koyamayız herhalde. Sadece "edit" ekranına koysakta bir anlamı olmaz. Uygun birşey düşüneyim ben ona. Ayrıca kod olayına gelince neden bu kadar isteklisiniz anlamıyorum. Ben Delphi'nin çok farklı bir komponent ailesini kullanıyorum. Üstünde kod geliştirmeniz zaten zor olacaktır. Ama dediğim gibi hala devam ettiğim için yayınlamayı düşünmüyorum.
cok cimrisin yabi kaç ufak kod ve sql baglantısı kodunu paylaşırmısın peki ona göre bişiler yapabiliriz eheh
procedure TMainForm.btnConnectClick(Sender: TObject);
var
ConnectionStr:String; // result string
SqlName:String; // Sql server provider: Insctance Name
Password:String; // Temporary holder of password
begin
try
Screen.Cursor := crHourGlass; // fire the time
try
if acMain.Connected = False then begin // connect if not already connected
if IsOdbc = True then begin
if OdbcTrusted = False then begin // ODBC PREPARE: mixed mode
if OdbcPassNoSave = True then begin // ODBC PREPARE: Password. display dialog if user chose not to save
if InputQuery(resPassDialogTitle, resPassDialogContent, Password) = False then begin
btnConnect.Down := False; // cancel pressed, restore button and exit
Exit;
end;
end else
Password := OdbcPass;
ConnectionStr := Format(OdbcMixed, [OdbcName, OdbcUser, Password]);
end else // ODBC PREPARE: windows authentication
ConnectionStr := Format(OdbcWindows, [OdbcName]);
end else begin // SQL Server Provider
if SqlIsDefault = True then // SQL PREPARE: Default Instance or Named Instance
SqlName := SqlLocal
else
SqlName := SqlName;
if SqlTrusted = False then begin // SQL PREPARE: mixed mode
if SqlPassNoSave = True then begin // SQL PREPARE: Password. display dialog if user chose not to save
if InputQuery(resPassDialogTitle, resPassDialogContent, Password) = False then begin
btnConnect.Down := False; // cancel pressed, restore button and exit
Exit;
end;
end else
Password := SqlPass;
ConnectionStr := Format(SqlMixed, [SqlDb, SqlName, SqlUser, Password]);
end else // SQL PREPARE: windows authentication
ConnectionStr := Format(SqlWindows, [SqlDb, SqlName]);
end;
acMain.ConnectionString := ConnectionStr;
acMain.Connected := True; // connect
end else // already connected
acMain.Connected := False; // disconnect
except
on e: Exception do begin // if any error
MessageDlg(Format(resDbError, [E.ClassName, E.Message]), mtError, [mbOK], 0);
btnConnect.Down := False; // uncheck the button
Exit; // and exit (to finally routine)
end;
end;
finally
Screen.Cursor := crArrow;
end;
end;
acMain: TADOConnection komponenti
btnConnect: Connect/Disconnect dediğimiz tuş
IsOdbc: Boolean. Ayarlar penceresindeki "ODBC" veya Doğrudan "SQL Server" olduğunu belirtiyor
OdbcTrusted: Boolean. Oturum açma bilgileri için "Windows authentication" seçilmiş
OdbcPassNoSave: Boolean. kullanıcı ini dosyasına şifre kaydedilmemesini seçmiş
OdbcName: String. Bağlanılacak ODBC kaynak adı
OdbcUser: String. Windows authentication seçilmemişse gerekli olan kullanıcı adı
OdbcPass: String. " " gerekli olan şifre
SqlIsDefault: Boolean. Default Instance seçilmiş
SqlName: String. Default Instance seçilmemişse kullanılacak olan Named Instance adı
SqlTrusted: Boolean. Oturum açma bilgileri için "Windows authentication" seçilmiş
SqlPassNoSave: Boolean. kullanıcı ini dosyasına şifre kaydedilmemesini seçmiş
SqlUser: String. Windows authentication seçilmemişse gerekli olan kullanıcı adı
SqlPass: String. " " gerekli olan şifre
const
SqlMixed = 'Provider=SQLOLEDB.1;Initial Catalog=%s;Data Source=%s;Persist Security Info=True;User ID=%s;Password=%s';
SqlWindows = 'Provider=SQLOLEDB.1;Initial Catalog=%s;Data Source=%s;Persist Security Info=False;Integrated Security=SSPI';
SqlLocal = '.';
OdbcMixed = 'Provider=MSDASQL.1;Data Source=%s;Persist Security Info=True;User ID=%s;Password=%s';
OdbcWindows = 'Provider=MSDASQL.1;Data Source=%s;Persist Security Info=False';
resourcestring
resPassDialogTitle = 'Enter sql server password';
resPassDialogContent = 'You chose not to save password.'+sLineBreak+'Leave it blank for empty password.'+sLineBreak+'Press cancel to return.';
resDbError = 'Error while database connection.'+sLineBreak+sLineBreak+'Error Class: %s'+sLineBreak+'Error Message: %s';
AVCI,
Evet Developer Express kullanıyorum. Senin gibi geçmişi olanlar kullanabilir ama Delphi ve VCL kütüphanelerine henüz yeni olan arkadaşlar zorlanacaktır. Çünkü koddan ziyade "event" tabanlı bir program yazmak gerekiyor, ve komponent özelliklerine ince ayar çekmek gerekiyor. Komponenti geliştirenler birçok şeyi düşünmüş, sadece vakit lazım kurcalayıp bulmak için. Misal geçtiğimiz 2 gün boyunca bir hatayı çözmek için uğraştım; aynı anda iki tane karakter listesi ekranı açıp listeye dokunmadan (yani sql cursor değişmeyecek) arama yaptığında işlemciyi sonuna kadar kullanacak şekilde kilitleniyordu. Nedeni ise Form.OnShow olduğunda en soldaki Edit nesnesine SetFocus (yazım kolay olsun diye) yapmammış. Dolayısıyla Sql Cursor kurulamıyor ve ADO.Refresh olunca hata meydana geliyor. Onun için şuanda çok çetrefilli hale gelmiş olan koda yanlış yerinden dokununca mutlaka patlak verecektir. Yoksa kimsenin bilgisine laf ediyor değilim.
Stat değiştirme özelliği aktif. Sadece skill özelliği yok, onu da unutmuşum. Ayrıca bu programa piyasadaki hiçbir programda olmayan denetimleri ekledim. Gelişi güzel yazılmış programlarla isim değişikliği yaparken veritabanında primary key olmadığı için o ismin daha önceden varlığını kontrol etmeden hemen UPDATE yapan programlar var. Ayrıca karakterin oyunda olup olmadığını da sorgulatıyorum, dolayısıyla hiçbir hata meydana gelmiyor. Ayrıca ırk değişikliğini yapan programlar klan disband etmiyordu, bırak ki ally varsa onları ayırsın öncelikle. Ben bunların hepsini kodladım. Irk değişikliğini yapanların kodlarında en büyük kısmı CLASS değerini seçmek oluyor, yüzlerce satır CASE WHEN yazıyorlar. Benim SQL kodumu incelemişsen ben bunu 47 satır içerisinde çözdüğümü görmüşsündür (Bu 47 satırın 13 satırı sırf hata kontrolü). Mesela yeni ırkı bulmak için XOR fonksyionu kullanmışım, bu bile bir ayrıcalıktır. IF ELSE ile sunucuyu yormuyorum bile.
Karakter düzenleyiciye gelirsek; seninkinden eksik kalır yanı yok, fazlası var. Belki bu sayacağım özellikler birçoğunun işine yaramayacaktır, ama ihtiyaç duyulduğunda bunları yapabilmenin yolu bu programdan geçer. Oyundaki oyuncuları listeleme, oyundaki oyunculardan rogue olanları listeleme, isminde bug karakter olanları bulma, np simgesine en çok sahip olan sınıf bulma (eşit oyun mu değil mi), ırk dengesini bulma, en iyi klanları listeleme (hangi ırkın klanı daha güçlü), kolluğu yanan klanları bulma, sadece banlı oyuncuları görüntüleme, sadece GM'leri listeleme.......
Bunları kullanmayı öğrendiğinizde işleriniz çok hızlakacaktır. Özellik eklemeye devam ediyorum, "inventory editor" ve dahası gelmiş olacak. Sonuçta bu kadarını yapıp bırakacağız diye çıkmadık yola. Her birine 1 hafta versek, birkaç ay sonra bütün editörler tek programda ve bütün hepsi birbirine bağlı çalışacak. Şuan klan listesinden kullanıcı hesabına geçildiği ve oradan ırk değişikliğine geçildiği gibi.