![]() |
Eigenschaften auf "Vorhandensein" prüfen?
Liste der Anhänge anzeigen (Anzahl: 1)
Moin !
Wir nutzen in unserer Anwendung TChart und dort gibt es mehrere Serientypen. Nun haben aber nicht alle Serientypen die gleichen Einstellungen. Wir nutzen weiterhin die ChartListBox von TChart um die in einem Chart befindlichen Serien anzuzeigen. Das Teil schaut so (das in der Mitte): siehe Anhang Dort haben wir ein Popupmenü hinterlegt welches dann bestimmte Einstellungen für die Serie bereit hält wie z.B. Farbe, Strichstärke, Grid an / aus, etc. Bis jetzt haben wir nur einen Serientypen verwendet. Da war es einfach weil man das Menü genau auf diese Serie zuschneidern konnte. Nun wollen wir aber alle Serientypen verfügbar machen. Nun wäre es etwas müßig immer über eine Routine zu schauen welche Eigenschaften unserer Popup bietet und was man davon auf eine Serie anwenden kann. Geht das irgendwie automatisch? Bsp: Nehmen wir mal die Serientypen FastLine und und Area. Der Typ FastLine bietet eine Einstellung "Draw All" welche der Serientyp Area nicht bietet. Gibt es nun eine Möglichkeit den Menüeintrag automatisch zu disablen wenn diese Eigenschaft nicht verfügbar ist? Es ginge sicherlich über eine Typenprüfung. Also irgendwie so ...
Delphi-Quellcode:
Aber das würde einen enormen Aufwand bedeuten weil man ja überall erstmal nachsehen müsste was geht und nicht. Bei den 70 Serientypen von TChart ist das müssig ...
Button_DrawAll.Enabled := Serie in [TFastLine]
Gibt es da nicht so einen Weg:
Delphi-Quellcode:
Ok so geht das ganz sicher nicht, aber ich wollte es nur mal deutlich machen was ich meine. Also quasi eine Zeile Code die selber prüft ob der Serientyp eine Eigenschaft hat oder nicht. Geht das ?
Button_DrawAll.Enabled := Serie(Property).available
|
Re: Eigenschaften auf "Vorhandensein" prüfen?
Zitat:
Run-Time Type Information In Delphi - Can It Do Anything For You? ![]() Das Beispiel auf dieser Seite sucht nach Enabled Properties
Delphi-Quellcode:
procedure DisableThem(Comps: array of TComponent);
var Loop: Integer; PropInfo: PPropInfo; begin for Loop := Low(Comps) to High(Comps) do begin { Get info record for Enabled property } PropInfo := GetPropInfo(Comps[Loop].ClassInfo, 'Enabled'); { If property exists, set value to False } if Assigned(PropInfo) then SetOrdProp(Comps[Loop], PropInfo, Longint(False)); end; end; |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Moin !
Jung ik zieh mein Hut :-D :thumb: Das geht ja noch einfacher als gedacht:
Delphi-Quellcode:
Mit zwei zeilen Code kann man das abhandeln. Hab jetzt schon mit 4-5 Properties getestet und geht wunderbar!
procedure TLVMainForm.PopupSeriesPopup(Sender: TObject);
Var Serie : TChartSeries; PropInfo : PPropInfo; begin Serie := ChartListBox1.SelectedSeries; if (Serie = NIL) Then Exit; // Serie.GetVertAxis.Maximum -> Serie.GetVertAxis.ClassInfo { Get info record for Enabled property } PropInfo := GetPropInfo(Serie.ClassInfo, 'DrawAllPoints'); { If property exists, set value to False } // if Assigned(PropInfo) then // DrawAll1.Caption := 'Text : ' + FloatToStr(Serie.GetVertAxis.Maximum); DrawAll1.Enabled := Assigned(PropInfo); end; Das spart mir mal wieder ganz ganz viel Zeit. Drum sag ich DANKE :witch: |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Hi!
Könntest du das Bild bitte noch in den Anhang packen? Dann bleibt es uns auch erhalten, wenn der externe Server mal down ist und die Ladezeit des Threads verkürzt sich bestimmt auch... Danke! Ciao, Frederic |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Moin !
Jo haste Recht. Is erledigt. |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Hallo Dominik,
die (überladene) Funktion IsPublishedProp aus der Unit TypInfo macht den Code noch ein wenig lesbarer. Gruß Hawkeye |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Moin Hawkeye,
na nu bin ich abba platt. Da hab ich ja wirklich meinen Einzeiler. :cheer:
Delphi-Quellcode:
DrawAll1.Enabled := IsPublishedProp(Serie, 'DrawAllPoints');
|
Re: Eigenschaften auf "Vorhandensein" prüfen?
Moin !
Nu is da doch noch ein Problem ... Folgender Code klappt:
Delphi-Quellcode:
Wenn die Serie die Eigenschaft DrawAllPoints hat dann wird der Button enabled.
procedure TLVMainForm.PopupSeriesPopup(Sender: TObject);
Var Serie : TChartSeries; PropInfo : PPropInfo; begin // RTTI Funktion // -> [url]http://www.blong.com/Conferences/BorConUK98/DelphiRTTI/CB140.htm[/url] Serie := ChartListBox1.SelectedSeries; if (Serie = NIL) Then Exit; // Serie.GetVertAxis.Maximum -> Serie.GetVertAxis.ClassInfo DrawAll1.Enabled := IsPublishedProp(Serie, 'DrawAllPoints'); Aber wie kann ich nun drauf zugreifen. Ich will ja auch den aktuellen Status ermitteln. Also DrawAll1.Checked = Series.DrawAllPoints. Nun hat aber TChartSeries keine Propertie DrawAllPoints. Das tätte nur TFastLineSeries. Ich müsste also Typecasten. Aber dann hab ich wieder das Problem wie vorher das ich mich um alles und jeden kümmern muss. Gibts für dieses Problem auch eine Lösung? |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Also so gehts leider ned ...
Delphi-Quellcode:
Auch so ned
if IsPublishedProp(Serie, 'DrawAllPoints') then
DrawAll1.Checked := TComponent(Serie).DrawAllPoints;
Delphi-Quellcode:
:gruebel:
if IsPublishedProp(Serie, 'DrawAllPoints') then
DrawAll1.Checked := TChartSeries(Serie).DrawAllPoints; |
Re: Eigenschaften auf "Vorhandensein" prüfen?
Ich meine da gibts sowas wie GetPropValue oder so :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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