Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TMenuItem wird nicht angezeigt unter componentes? (https://www.delphipraxis.net/58271-tmenuitem-wird-nicht-angezeigt-unter-componentes.html)

mimi 4. Dez 2005 17:01


TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,
warum wird bei folgenden code Tmenuitem übersprungen:
Delphi-Quellcode:
 for i:=0 to ComponentCount-1 do begin
      c:=Components[i];
      if (c is TControl) or (c is TMenuItem) then begin
ich möchte gerne alle komponenten durchlaufen die bestimmte eigenschaften aufweisen und Tmenuitem zählt dazu.... es gehörht zu TMainmenu *G*

mirage228 4. Dez 2005 17:04

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hi,

vielleicht befindet es sich ja im Delphi-Referenz durchsuchenControls array-property des Forms... Schau mal nach.
Ansonsten musst Du bei einem TMainMenu (falls Du ein solches bei Controls[] kriegst) dieses manuell absuchen.
Was willst Du denn genau machen?

mfG
mirage228

mimi 10. Dez 2005 18:44

Re: TMenuItem wird nicht angezeigt unter componentes?
 
ich brauche es für eine farbänderung:
d.h. der user soll das ausehen der Komponenten verändern können(aber nur Schriftfarbe und TFont) und das klappt auch schon ganz gut bei allen andren komponenten nur die TMenuItems spielen da nicht mit.

ich wollte die möglichkeiten anbieten mein Programm in mehren sprachen zu benuzten mit Sprachdateien....

Lannes 10. Dez 2005 19:08

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,

ab TmainMenu (in Components enthalten) musst Du mit .Items weitersuchen.
Der folgende Code durchläuft rekursiv alle Items incl. Subitems
und baut sie In ein treeView ein.
Ich glaube das der Code ganz gut an Deine Anforderungen angepasst werden kann.
Delphi-Quellcode:
procedure XForm.GetMenuItems(aMenuItem: TMenuItem;aNode2: TTreeNode);
var z    : Integer;
    aItem : TMenuItem;
    aNode : TTreeNode;
    s    : string;
begin
  for z := 0 to aMenuItem.Count-1 do
    begin
    aItem := aMenuItem.Items[z];
    aNode := ANode2;
    s := aItem.Name;
    aNode := TVFormTree.items.Addchild(aNode,s);
    if aItem.Count > 0 then
      GetMenuItems(aItem,aNode);//rekursiv
    end;//Ende for z
end;

mimi 10. Dez 2005 19:20

Re: TMenuItem wird nicht angezeigt unter componentes?
 
@Lannes
das währe auch eine idee. Vielen dank.

Wenn ich dein code richtig verstehe durchläuft er das menu und speichert es in eine TTreeView, richtig ?

Zitat:

Ich glaube das der Code ganz gut an Deine Anforderungen angepasst werden kann.
ich wüste jetzt nicht genau wie :(

xaromz 10. Dez 2005 19:24

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,

geh doch einfach rekursiv alle Komponenten Deiner Form durch:
Delphi-Quellcode:
procedure TForm1.AlleKomponentendurchlaufen;

  procedure Walk(aComponent: TComponent);
  var
    C: Integer;
  begin
    if (aComponent is TControl) or (aComponent is TMenuItem) then
    begin
      // hier Dein Code
    end;
    for C := 0 to aComponent.ComponentCount - 1 do
      Walk(aComponent.Components[C]);
  end;

begin
  Walk(Self);
end;
Gruß
xaromz

Lannes 10. Dez 2005 22:04

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,
@xaromz:
die Menü-Items sind nicht in Components enthalten, ich wiederhol mich mal :?
Zitat:

Zitat von Lannes
...ab TmainMenu (in Components enthalten) musst Du mit .Items weitersuchen.

@mimi:

hab es mal etwas umgebaut, jede caption wird jetzt um '...' erweitert:
Delphi-Quellcode:
procedure SetMenuItemsPPP(aMenuItem: TMenuItem);
var z    : Integer;
    aItem : TMenuItem;
begin
  for z := 0 to aMenuItem.Count-1 do
    begin
    aItem := aMenuItem.Items[z];
    aItem.Caption := aItem.Caption+' ...';
    if aItem.Count > 0 then
      SetMenuItemsPPP(aItem);//rekursiv
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,z : Integer;
    c : TComponent;
begin
  for i:=0 to ComponentCount-1 do
    begin
    c:=Components[i];
    if c.ClassParent = TMenu then //alle PopUp- und MainMenüs
    //if c is TMainMenu then
    //if c is TPopUpMenu then
      for z := 0 to TMenu(c).Items.Count-1 do
        begin
        TMenu(c).Items[z].Caption := TMenu(c).Items[z].Caption+' ...';
        SetMenuItemsPPP(TMenu(c).Items[z]);
        end;
    end;
end;

xaromz 10. Dez 2005 22:09

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,
Zitat:

Zitat von Lannes
Hallo,
@xaromz:
die Menü-Items sind nicht in Components enthalten, ich wiederhol mich mal :?
Zitat:

Zitat von Lannes
...ab TmainMenu (in Components enthalten) musst Du mit .Items weitersuchen.


Schöne Vermutung, nur warum funktioniert mein Code dann? :gruebel:

Gruß
xaromz

Lannes 11. Dez 2005 00:08

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,

sorry, hast recht, ist doch enthalten :duck:
Mein Code ist schon etwas älter,
glaube wegen fehlendem Parent habe ich mich damals auf das Auslesen der Items verlegt. :?
Aber ist doch schön, das mehrere Wege zum Ziel führen. :wink:

mimi 11. Dez 2005 07:54

Re: TMenuItem wird nicht angezeigt unter componentes?
 
@xaromz
genau das habe ich schon versucht:
Delphi-Quellcode:
if (aComponent is TControl) or (aComponent is TMenuItem) then begin
aber leider ohne erfolg.

@Lannes
das mit
Delphi-Quellcode:
if c.ClassParent
kann ich mal versuchen vielen dank.

aber ich verstehe nicht warum das TMenuitem nicht bei einem normalen komponenten durchlauf gefunden wird . Weil TMenuItem ist doch auch von TControl oder etwa nicht ???

mimi 11. Dez 2005 08:52

Re: TMenuItem wird nicht angezeigt unter componentes?
 
jetzt habe ich doch deinen code verwendet: Lannes
aber leider rufe ich ihn anscheid falsch auf:
Delphi-Quellcode:
procedure TForm1.GetMenuItems(aMenuItem: TMenuItem;aNode2: TTreeNode;TreeView:TTReeView);
var z    : Integer;
    aItem : TMenuItem;
    aNode : TTreeNode;
    s    : string;
begin
  for z := 0 to aMenuItem.Count-1 do
    begin
    aItem := aMenuItem.Items[z];
    aNode := ANode2;
    s := aItem.Name;
    aNode := TreeView.items.Addchild(aNode,s);
    if aItem.Count > 0 then
      GetMenuItems(aItem,aNode,TreeView);//rekursiv
    end;//Ende for z
end;

procedure TForm1.BearbeitenClick(Sender: TObject);
begin
  Form5.TreeView1.Items.Clear;
  GetMenuItems(Fovoriten1,nil,Form5.TreeView1);
  Form5.ShowModal;
end;
aber den code leicht geändert.....

Lannes 11. Dez 2005 10:22

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,

welche Fehlermeldung liegt vor,
oder was läuft nicht?
Eventuell > "Undefinierter Bezeichner: 'Fovoriten1'" ?
Kann es sein,
das dass Problem da begraben ist : 'Favoriten1' ungleich 'Fovoriten1' ?

mimi 11. Dez 2005 11:09

Re: TMenuItem wird nicht angezeigt unter componentes?
 
nein kein fehlermeldung das menu wird in der TreeView falsch angezeigt:
dort stetht bearbeiten programm alles punkte die im menu vorkommen aber ich möchte ja nur das Favoriten menu auslesen und nicht die ganzen menus !

Lannes 11. Dez 2005 11:56

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Hallo,

kann eigentlich nicht sein,
das wenn Favoriten als Variable beim Aufruf genutzt wird,
die anderen Items mit in das TreeView eingebaut werden.
Was passiert wenn z.B. Bearbeiten abgefragt wird?

mimi 11. Dez 2005 12:13

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Das Problem ist das bearbeiten und Updaten Untermenupunkte von Favoriten menu sind und es werden in der TreeView angezeigt:
Bearbeiten(1 Eintrag)
Updaten(2 Eintrag)
und der Trennstrich(-)
aber erst ab den Trennstrich geht es los....
Edit:
ich rufe die funktion so auf:
Delphi-Quellcode:
  GetMenuItems(Style_favoriten,form5.TreeView1.Items.GetFirstNode,Form5.TreeView1);
habe den namen des menus geändert *G* geht aber immer noch nicht !

mimi 11. Dez 2005 12:17

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Lösung gefunden
du hattes einen kleinen fehler bei dir eingebaut:
Delphi-Quellcode:
s := aItem.Caption;
bei dir statt da .name und nicht .caption
jetzt wird es richtig angezeigt allerding mit 3 punkten die nicht angezeigt werden soll und das änder ich per tag glaube ich!

mimi 11. Dez 2005 12:19

Re: TMenuItem wird nicht angezeigt unter componentes?
 
Delphi-Quellcode:
procedure TForm1.GetMenuItems(aMenuItem: TMenuItem;aNode2: TTreeNode;TreeView:TTReeView);
var z    : Integer;
    aItem : TMenuItem;
    aNode : TTreeNode;
    s    : string;
begin
  for z := 0 to aMenuItem.Count-1 do begin
    if aMenuItem.Items[z].Tag <> -2 then begin
      aItem := aMenuItem.Items[z];
      aNode := ANode2;
      s := aItem.Caption;
      aNode := TreeView.items.Addchild(aNode,s);
      if aItem.Count > 0 then
        GetMenuItems(aItem,aNode,TreeView);//rekursiv
    end;//Ende for z
  end;
end;
so sieht der code jetzt aus und er funktioniert so. alle einträge die nicht angezeigt werden sollen, müssen mit -2 gekennzeichnet werden. dann klappt es wunderbar.
Vielen dank für deine hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz