![]() |
TMenuItem = TopItem?
Hi,
ich probiere uns suche schon seit einer Weile. Ich versuche irgendwie herauszufinden, ob ein TMenuItem auf "Level 0" ist, also eigentlich kein ParentItem besitzt. die Hilfe sagt dazu: Zitat:
- also parent ist schonmal nie nil. es wird immer ein gültiges Item zurückgegeben... - TMenuItem kann ich schlecht mit Items vergleichen, da Items ein Array-Property ist. - auf Items[0] kann ich nicht zugreifen, wenn keine Items definiert sind (Listenindex außerhalb ...), würde auch keinen Sinn machen... also hab ich mal probiert, das parent mit dem Item selbst zu vergleichen, wird zwar compiliert, aber das ist es auch nicht. was mir aufgefallen ist, dass Name und caption des Parents in dem Fall immer leer ist, also hab ich als temporären Workaround einen Vergleich darauf gemacht, nur schön ist das nicht wirklich. kann mir jemand sagen, wie ich das besser prüfen kann? Gruß Frank |
Re: TMenuItem = TopItem?
Wenn der Parent des MenuItem nil ist, dann bist du am Anfang der Liste, dh. auf dem Eintrag der als übergeordnetes Item aller anderen TMenuItem fungiert.
Kleines Beispiel mit einem TPopup für einem Button (zufügen zweier Menu Templates im Popup vorrausgesetzt)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
procedure SetMenuEvent(MenuItem:TMenuItem); var nLoop : integer; begin for nLoop := 0 to MenuItem.Count-1 do begin if (MenuItem.Items[nLoop].Count=0) then MenuItem.Items[nLoop].OnClick := Rckgngig1Click else SetMenuEvent(MenuItem.Items[nLoop]); end; end; begin SetMenuEvent(PopupMenu1.Items); end; procedure TForm1.Rckgngig1Click(Sender: TObject); procedure ShowParent(MenuItem:TMenuItem); begin Memo1.Lines.Add(MenuItem.Caption); if MenuItem.HasParent and Assigned(MenuItem.Parent) then ShowParent(MenuItem.Parent) else ShowMessage('Am Ende angelangt'); end; begin if (Sender is TMenuItem) then begin with (Sender as TMenuItem) do ShowParent(Sender as TMenuItem); end; end; |
Re: TMenuItem = TopItem?
hallo,
hab doch geschrieben, dass das parent nicht nil ist, sondern ein gültiges Item zurückgibt. hab leider auch keine Eigenschaft "HasParent" Gruß Frank |
Re: TMenuItem = TopItem?
Im Falle das es sich um ein TMainMenu handelt mußt du abfragen ob der Parent TMainMenu ist. Dann hast du du ein TopLevel-Item.
Wenn du die VCL-Sourcen hast, gug am einfachsten mal in die menus.pas und such dort nach TopLevel. Wenn ich das richtig im Kop hab. :) |
Re: TMenuItem = TopItem?
Hallo,
Delphi-Quellcode:
geht leider nicht. die bedingung ist nie erfüllt trotz vorhandenem TMainMenu
if TComponent((c as TMenuItem).parent) is TMenu then
die Auszüge aus der Menus.pas:
Delphi-Quellcode:
somit fällt HasParent schonmal flach ;(, auch mittels "vcl-Hack".
protected
function GetParentComponent: TComponent; override; function HasParent: Boolean; override; procedure SetParentComponent(Value: TComponent); override; public property Parent: TMenuItem read FParent; function TMenuItem.HasParent: Boolean; begin Result := True; end; function TMenuItem.GetParentComponent: TComponent; begin if (FParent <> nil) and (FParent.FMenu <> nil) then Result := FParent.FMenu else Result := FParent; end; procedure TMenuItem.SetParentComponent(Value: TComponent); begin if FParent <> nil then FParent.Remove(Self); if Value <> nil then if Value is TMenu then TMenu(Value).Items.Add(Self) else if Value is TMenuItem then TMenuItem(Value).Add(Self); end; ich habe auch kaum stellen gefunden (nur insert,delete und destructor), wo FParent gesetzt wird, weder im Constructor noch gibt es ein SetParent... ein weiterer versuch (zeigt immer "Ja")
Delphi-Quellcode:
//edit:
if getParent((sender as TMenuItem).handle)=0 then
showmessage('Ja'); die Suche in menus.pas nach "Top" findet keine passenden Stellen Gruß Frank |
Re: TMenuItem = TopItem?
Hallo Frank,
versuche es mal so:
Delphi-Quellcode:
Freundliche Grüße
function IsMainItem(menu: TMenu; item: TMenuItem): Boolean;
begin Result := item.Parent = menu.Items; end; procedure TDemoForm.TestButtonClick(Sender: TObject); begin ShowMessage(BoolToStr(IsMainItem(MainMenu, FileMenu), True)); end; |
Re: TMenuItem = TopItem?
danke marabu,
dafür muss ich zwar eine TMenu-Instanz übergeben...aber da ich nur 1 MainMenu habe ist das ok ;) Gruß Frank |
Re: TMenuItem = TopItem?
fitem ist vom Typ TMenuitem
parent vom Typ TComponent dann einfach
Delphi-Quellcode:
Eine Abfrage auf TMenu kann nicht funktionieren, da das die Basisklasse sowohl für TMainMenu als auch für TPopupMenu ist.
toplevel := fitem.getparentcomponent is TMainMenu;
Da Codegear das genauso macht, kannst davon ausgehen das das auch so funktioniert (bei mir tuts das auch :)) |
Re: TMenuItem = TopItem?
danke, funktioniert super und ist für meinen Zwecke völlig ausreichend (löschen von tab+nachfolgende Zeichen bei den MainMenu-Top-Items).
hab mir das nur noch in ne funktion gebaut ;)
Delphi-Quellcode:
******** Thread closed ********
function IsMainTopItem(item: TMenuItem): Boolean;
begin result:= TComponent(item).getparentcomponent is TMainMenu; end; Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 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-2025 by Thomas Breitkreuz