Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eigenschaften auf "Vorhandensein" prüfen? (https://www.delphipraxis.net/127576-eigenschaften-auf-vorhandensein-pruefen.html)

moelski 15. Jan 2009 17:29


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:
Button_DrawAll.Enabled := Serie in [TFastLine]
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 ...

Gibt es da nicht so einen Weg:
Delphi-Quellcode:
Button_DrawAll.Enabled := Serie(Property).available
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 ?

mjustin 15. Jan 2009 17:34

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Zitat:

Zitat von moelski
Gibt es da nicht so einen Weg:
Delphi-Quellcode:
Button_DrawAll.Enabled := Serie(Property).available
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 ?

Ja, hier wird das Prinzip beschrieben:

Run-Time Type Information In Delphi - Can It Do Anything For You?
http://www.blong.com/Conferences/Bor...CommonAncestor

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;

moelski 15. Jan 2009 18:03

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Moin !

Jung ik zieh mein Hut :-D :thumb:

Das geht ja noch einfacher als gedacht:
Delphi-Quellcode:
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;
Mit zwei zeilen Code kann man das abhandeln. Hab jetzt schon mit 4-5 Properties getestet und geht wunderbar!
Das spart mir mal wieder ganz ganz viel Zeit.

Drum sag ich DANKE :witch:

fkerber 15. Jan 2009 18:49

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

moelski 15. Jan 2009 18:51

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Moin !

Jo haste Recht. Is erledigt.

Hawkeye219 15. Jan 2009 18:55

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

moelski 15. Jan 2009 19:01

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');

moelski 15. Jan 2009 19:53

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Moin !

Nu is da doch noch ein Problem ...

Folgender Code klappt:
Delphi-Quellcode:
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');
Wenn die Serie die Eigenschaft DrawAllPoints hat dann wird der Button enabled.

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?

moelski 15. Jan 2009 20:04

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Also so gehts leider ned ...

Delphi-Quellcode:
  if IsPublishedProp(Serie, 'DrawAllPoints') then
    DrawAll1.Checked := TComponent(Serie).DrawAllPoints;
Auch so ned
Delphi-Quellcode:
  if IsPublishedProp(Serie, 'DrawAllPoints') then
    DrawAll1.Checked := TChartSeries(Serie).DrawAllPoints;
:gruebel:

jfheins 15. Jan 2009 20:06

Re: Eigenschaften auf "Vorhandensein" prüfen?
 
Ich meine da gibts sowas wie GetPropValue oder so :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 1 von 2  1 2      

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