Veritabanı ve Mainmenu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.

Veritabanı ve Mainmenu

İleti adnansirca » 29 Tem 2010 04:54

Arkadaşlar, runtime da mainmenu yü veritabanından okutuyorum. Ancak click olayını halledemedim.
Kod:
Kod: Tümünü seç
function MenuCreate(MenuForm : TForm;
  MenuName: String): Boolean;
var
ShowForm: TForm;
Menu : TMainMenu;
dongumenu,dongualtmenu,
dongualtaltmenu,essay :integer;

   Itemmenu,
     ItemSubmenu,
       ItemSubSubmenu : TMenuItem;
begin
Result := False;
essay := FrmGlobal.DSetTMenu.Recordcount;
  Try
    Menu := TMainMenu.Create(MenuForm);
    FrmGlobal.DSetTMenu.First;
    for dongumenu := 1 to essay do
     begin
      Itemmenu := TMenuItem.Create(menu);
      Itemmenu.Caption := FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
      menu.Items.Add(Itemmenu);
      Itemmenu.OnClick := MenuClick;
      FrmGlobal.DSetTMenu.Next;
     end;
  Finally
    Result := True
  end;

end;

MenuClick yordamı
Kod: Tümünü seç
procedure MenuClick(Sender: TObject);
var
ShowForm : TForm;
FormName : String;
MenuItem : TMenuItem;
i:Integer;
begin
if sender = MenuItem then
MenuItem.Name  := FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
FormName := FrmGlobal.DSetTMenu.Fieldbyname('SHOWFORM').AsString;
ShowForm.Name := FormName;
ShowForm.Show;
end;

ShowForm.Name kısmına doğrudan formun adını yazdığımda çalışıyor.
ancak veritabanındaki alanı gösterdiğimde access violation hatası alıyorum.
yardımlarınız için şimdiden teşekkürler.
adnansirca
Üye
 
İleti: 93
Kayıt: 14 Kas 2005 12:24

Re: Veritabanı ve Mainmenu

İleti thelvaci » 29 Tem 2010 09:43

Sender = MenuItem yerine Sender is TMenuItem yazmalısınız ;) Kullanacağınız zamanda Sender as TMenuItem yada TMenuItem(Sender) biçiminde kullanabilirsiniz.
thelvaci
Üye
 
İleti: 76
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul

Re: Veritabanı ve Mainmenu

İleti adnansirca » 30 Tem 2010 09:47

Cevap için teşekkürler.
Ben menuitem öğesine tıklandığında veritabanında ismi bulunan formu açmak istiyorum.
Yani
Form1.Show gibi doğrudan her bir öğe için kod yazmak yerine menü öğesine tıkladığım zaman veritabanında ismi bulunan ve projedeki mevcut formu açsın.
Delphi IDE de Project-View-Forms kısmından form listesine ulaşabiliyoruz biliyorsunuz. Listeden seçilen formu ekrana getirebliyoruz.
Ben de buna benzer bir olayı veritabanından yapmaya çalışıyorum.

Verdiğim kodda FormShow := Form1;
şeklinde yazdığımda işlem yapıyor.
Ancak field da tanımladığım veri şeklinde (yani fieldbyname('SHOWFORM') ki bu alanda Form1 olarak formun adı kayıtlı) çağırdığımda acces violation hatası veriyor.
Diğer bir anlamıyla form1 i bulamıyor.
bunun çözümü var mıdır sizce.
teşekkürler.
adnansirca
Üye
 
İleti: 93
Kayıt: 14 Kas 2005 12:24

Re: Veritabanı ve Mainmenu

İleti thelvaci » 30 Tem 2010 10:26

Öncelikle aşağıdaki MenuClick yordamınızdaki hataları görebilmenizi sağlamaya çalışmamız gerekiyor;

Kod: Tümünü seç
procedure MenuClick(Sender: TObject);
var
ShowForm : TForm;
FormName : String;
MenuItem : TMenuItem;
i:Integer;
begin
if sender = MenuItem then
MenuItem.Name  := FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
FormName := FrmGlobal.DSetTMenu.Fieldbyname('SHOWFORM').AsString;
ShowForm.Name := FormName;
ShowForm.Show;
end;


