[ Miloš Baić @ 31.03.2006. 15:42 ] @
Kao što sam postovao u vezi pravljenja dinamičkih edita na formi, sad mi je interesantno napraviti i dinamičke menije! Naime, napravio sam jednu tabelu u kojoj se nalaze podaci o tabelama, formama, menijima, poljima... Meni, konkretno, treba da napravim dinamički podmeni. Da iz te tabele pozivam podmeni sa kojeg pozivam neku formu. Postavio sam MainMenu, recimo, TABELE, a pod meni bi trebao biti LICA. Pa, OnClick, na LICA otvara formu za pretragu lica. Taj podmeni LICA bi trebao da se kreira dinamički iz tabele i da bude povezan sa formom za pretragu lica... To kreiranje bi trebalo da se odvija na MainForm, sa koje se otvara forma za pretragu LICA.

Da li neko zna nešto o ovome?

pozzzzz....
[ Miloš Baić @ 01.04.2006. 15:58 ] @
Pokušao sam naći nešto o tome na:
http://delphi.about.com/
http://www.torry.net/

ali, bezuspešno, nažalost... Help plss...
[ Srki_82 @ 01.04.2006. 17:03 ] @
Evo... da ne bude posle kako niko nece da ti pomogne, a ti pomazes svima. Ne znam da li sam bas razumeo sta ti tacno treba, ali ovaj primer koji sam nabrzaka napisao radi sledece:

1. Otvori tabelu iz baze u kojoj se nalaze 3 polja:
a) Parent: ime menija u kojem treba da se kreira nov meni koji ce otvoriti neku formu
b) Name: ime menija koji se kreira
c) Form: naziv klase forme koja treba da se kreira kada se klikne na meni

2. Kada uzme Parent prodje kroz ceo meni i pretrazi da li taj meni vec postoji... ako ne postoji, kreira se

3. Kreira se nov meni u meniju Parent

4. Ako je navedena klasa forme postavlja se OnClick event

I tako za svaki red u tabeli.
Ovo je prilicno prost primer... ne znam bas da li ce ti posluziti, ali ces bar videti kako mozes dinamicki da kreiras menije pa ce ti mozda pasti na pamet kako da sam uradis ono sto tebi stvarno treba.
[ Miloš Baić @ 01.04.2006. 20:42 ] @
Preleto sam preko primera koji si postavio i mislim da je to ono što mi treba... Kad stignem da ga detaljnije proučim, noćas, javim ti...
Hvala ti puno...
[ Miloš Baić @ 02.04.2006. 13:11 ] @
Malo sam uhvatio vremena, pa odradio po tvome primeru... Znači, kod sam integrisao u moj primer i izvršio samo osnovne izmene...
Naime, napravio sam tabelu sa poljima, analogno tvojoj, PARENT, MENI, FORM, uneo Sifrant, Osobe, TPretragaOsobe...
Naravno, postoji forma, PretragaOsobe, kao i OsobePretraga.pas, ali prikaže se greška Class TPretragaOsobe not found???
Dakle, pokrene se program, pojavi se dinamički napravljen meni, parent: Šifrant, ispode njega meni: Osobe, a kad kliknem na meni osobe, prijavi, jel, tu grešku: "Class TPretragaOsobe not found"?!
[ Srki_82 @ 02.04.2006. 14:13 ] @
Da li si registrovao tu klasu?

Pogledaj *.dpr fajl... na pocetku registrujem sve forme.
Registraciju klase mozes da uradis bilo kad pre njenog trazenja... mozes recimo u initialization delu unit-a.
[ Miloš Baić @ 02.04.2006. 17:13 ] @
Vidi:
Code:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.


Trebalo bi po ovome da je ok, a?
Ali i dalje: "Class TForm2 not found"!!!
Ovo sam radio baš po tvome...
U tabeli mi je za polje Form vrednost TForm2.

A vidi malo i ovde:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Menus, Unit2;

type
  TForm1 = class(TForm)
    mnuMain: TMainMenu;
    tblMenu: TADOTable;
    procedure FormCreate(Sender: TObject);
    procedure MenuClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
  FormNames: TStringList;
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}
var
  Form2: TForm2;

function FindMenuItem(Parent: TMenuItem; ACaption: String): TMenuItem;
var
  I: Integer;
