AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMenuItem = TopItem?

Ein Thema von _frank_ · begonnen am 21. Jun 2007 · letzter Beitrag vom 21. Jun 2007
Antwort Antwort
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#1

TMenuItem = TopItem?

  Alt 21. Jun 2007, 14:47
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:
Wenn es sich bei dem Menüeintrag um einen Eintrag im Hauptmenü oder um einen übergeordneten Eintrag eines Popup-Menüs handelt, ist Parent mit den Wert der Eigenschaft Items des betreffenden Menüs identisch.
so ganz verstehe ich den Satz grade nicht.
- 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
  Mit Zitat antworten Zitat
Gremlin

Registriert seit: 18. Apr 2006
Ort: Im Süden
176 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 15:19
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;
Gruss Gremlin
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 15:32
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
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 15:49
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#5

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 16:20
Hallo,

if TComponent((c as TMenuItem).parent) is TMenu then geht leider nicht. die bedingung ist nie erfüllt trotz vorhandenem TMainMenu

die Auszüge aus der Menus.pas:

Delphi-Quellcode:
  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;
somit fällt HasParent schonmal flach ;(, auch mittels "vcl-Hack".
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:
  if getParent((sender as TMenuItem).handle)=0 then
    showmessage('Ja');
//edit:
die Suche in menus.pas nach "Top" findet keine passenden Stellen

Gruß Frank
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 16:58
Hallo Frank,

versuche es mal so:

Delphi-Quellcode:
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;
Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 17:08
danke marabu,

dafür muss ich zwar eine TMenu-Instanz übergeben...aber da ich nur 1 MainMenu habe ist das ok

Gruß Frank
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 19:26
fitem ist vom Typ TMenuitem

parent vom Typ TComponent


dann einfach

  toplevel := fitem.getparentcomponent is TMainMenu; Eine Abfrage auf TMenu kann nicht funktionieren, da das die Basisklasse sowohl für TMainMenu als auch für TPopupMenu ist.

Da Codegear das genauso macht, kannst davon ausgehen das das auch so funktioniert (bei mir tuts das auch )
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#9

Re: TMenuItem = TopItem?

  Alt 21. Jun 2007, 20:10
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:
function IsMainTopItem(item: TMenuItem): Boolean;
begin
  result:= TComponent(item).getparentcomponent is TMainMenu;
end;
******** Thread closed ********

Frank
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz