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 Problem beim finden dynamischer Menüeinträge (https://www.delphipraxis.net/32609-problem-beim-finden-dynamischer-menueeintraege.html)

MarcusB 26. Okt 2004 08:57


Problem beim finden dynamischer Menüeinträge
 
Hallo,

folgendes Problem:

Ich habe ein dynamisch erzeugtes PopUp-Menü, welches wie folgt erzeugt wurde (Auszug):

Delphi-Quellcode:
    ...
    MyMenuItem := TMenuItem.Create(Feldnamenzuordnen1);
    MyMenuItem.Caption := AdressFields[i];
    MyMenuItem.Tag := i;
    MyMenuItem.Name := 'Adress_' + IntToStr(i);
    MyMenuItem.OnClick := MyMenuItemClick;
    Feldnamenzuordnen1.Add(MyMenuItem);
    ...
wobei Feldnamenzuordnen1 ein übergeordneter Menüeintrag ist.

In einer Routine will ich überprüfen, ob bestimmte Untermenüpunkte schon mal angeklickt wurden, um dann die Eigenschaft checked entweder auf true oder false zu setzen.

Dazu wollte ich

Delphi-Quellcode:
Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)).checked := true;
verwenden. Das klappt leider nicht! :wall:

Komischerweise funktioniert folgendes aber:

Delphi-Quellcode:
ShowMessage(Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)).name);
Was mach ich schon wieder falsch :cry:

mirage228 26. Okt 2004 09:10

Re: Problem beim finden dynamischer Menüeinträge
 
Hi,

FindComponent liefert dir lediglich eine "TComponent" zurück. Für Deine Checked Eigenschaft brauchst Du also ein TMenuItem:

Delphi-Quellcode:
(Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)) as TMenuItem).checked := true
mfG
mirage228

roderich 26. Okt 2004 09:11

Re: Problem beim finden dynamischer Menüeinträge
 
dir fehlt ein Type-cast

Delphi-Quellcode:
  (Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)) as TMenuItem).checked := true;
generell wäre man aber vor dem Type-cast auf der sicheren Seite mit der Abfrage
Delphi-Quellcode:
  if (Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)) is TMenuItem) then
     ...

daß die 1. Anweisung nicht funktioniert, aber die 2. Anweisung mit ShowMessage funktioniert, liegt daran, daß eine Komponente eine Property "name" besitzt, aber keine Property "Checked".

Roderich

mirage228 26. Okt 2004 09:17

Re: Problem beim finden dynamischer Menüeinträge
 
Zitat:

Zitat von roderich
dir fehlt ein Type-cast

Delphi-Quellcode:
  (Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)) as TMenuItem).checked := true;
generell wäre man aber vor dem Type-cast auf der sicheren Seite mit der Abfrage
Delphi-Quellcode:
  if (Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i)) is TMenuItem) then
     ...

Jupp,

aber der AS-Operator führt intern bereits ein IS aus (und löst ggf. ein EInvalidCast aus), soweit ich weiss.
Daher sollte man. wenn man schon mit IS prüft, dann auch direkt type-casten, also so (ich würde mir dann das doppelte findcomponent sparen):
Delphi-Quellcode:
var
  Comp: TComponent;
begin
  Comp := Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i));
  if (Comp is TMenuItem) then
    TMenuItem(Comp).Checked := True;
end;
mfG
mirage228

MarcusB 26. Okt 2004 09:43

Re: Problem beim finden dynamischer Menüeinträge
 
Ich liebe Euch alle :love:

Es funktioniert :)

jim_raynor 26. Okt 2004 10:08

Re: Problem beim finden dynamischer Menüeinträge
 
Zitat:

Zitat von mirage228
Jupp,

aber der AS-Operator führt intern bereits ein IS aus (und löst ggf. ein EInvalidCast aus), soweit ich weiss.
Daher sollte man. wenn man schon mit IS prüft, dann auch direkt type-casten, also so (ich würde mir dann das doppelte findcomponent sparen):
Delphi-Quellcode:
var
  Comp: TComponent;
begin
  Comp := Feldnamenzuordnen1.FindComponent('Adress_' + IntToStr(i));
  if (Comp is TMenuItem) then
    TMenuItem(Comp).Checked := True;
end;
mfG
mirage228

Jupp. Ich bestätige es einfach mal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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