![]() |
Compiler erkennt TControl.PopupMenu nicht
Hallo,
folgender Code wird nicht compiliert, weil der Compiler PopupMenu moniert (existiert nicht).
Delphi-Quellcode:
Nehme ich statt dessen Control:= TControl(Component)
procedure TForm_Base.SetExportPopMenu;
var iComponent : Integer; Component : TComponent; Control : TControl; begin for iComponent:= 0 to ComponentCount-1 do begin Component:= Components[iComponent]; if (Component is TListView) or (Component is TVirtualStringTree) then begin Control:= TControl(Component); if Control.PopupMenu=NIL then // hier meckert er begin PopupMenu:= TPopupMenu.Create(ListView); Control.PopupMenu:= PopupMenu; end;
Delphi-Quellcode:
klappt es.
with Component as TControl do
begin if PopupMenu=NIL then begin MyPopupMenu:= TPopupMenu.Create(Control); PopupMenu:= MyPopupMenu; end; end; Ich hätte aber gern die 1. Code. Ich mage dieses RTTI hier nicht so. Es handelt sich um das Original TControl (unit Controls). Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Es gibt doch auch noch ControlCount, wenn ich nicht irre (hab gerade kein Delphi zur Hand).
Delphi-Quellcode:
Wie angedeutet nur heruntergetippt.
procedure TForm_Base.SetExportPopMenu;
var iComponent : Integer; Control : TControl; begin for iComponent:= 0 to ControlCount-1 do begin Control:= Controls[iComponent]; if ((Control is TListView) or (Control is TVirtualStringTree)) and not Assigned(Control.PopupMenu) then begin PopupMenu:= TPopupMenu.Create(ListView); Control.PopupMenu:= PopupMenu; end; end; end; |
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo,
Controls: wieder was dazugelernt ;) gleiche Fehlermeldung: Assigned(Control.PopupMenu) undefinierter Bezeichner PopupMenu *ratlos* Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Da wird TControl.PopupMenu wohl protected sein :wink:
|
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo Heiko,
deine zweiter Code im Beitrag #1 funktioniert nicht wirklich, es scheint nur so. Du setzt damit lediglich das Popup-Menü des Formulars und lieferst gleichzeitig ein schönes Beispiel für die Tücken der WITH-Anweisung. Gruß Hawkeye |
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo,
das habe ich auch schon gemerkt. Wie muss es denn richtig heissen ? Ich dreh hier noch durch. So eine Zeitverschwendung für das bischen Scheiss !! (Tschuldigung) Warum findet der PopupMenu nicht ??? Wie soll ich dass denn sonst für einen ListView zur Laufzeit setzen ???? #Update:# Nicht zu fassen, ist doch tatsächlich protected. Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Wenn du das PopupMenu nur für 2 bestimmte Komponententypen setzen willst dann wäre es doch auch nicht zuviel Aufwand, beide Fälle seperat zu behandeln, oder? Also erst auf TListView prüfen, im Erfolgsfall dann explizit nach TListView casten und Menü zuweisen. Dasselbe dann für TVirtualStringTree.
|
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo,
der Code wird sich noch ändern. Ich muss halt leider doch immer auf die jeweilige Komponente casten. Erledigt. #closed# Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Zitat:
Zitat:
Code:
Das ist glücklicherweise ein Standardproblem mit einer Standardlösung:
[Pascal Fehler] Unit1.pas(91): E2362 Auf protected-Symbol TControl.PopupMenu kann nicht zugegriffen werden
Delphi-Quellcode:
Uli.
type
THACK_Control = class(TControl); if THACK_Control(Control).PopupMenu = nil then THACK_Control(Control).PopupMenu := TPopupMenu.Create(Control); |
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo,
ja dein Compiler sagt das, meiner noch nicht (D6) ;) Wie soll das mit dem THackControl denn laufen, wenn es auch von TControl abgeleitet ist ? Es sei denn, du machst das property PopupMenu noch public. Das gefällt mir aber gar nicht ... Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Naja wenn Du es inline in der Methode machst...
Delphi-Quellcode:
Alternativ könnte man doch die Eigenschaft über RTTI versuchen abzugreifen...
procedure WhatEver;
type TControlAccess = class(TControl) public property PopupMenu: ....; end; var Control: TControl; begin TControlAccess(Control).PopupMenu := ...; end; Viele Grüße |
Re: Compiler erkennt TControl.PopupMenu nicht
Zitat:
Zitat:
Delphi-Quellcode:
ist die komplette Typdefinition - keine Member, Property-Redeklarationen oder sonstwas.
type
THACK_Control = class(TControl); Jetzt hast du eine Klasse in der aktuellen Unit - und innerhalb einer Unit beschränkt protected den Zugriff nicht - im Gegensatz zu "strict protected". D.h das Member PopupMenu von THACK_Control ist in der aktuellen Unit de facto public. Und wegen der einfach gestrickten Definition von THACK_Control ist ein TControl auch (fast :mrgreen:) ein THACK_Control, also geht auch der Cast i.O. Zitat:
|
Re: Compiler erkennt TControl.PopupMenu nicht
Zitat:
Delphi-Quellcode:
oder
type
THACK_Control = class(TControl);
Delphi-Quellcode:
schreibst, macht null Unterschied.
type
THACK_Control = class(TControl) public property PopupMenu; end; Zitat:
|
Re: Compiler erkennt TControl.PopupMenu nicht
Ja an das mit den "class friends" innerhalb einer Unit habe ich nicht gedacht, da sind unsere Lösungen natürlich völlig equivalent. :)
Also ich würde wohl bei dem selben Vorhaben wohl auch nicht RTTI nehmen, wollte das aber auch nicht ungenannt lassen... ;) |
Re: Compiler erkennt TControl.PopupMenu nicht
Hallo,
friend class, stimmt ;) Netter Trick. Kenne mich mit Delphi nicht so aus ;) Heiko |
Re: Compiler erkennt TControl.PopupMenu nicht
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 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