begin
  I := 0;
  Result := Parent.Find(ACaption);
  while (Result = nil) and (I < Parent.Count) do
  begin
    Result := FindMenuItem(Parent.Items[I], ACaption);
    Inc(I);
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  M, P: TMenuItem;
  ParentName, MenuName, FormName: String;
begin
  FormNames := TStringList.Create;
  
  while not tblMenu.Eof do
  begin
    ParentName := tblMenu.FieldByName('Parent').AsString;
    MenuName := tblMenu.FieldByName('Meni').AsString;
    FormName := tblMenu.FieldByName('Form').AsString;

    P := FindMenuItem(mnuMain.Items, ParentName);
    if P = nil then
    begin
      P := TMenuItem.Create(mnuMain);
      P.Name := ParentName;
      P.Caption := P.Name;
      mnuMain.Items.Add(P);
    end;

    M := TMenuItem.Create(mnuMain);
    M.Name := MenuName;
    M.Caption := M.Name;
    P.Add(M);
    if FormName <> '' then
    begin
      FormNames.Add(FormName);
      M.Tag := FormNames.Count - 1;
      M.OnClick := MenuClick;
    end;

    tblMenu.Next;
  end;

end;

procedure TForm1.MenuClick(Sender: TObject);
var
  F: TForm;
  C: TComponentClass;
begin
  F := nil;
  try
    C := TComponentClass(FindClass(FormNames[TMenuItem(Sender).Tag]));
    Application.CreateForm(C, F);
    F.ShowModal;
  finally
    if Assigned(F) then
      FreeAndNil(F);
  end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
   if Assigned(FormNames) then
    FreeAndNil(FormNames);
end;

end.


I šta misliš, gde sam pogrešio?!
[ Srki_82 @ 02.04.2006. 17:23 ] @
Hajde sad lepo pogledaj kod koji sam ja posalo... da li primecujes da kod mene ima RegisterClasses, a kod tebe nema?

Lepo sam ti rekao da mozes da registrujes klase na pocetku programa ili, ako ti je lakse da se snadjes, u initialization delu unit-a u kome si definisao formu. Ako registrujes samo jednu klasu mozes koristiti RegisterClass, a ako registrujes vise klasa onda RegisterClasses.

RegisterClasses jednostavno poziva RegisterClass za svaku klasu u prosledjenom nizu.

P.S.
Slobodno me cimni na nekom messengeru.

[Ovu poruku je menjao Srki_82 dana 02.04.2006. u 18:24 GMT+1]
[ Miloš Baić @ 02.04.2006. 17:40 ] @
Baš sam sad hteo da ti javim da sam skontao, odradio sam:
Code:
program Project1;

uses
  Forms,
  Classes,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  RegisterClasses([TForm2]);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

I sad funkcioniše lepo...
Hvala ti puno, još jednom... I biće pitanja na ovu temu još, sigurno....
[ Miloš Baić @ 02.04.2006. 23:26 ] @
Ubacio sam taj primer u neki moj program i sad imam problem. Naime, odradio sam da se na osnovu klika na meni ode na jednu formu. Na toj formi ima dugme sa koje se poziva forma za izmene (edit) podataka. Sa dbgrid-a ili ADOTable treba da se na toj formi, kad isfiltriram lice, za edit odradi:

Code:
eFieldsList[i].Text:=PretragaOsoba.ADOOsoba.FieldByName(FilterList.Strings[i]).AsString;


da se ispune dinačmiki kreirani editi, to i uradi ali ja recimo isfiltriram lice pod ID = 5, a prikazuje se lice pod ID = 1, i što je zanimljivo kad odradim editovanje i snimim izvrši se nad ID = 5?!
Znači, fokusira se na dato lice, ali pokazuje u listi lice pod ID = 1 ?!!!
To nije bilo dok nisam postavio ovo za menije, radilo je kako treba!
Klikom na meni otvara se ta forma, gde se vrši pretraga i kad se isfiltrira klikom na dugme 'Izmene' se otvara forma za izmene.
Da nije to problem?
[ Miloš Baić @ 06.04.2006. 14:49 ] @
Kako da u primeru koji si postavio, Srki_82, napravim i ShortCut, dinamicki?
pozz...
[ csdsgn @ 04.05.2009. 19:20 ] @
Milose bas si dobar u ovome, mene zanima kako ces dodati onclick event neku funkciju ili proceduru a ne formu...
Ako si raspolozen voleo bih da nastavis kod.
Ratko