ShowForm ve MenuItem değişkenleriniz henüz sadece bir değişkenler. Onları Create ile oluşturmamışsınız yada oluşturulmuş bir başka nesneye eşitlememişsiniz. Dolayısı ile bu değişkenler ya nil olacaklardır yada hafızada abuk sabuk bir noktayı gösteriyor olacaklardır. Dolayısı ile ne MenuItem.Name atamanız doğrudur ne de ShowForm.Name ve ShowForm.Show çağrılarınız doğrudur. Yapmanız gereken ;

Kod: Tümünü seç
if Sender is TMenuItem then
  (Sender as TMenuItem).Caption := FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
FormName := FrmGlobal.DSetTMenu.Fieldbyname('SHOWFORM').AsString;
ShowForm := Application.FindComponent(FormName); // TScreen Forms listesi içinde de dönebilirsiniz.
if ShowForm <> nil then
  ShowForm.Show;
thelvaci
Üye
 
İleti: 76
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul

Re: Veritabanı ve Mainmenu(Çözüldü)

İleti adnansirca » 30 Tem 2010 10:53

teşekkürler thelvaci
kodu aşağıdaki gibi düzenledim ve çalışıyor.
Kod: Tümünü seç
procedure MenuClick(Sender: TObject);
var
ShowForm : TForm;
FormName : String;
MenuItem : TMenuItem;
i:Integer;
begin
if Sender is TMenuItem then
  (Sender as TMenuItem).Caption := FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
FormName := FrmGlobal.DSetTMenu.Fieldbyname('SHOWFORM').AsString;
  For i:=0 to Screen.FormCount -1 do
      Begin
         if Screen.Forms[i].Name =FormName then
         Begin
          ShowForm := Screen.Forms[i];
          Break;
         End;
      End;
   if ShowForm <> nil then
    ShowForm.Show;
end;


İyi Çalışmalar.
adnansirca
Üye
 
İleti: 93
Kayıt: 14 Kas 2005 12:24

Re: Veritabanı ve Mainmenu

İleti freeman35 » 31 Tem 2010 09:24

Yazdığın kod hata vermeden çalışıyo olabilir ama bana birden fazla form olursa mantıklı çalışmıyacak gibi geldi,
"if Sender is TMenuItem then" bu satır procedure ü tetikleyeni kotrol etmek için kullanıyor. Yani menü cliklenirse çalışır haricinde el ile tetikletebilirsin MenuClick(nil); gibi yada nil yerine menüitem ı gönderebilirsin.

FrmGlobal.DSetTMenu.Fieldbyname('ITEMMENU').AsString ;
database üzerindeki cursoru sen hareket ettirmediğin sürece (locate, next vs gibi) hep aynı değerleri alırsın. Ben olsam bunun yerine tableda ID diye bir field açarım yada mutlaka primerykey vardır onu MenuItem.Tag ve Form.Tag ile eşleştiririm bu beni ileride formların adlarını değiştirdiğimde karmaşayıda engellemiş olur.Exede istediğim değişikliği yapsam bile db de değişikliğe gitmeme gerek kalmaz.Hatta bu mantığı kullanacaksam Formlara kendim bir property eklerim yeni eklenen formların tag larında hataları biraz daha engellemiş olurum(unutma karışıklık vs gibi)
Kod: Tümünü seç
if (Screen.Forms[i]<>nil) and (Screen.Forms[i].Name =FormName) then
bu şekilde kullanman daha mantılı, program hata kontrolü herzaman elinizde olmalı, yazdığınız satırı çalıştığına emin olduktan sonra diğer olasılıklarlada çalışma ihtimalini düşünüp ona göre tedbir alın. işte esas programcılık budur.
Kolay gele

ZAGOR TENAY TÜRK
'tür... TÜRK kalacak...

FREEMAN 35.5

Zoru başarırım, İmkansız zaman alır
Kullanıcı avatarı
freeman35
Admin
 
İleti: 1191
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı


Programlama

Kimler çevrimiçi

Bu forumu görüntüleyenler: Kayıtlı kullanıcı yok ve 2 misafir