![]() |
Delphi-Version: 5
TMenuItem.Tag
Moin,
ich durchlaufe alle Einträge eines Menüs und möchte je nach Tag (0,1,2) darauf reagieren. Das klappt allerdings nicht, obwohl mir Falsch angezeigt wird, so dass ich nun auf einen Namensvergleich gehe, der funktioniert. Jemand eine Idee?
Delphi-Quellcode:
for itm in MainMenu1.Items do
begin itm.Enabled := not (itm.Tag = NativeInt(0)); // Keine Ahnung warum das nicht funktioniert // if itm.Tag = NativeInt(1) then; if not ((itm.Name = 'xxx') or (itm.Name = 'yyy')) then begin ShowMessage(itm.Name + ' ' + IntToStr(itm.Tag) + ' ' + BoolToStr((itm.Tag = NativeInt(1)))); for i := 0 to itm.Count -1 do begin if itm.Items[i].Tag = NativeInt(0) then begin itm.Items[i].Enabled := False; end else begin itm.Items[i].Enabled := True; end; end; end; end; |
AW: TMenuItem.Tag
Was heißt denn "klappt nicht"? Ich hab mir auf die Schnelle ein Formular mit drei MainMenu-Einträgen mit Tags 0 bis 2 zusammengeklickt und kriege dann mit deinem Code (ohne die ganzen NativeInt-Casts) genau eine MessageBox angezeigt.
|
AW: TMenuItem.Tag
Ich bekomme leider alle Items angezeigt, obwohl itm.Tag = NativeInt(1) false ergibt. Und das verstehe ich nicht, selbst mit STRG+F7 itm.Tag = NativeInt(1) kommt ein false, aber der Menueintrag wird totzdem verarbeitet, was bei 2, aber nicht passieren soll.
|
AW: TMenuItem.Tag
Ich weis zwar nicht genau mit welcher Version du arbeitest.
im Profile heißt es Delphi 12 Athens, im Text Delphi 5. Delphi 5 kennt kein NativeInt. tag = 1 sollte genügen. |
AW: TMenuItem.Tag
D12 ist richtig, weder mit NativeInt noch Int (weil Win32-Anwendung) werden meine Einträge übersprungen...lassen wir es beim Orakel, ich hab ja eine Lösung.
|
AW: TMenuItem.Tag
Zitat:
Delphi-Quellcode:
if itm.Tag = NativeInt(1) then; // Das ; beendet den (leeren) Befehl. Wenn Tag = 1 ist, wird nichts ausgeführt, ansonsten auch nichts
begin // Das hier wird in jedem Fall ausgeführt ShowMessage ... end; |
AW: TMenuItem.Tag
Ich denke, Du vertust Dich mit dem "richtigen" Zugriff auf die Menuitems
Hier ein Formular mit einem simplen Menu
Delphi-Quellcode:
Und hier der Code mit einem Button, der alle Menüenträge des ersten "Hauptmenüeintrages" durchiteriert und dann asublendet, wenn das Tag 1 asl Wert hat.
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 441 ClientWidth = 624 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -12 Font.Name = 'Segoe UI' Font.Style = [] Menu = Mainmenu1 TextHeight = 15 object Button1: TButton Left = 48 Top = 48 Width = 241 Height = 25 Caption = 'EnabledDiableButton' TabOrder = 0 OnClick = Button1Click end object Mainmenu1: TMainMenu Left = 304 Top = 224 object Enabled11: TMenuItem Caption = 'Enabled/Disabled' object Enables21: TMenuItem Caption = 'Enabled' end object Enabled1: TMenuItem Caption = 'Enabled' end object Disabled1: TMenuItem Tag = 1 Caption = 'Disabled' end end end end
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus; type TForm1 = class(TForm) Mainmenu1: TMainMenu; Enabled11: TMenuItem; Enables21: TMenuItem; Enabled1: TMenuItem; Disabled1: TMenuItem; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i : Integer; begin for i := 0 to MainMenu1.items[0].Count -1 do begin MainMenu1.Items[0][i].Visible := (Mainmenu1.Items[0][i].Tag = 0); end; end; end. |
AW: TMenuItem.Tag
Zitat:
|
AW: TMenuItem.Tag
@bcvs Das war es, Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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