Veritabanı ve Mainmenu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Veritabanı ve Mainmenu

Mesaj gönderen adnansirca »

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.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Veritabanı ve Mainmenu

Mesaj gönderen thelvaci »

Sender = MenuItem yerine Sender is TMenuItem yazmalısınız ;) Kullanacağınız zamanda Sender as TMenuItem yada TMenuItem(Sender) biçiminde kullanabilirsiniz.
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Re: Veritabanı ve Mainmenu

Mesaj gönderen adnansirca »

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.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Veritabanı ve Mainmenu

Mesaj gönderen thelvaci »

Ö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;
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

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

Mesaj gönderen adnansirca »

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.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2385
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Veritabanı ve Mainmenu

Mesaj gönderen freeman35 »

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...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla