[ ratko83 @ 03.02.2010. 18:16 ] @
Molim vas pomognite mi bas ne znam gde bijem....


Koristim Zeos komponente i firebird server.
Imam tabelu tblmenu sa kojom uredjujem meni na glavnoj formi, poenta svega je da se ceo meni nalazi u tabeli zato sto bih menjao pozicije i sl. dinamicki.

Code 1:

Kad pokrenem aplikaciju izvrsavam ovo:
Code:

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('Name').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;



Kad kliknem na neki item menija radi ovo:
Code:

Code: 2;
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;

za Code 2 mi treba pomoc, u tabeli imam polja id, parent, nazivforme, nazivprocedure....
Code 2: samo poziva formu ali nece neku proceduru tipa
class procedure helloWorld;
begin
.....
end;

to nece, samo forma.....

Kako da nekom itemu dam putanju posto u tabeli imam polja nazivforme i nazivprocedure kao forma -> procedura ili samo forma....?

Mislim da ce me neko razumeti...

Hvala unapred!

[Ovu poruku je menjao savkic dana 04.02.2010. u 00:03 GMT+1]
[ tkaranovic @ 05.02.2010. 03:35 ] @
Može ovako:

Code (delphi):

type
  TKlasaMetoda = class
  published
    procedure p1;
    ...
  end;

...


   TMethod(Metod).Code := TKlasaMetoda.MethodAddress('p1');
   if TMethod(Metod).Code <> nil then begin
    TMethod(Metod).Data := TKlasaMetoda;
    SetMethodProp(_StaGod_,'OnClick', Metod);
   end;
 


interesantna stvar je da mogu da se pozivaju funcije (procedure) koje imaju različte parametre ili ih nemaju.

[ ratko83 @ 05.02.2010. 19:43 ] @
A sta ide iznad ovoga:


TMethod(Metod).Code := TKlasaMetoda.MethodAddress('p1');
if TMethod(Metod).Code <> nil then begin
TMethod(Metod).Data := TKlasaMetoda;
SetMethodProp(_StaGod_,'OnClick', Metod);
end;



Var
?
[ ratko83 @ 05.02.2010. 19:45 ] @
Kako da implementiram kroz bazu podataka odnosno kroz tabelu tblmenu...
[ tkaranovic @ 06.02.2010. 05:49 ] @
Onako kako si inače planirao da to uradiš sa helloWorld, koja isto može da bude u published klase KlasaMetoda i može i ona da se poziva.

Ako nisi imao konkretnu ideju dopisaću (i opis) kako bi to moglo u kodu koji si poslao gore:

Svaki meni ima svoje ime (imao je i do sada: MenuName) a može da ima i ime metode (dodato kao: ImeMenija) koju poziva. Umesto što svi meniji pozivaju jednu istu metodu čije je ime MenuClick sada mogu svi meniji da pozivaju svoje metode.

Stavio sam lako uočljiv komentar uz izmene koje sam dodao.

Code (delphi):

var
  M, P: TMenuItem;
  ParentName, MenuName, FormName, ImeMenija: String; // ++++++ ImeMenija
  Metod: TMethod; //++++++++
begin
  FormNames := TStringList.Create;
 
  while not tblMenu.Eof do
  begin
    ParentName := tblMenu.FieldByName('Parent').AsString;
    MenuName := tblMenu.FieldByName('Name').AsString;
    FormName := tblMenu.FieldByName('Form').AsString;
    ImeMenija := tblMenu.FieldByName('Metoda').AsString; //Ime metoda koje ce pozivati MenuItem

    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; //--------- Ovo vise nije potrebno
     
      //M.OnClick := MenuClick; //--------------  ovaj red je zamenjen
      //Umesto zajednicki MenuClick svakom meniju njegova metoda:

      //+++++++ pocetak
      TMethod(Metod).Code := TKlasaMetoda.MethodAddress(ImeMenija); //ImeMenija kao ime metode
      if TMethod(Metod).Code <> nil then begin
       TMethod(Metod).Data := TKlasaMetoda;
       SetMethodProp(M,'OnClick', Metod); //ImeMenija metoda je dodeljena meniju sa imenom MenuName
      end;
      //+++++++ kraj
     
    end;

    tblMenu.Next;
  end;
 


[ ratko83 @ 06.02.2010. 15:03 ] @

Nemogu da izvrsim kompajliranje...

greska undeclared indtifier...
FindMeniuItem
SetMethodProp


Sta mi nedostaje...?
[ ratko83 @ 06.02.2010. 15:26 ] @
Resio sam problem sa SetMethodProp u uses sam dodao Typinfo ali ostao je problem sa
FindMenuItem?
undeclared identifier...FindMenuItem
[ ratko83 @ 06.02.2010. 15:37 ] @
Reseno



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;
[ ratko83 @ 06.02.2010. 15:44 ] @
Postovani...Tomislav Karanović

Da li su ova polja u tabeli ok?


ID=1, PARENT=Datoteka, Name=HelloWorld,Metod=HelloWorld;

Kada kliknem item iz menia mnumenu sa nazivom HelloWorld nista se ne dogadja a imam proceduru :

procedure TKlasaMetoda.HelloWorld;
begin
ShowMessage('Hello world!');
end;
od klase
TKlasaMetoda


Sta li se desava?
[ ratko83 @ 06.02.2010. 15:49 ] @
Hvala ti puno.....


ovo mi je nedostajalo....
initialization
RegisterClass(TForm2);

finalization
UnRegisterClass(TForm2);
end.

Imas li neku idejo koju bi mogao da mi pomognes na ovom nivou programiranja ali bez menia njega sam resio napokon posle 3 godine, cudno zar ne....


Radio sam uvek dizajnerski dok mi prijatelji nisu rekli da sve to moze i kroz bazu podataka na nivou (runtime)....

Nema sta da se prica ti si mi pomogao extra: gospodin.....Tomislav Karanović