Mega Code Archive

 
Categories / Delphi / LAN Web TCP
 

Xml kullanarak dinamik menü oluşturmak

//XML Kullanarak Dinamik Menü Oluşturmak //...::::::( KORSAN )::::::...\\ procedure TMainForm.CreateMenuFromXMLFile; function Get_Int(S: string): Integer; begin Result := 0; try Result := StrToInt(S); except end; end; procedure AddRecursive(Parent: TMenuItem; Item: IXMLNode); var I: Integer; Node: TMenuItem; Child: IXMLNode; Address: TMethod; begin Node := TMenuItem.Create(Parent); if (Uppercase(Item.Attributes['CAPTION']) <> 'SEPERATOR') then begin Node.Caption := Item.Attributes['CAPTION']; if (Uppercase(Item.Attributes['ID']) <> 'NONE') then begin Address.Code := MethodAddress(Item.Attributes['ID']); Address.Data := Self; if (Item.ChildNodes.Count - 1 < 0) then Node.OnClick := TNotifyEvent(Address); end; if (Uppercase(Item.Attributes['SHORTCUT']) <> 'NONE') then Node.ShortCut := TextToShortCut(Item.Attributes['SHORTCUT']); Node.Checked := (Item.Attributes['CHECKED'] = '1'); end else Node.Caption := '-'; Node.Visible := (Item.Attributes['VISIBLE'] = '1'); if Parent <> nil then Parent.Add(Node) else MainMenu.Items.Add(Node); for I := 0 to Item.ChildNodes.Count - 1 do begin Child := item.ChildNodes[i]; if (Child.NodeName = 'ENTRY') then AddRecursive(Node, Child); end; end; var Root: IXMLMENUType; Parent: TMenuItem; I: Integer; Child: IXMLNode; begin XMLDocument.FileName := ExtractFilePath(Application.ExeName) + XMLFile; if not FileExists(XMLDocument.FileName) then begin MessageDlg('Menu-XML-Document nicht gefunden!', mtError, [mbOK], 0); Halt; end; XMLDocument.Active := True; Screen.Cursor := crHourglass; try Root := GetXMLMenu(XMLDocument); Parent := nil; for I := 0 to Root.ChildNodes.Count - 1 do begin Child := Root.ChildNodes[i]; if (Child.NodeName = 'ENTRY') then AddRecursive(Parent, Child); end; finally Screen.Cursor := crDefault; end; end; //--------------------------------------------------------------------------- unit XMLMenuTranslation; interface uses xmldom, XMLDoc, XMLIntf; type IXMLMENUType = interface; IXMLENTRYType = interface; IXMLMENUType = interface(IXMLNode) ['{8F36F5E2-834F-41D9-918F-9B1A441C9074}'] function Get_ENTRY: IXMLENTRYType; property ENTRY: IXMLENTRYType read Get_ENTRY; end; IXMLENTRYType = interface(IXMLNode) ['{AD85CD05-725E-40F8-A8D7-D6EC05FD4360}'] function Get_CAPTION: WideString; function Get_VISIBLE: Integer; function Get_ID: Integer; function Get_ENTRY: IXMLENTRYType; procedure Set_CAPTION(Value: WideString); procedure Set_VISIBLE(Value: Integer); procedure Set_ID(Value: Integer); property Caption: WideString read Get_CAPTION write Set_CAPTION; property Visible: Integer read Get_VISIBLE write Set_VISIBLE; property ID: Integer read Get_ID write Set_ID; property ENTRY: IXMLENTRYType read Get_ENTRY; end; TXMLMENUType = class; TXMLENTRYType = class; TXMLMENUType = class(TXMLNode, IXMLMENUType) protected function Get_ENTRY: IXMLENTRYType; public procedure AfterConstruction; override; end; TXMLENTRYType = class(TXMLNode, IXMLENTRYType) protected { IXMLENTRYType } function Get_CAPTION: WideString; function Get_VISIBLE: Integer; function Get_ID: Integer; function Get_ENTRY: IXMLENTRYType; procedure Set_CAPTION(Value: WideString); procedure Set_VISIBLE(Value: Integer); procedure Set_ID(Value: Integer); public procedure AfterConstruction; override; end; function GetXMLMENU(Doc: IXMLDocument): IXMLMENUType; function LoadMENU(const FileName: WideString): IXMLMENUType; function NewMENU: IXMLMENUType; implementation function GetXMLMENU(Doc: IXMLDocument): IXMLMENUType; begin Result := Doc.GetDocBinding('MENU', TXMLMENUType) as IXMLMENUType; end; function LoadMENU(const FileName: WideString): IXMLMENUType; begin Result := LoadXMLDocument(FileName).GetDocBinding('MENU', TXMLMENUType) as IXMLMENUType; end; function NewMENU: IXMLMENUType; begin Result := NewXMLDocument.GetDocBinding('MENU', TXMLMENUType) as IXMLMENUType; end; procedure TXMLMENUType.AfterConstruction; begin RegisterChildNode('ENTRY', TXMLENTRYType); inherited; end; function TXMLMENUType.Get_ENTRY: IXMLENTRYType; begin Result := ChildNodes['ENTRY'] as IXMLENTRYType; end; procedure TXMLENTRYType.AfterConstruction; begin RegisterChildNode('ENTRY', TXMLENTRYType); inherited; end; function TXMLENTRYType.Get_CAPTION: WideString; begin Result := ChildNodes['CAPTION'].Text; end; procedure TXMLENTRYType.Set_CAPTION(Value: WideString); begin ChildNodes['CAPTION'].NodeValue := Value; end; function TXMLENTRYType.Get_VISIBLE: Integer; begin Result := ChildNodes['VISIBLE'].NodeValue; end; procedure TXMLENTRYType.Set_VISIBLE(Value: Integer); begin ChildNodes['VISIBLE'].NodeValue := Value; end; function TXMLENTRYType.Get_ID: Integer; begin Result := ChildNodes['ID'].NodeValue; end; procedure TXMLENTRYType.Set_ID(Value: Integer); begin ChildNodes['ID'].NodeValue := Value; end; function TXMLENTRYType.Get_ENTRY: IXMLENTRYType; begin Result := ChildNodes['ENTRY'] as IXMLENTRYType; end; end. // Programın Çıktısı { <?xml version="1.0" encoding="ISO-8859-1"?> <MENU> <ENTRY CAPTION="Datei" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="Beenden" VISIBLE="1" ID="CloseProgram" SHORTCUT="Strg+X" CHECKED="0"></ENTRY> </ENTRY> <ENTRY CAPTION="Anzeige" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="Toolbar" VISIBLE="1" ID="ShowToolbar" SHORTCUT="None" CHECKED="1"></ENTRY> <ENTRY CAPTION="Seperator" VISIBLE="1"></ENTRY> <ENTRY CAPTION="Optionen" VISIBLE="1" ID="ShowOptionen" SHORTCUT="Strg+O" CHECKED="0"></ENTRY> </ENTRY> <ENTRY CAPTION="News" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="Refresh" VISIBLE="1" ID="RefreshAll" SHORTCUT="F5" CHECKED="0"></ENTRY> <ENTRY CAPTION="Seperator" VISIBLE="1"></ENTRY> <ENTRY CAPTION="Administration" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="neue Nachricht hinzufügen" VISIBLE="1" ID="NewMarkedNews" SHORTCUT="Strg+N" CHECKED="0"></ENTRY> <ENTRY CAPTION="markierte Nachricht bearbeiten" VISIBLE="1" ID="EditMarkedNews" SHORTCUT="Strg+E" CHECKED="0"></ENTRY> <ENTRY CAPTION="markierte Nachricht löschen" VISIBLE="1" ID="DeleteMarkedNews" SHORTCUT="None" CHECKED="0"></ENTRY> <ENTRY CAPTION="Seperator" VISIBLE="1"></ENTRY> <ENTRY CAPTION="Film hinzufügen" VISIBLE="1" ID="AddMPG" SHORTCUT="None" CHECKED="0"></ENTRY> <ENTRY CAPTION="markierten Film löschen" VISIBLE="1" ID="DeleteMPG" SHORTCUT="None" CHECKED="0"></ENTRY> </ENTRY> </ENTRY> <ENTRY CAPTION="Hilfe" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="LogView" VISIBLE="1" ID="ShowLog" SHORTCUT="Strg+L" CHECKED="0"></ENTRY> <ENTRY CAPTION="eMail schreiben" VISIBLE="1" ID="WriteEMail" SHORTCUT="None" CHECKED="0"></ENTRY> <ENTRY CAPTION="Seperator" VISIBLE="1"></ENTRY> <ENTRY CAPTION="Über" VISIBLE="1" ID="About" SHORTCUT="None" CHECKED="0"></ENTRY> </ENTRY> </MENU> }