Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Warum funtioniert dieses abfrage nicht (https://www.delphipraxis.net/120127-warum-funtioniert-dieses-abfrage-nicht.html)

EWeiss 5. Sep 2008 19:55


Warum funtioniert dieses abfrage nicht
 
Warum will es nicht ?

Delphi-Quellcode:
type
  TSplashItems = (Background, LabelInfo);
  TSplashItemsTotal = array[TSplashItems] of Integer;

  for IntI := Low(TSplashItemsTotal) to High(TSplashItemsTotal) do
  TreeView.Items.AddChildObject(FNode,
                                TSplashItems(IntI),
                                pointer(StrToIntDef(TSplashItems(IntI),
                                0)));
Die Meldung!
[Pascal Error] SkinManager.pas(164): E2010 Incompatible types: 'Integer' and 'TSplashItems'
in dieser zeile
Code:
for IntI := Low(TSplashItemsTotal) to High(TSplashItemsTotal) do
TSplashItemsTotal ist aber als Integer deklariert

gruss Emil

Roachford 5. Sep 2008 20:10

Re: Warum funtioniert dieses abfrage nicht
 
Weil das Array Elemente des Typs TSplashItems als Index hat. Somit liefert dir Low() Background und High() LabelInfo und damit muss ergo deine Laufvariable auch den Typ TSplashItems haben.

Und noch ein Hinweis: Schonmal gefragt warum alle Enumerations bei CodeGear immer einen Präfix haben? Finde es heraus und definiere dir nach deinem Typ TSplashItems noch einen weiteren:

Delphi-Quellcode:
type
  TTestEnum = ( Whatever, Whatelse, Background );
Und dann schau dir mal den Ordinalwert von deinem Typ Background an oder greife mit eingeschalteter Bereichsprüfung auf dein Array Element Background zu...

EWeiss 5. Sep 2008 20:15

Re: Warum funtioniert dieses abfrage nicht
 
Habs selbst gelößt und umdefiniert.. ;)

Delphi-Quellcode:
var
  TSplashItems : array[0..1] of string = ('Background', 'LabelInfo');

        for IntI := Low(TSplashItems) to High(TSplashItems) do
        TreeView.Items.AddChildObject(FNode,
                                TSplashItems[IntI],
                                pointer(StrToIntDef(TSplashItems[IntI],
                                0)));
Ein Enum nutzt mir da gar nichts denn ich bracuhe die werte als string
das war der ganze sinn der sache.

trotzdem danke..

gruss Emil

Roachford 5. Sep 2008 20:23

Re: Warum funtioniert dieses abfrage nicht
 
Und nochmal für andere Suchende...

Delphi-Quellcode:
type
  TSplashType = ( stBackground, stLabelInfo );
var
  SplashItems: array[TSplashType] of string = ('Background', 'LabelInfo');

...
procedure TWhatever.AddIt;
var
  lCounter: TSplashType;
begin
  ...

  for lCounter := Low(SplashItems) to High(SplashItems) do
     TreeView.Items.AddChildObject(FNode,
                                   SplashItems[lCounter],
                                   pointer(Ord(lCounter)));
end;
@EWeiss: Das befreit dich nicht von dem Rat dringend über die Präfixe bei den Aufzählungen nachzudenken!

Und es ist recht schlechter Stil eine Variable mit einem T vorne zu versehen. Das birgt Verwechslungsgefahr mit Klassen und Typendeklarationen.

Und warum fügst du das Ergebnis von StrToIntDef() der Baumstruktur hinzu? Deine Strings sind alle nicht wandelbar, somit sollte der hinzugefügte Pointer immer NIL sein, bzw. der Integer 0.
Da dies recht sinnlos erscheint, habe ich in dem Beispiel einfach den Ordinalwert des Typs dort mit angehangen.

EWeiss 5. Sep 2008 20:30

Re: Warum funtioniert dieses abfrage nicht
 
Zitat:

Zitat von Roachford
Und nochmal für andere Suchende...

Delphi-Quellcode:
type
  TSplashType = ( stBackground, stLabelInfo );
var
  SplashItems: array[TSplashType] of string = ('Background', 'LabelInfo');

...
procedure TWhatever.AddIt;
var
  lCounter: TSplashType;
begin
  ...

  for lCounter := Low(SplashItems) to High(SplashItems) do
     TreeView.Items.AddChildObject(FNode,
                                   SplashItems[lCounter],
                                   pointer(Ord(lCounter)));
end;
@EWeiss: Das befreit dich nicht von dem Rat dringend über die Präfixe bei den Aufzählungen nachzudenken!

Und es ist recht schlechter Stil eine Variable mit einem T vorne zu versehen. Das birgt Verwechslungsgefahr mit Klassen und Typendeklarationen.

Und warum fügst du das Ergebnis von StrToIntDef() der Baumstruktur hinzu? Deine Strings sind alle nicht wandelbar, somit sollte der hinzugefügte Pointer immer NIL sein, bzw. der Integer 0.
Da dies recht sinnlos erscheint, habe ich in dem Beispiel einfach den Ordinalwert des Typs dort mit angehangen.

Danke für die Info!

In dem Fall hätte ich eine doppelte definition von SplashItems oder ?
Was macht oder soll die zusätzliche Type da bezwecken ?
Ich frage deshalb da meine variante genauso funktioniert

Mit der Namensgebung ok gebe ich dir recht ;)

gruss Emil

jfheins 5. Sep 2008 20:32

Re: Warum funtioniert dieses abfrage nicht
 
Nein, du hast keine doppelte Definitin. Der Typ wird einmal definiert (als enum) und es wqird eine globale Variable definiert, mit der du den enum in einen String wandeln kannst (könnte man auch in eine Funktion verpacken.)

Du kannst also mit dem enum schnell arbeiten und die Strings schön ausgeben (und ggf. später mal ändern oder lokalisieren) ;)

DP-Maintenance 5. Sep 2008 20:45

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.

EWeiss 5. Sep 2008 20:50

Re: Warum funtioniert dieses abfrage nicht
 
Zitat:

Zitat von jfheins
Nein, du hast keine doppelte Definitin. Der Typ wird einmal definiert (als enum) und es wqird eine globale Variable definiert, mit der du den enum in einen String wandeln kannst (könnte man auch in eine Funktion verpacken.)

Du kannst also mit dem enum schnell arbeiten und die Strings schön ausgeben (und ggf. später mal ändern oder lokalisieren) ;)

ahh habs verstanden danke schön..

gruss Emil


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