Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   wsNormal, wsMinimized, wsMaximized nicht gefunden ? (https://www.delphipraxis.net/204970-wsnormal-wsminimized-wsmaximized-nicht-gefunden.html)

bernhard_LA 18. Jul 2020 22:45

wsNormal, wsMinimized, wsMaximized nicht gefunden ?
 
VCL vs. FMX : ich habe eine Funktion die zwar den Datentyp TWindowState aus der unit System.UITypes kennt,
aber bei der Überprüfung eines Types
behauptet wsMaximized sei nicht definiert :-( , unter VCL kompiliert der Code ohne Probleme ......


Delphi-Quellcode:
function WindowState2String (value: TWindowState): String;
begin
  if value = wsNormal then
    Result := 'wsNormal';


Delphi-Quellcode:
[dcc64 Error] OLib.WIN.pas(1091): E2003 Undeclared identifier: 'wsMaximized'

Michael II 19. Jul 2020 08:48

AW: wsNormal, wsMinimized, wsMaximized nicht gefunden ?
 
Ist bei meinem 10.4 inkl. Patch1+2 auch so.
Wenn du echt - wie in deinem Beispiel - am WindowState als string interessiert bist... das hier funktioniert in FMX wie auch VCL:

Delphi-Quellcode:
uses System.TypInfo;

function statusstr( winstate : TWindowState ) : string;
begin
  Result := GetEnumName(typeinfo(TWindowState),ord(winstate));
end;

procedure TForm25.FormCreate(Sender: TObject);
begin
  label1.Text := statusstr( windowstate );
end;
( Es gibt sicher im Verlauf des Tages eine einfache Erklärung wieso der von dir erwähnte Fehler auftritt. )

bernau 19. Jul 2020 09:24

AW: wsNormal, wsMinimized, wsMaximized nicht gefunden ?
 
Kann es hier grade nicht ausprobieren. Aber ist es vielleicht als SCOPEDENUMS definiert?

Setz doch mal den Typ vorne an.



Delphi-Quellcode:
function WindowState2String (value: TWindowState): String;
begin
  if value = TWindowState.wsNormal then
    Result := 'wsNormal';

himitsu 19. Jul 2020 11:56

AW: wsNormal, wsMinimized, wsMaximized nicht gefunden ?
 
SCOPEDENUMS kann/muß man bei der Typ-Deklaration angeben. Nachträglich wird es nicht mehr geändert.
Aber ja, beim FMX wird das sehr oft benutzt und es wurde auch schon mehrmals geändert. (in der nächsten Delphi-Version)

PS: Ich finde es auch krank, wenn man Scope mit Prefix mischt, was im FMX oft vorkommt/vorkam,
und das hier ist einer der Fälle. :freak:


Ja, die RTTI ist für sowas einfach zu praktisch ... würde das auch empfehlen.


Da TWindowState beim Parameter gefunden wurde, könnte man denken die nötige Unit ist vorhanden,
aber es gibt einige Typen mit Weiterleitungen, z.B. wenn sie verschoben wurden, aber leider wird da oft nur der Typ weitergeleitet, aber bei Enums nicht die Werte, was echt schwachsinnig ist (ohne ScopedEnums), da man dann dennoch die andere Unit einbinden muß, womit die Weiterleitung des Typs fast nutzlos ist (außer man nutzt den Scope/Namespace).
Aber hier hat man es z.B. in der Vcl.Forms mal (fast) richtig gemacht, aber da es hier eben die vollständige Weiterleitung gibt (Grund sind alte VCL-Quellcodes wo es früher noch ohne Scope war), kann man über die Vcl.Forms das wsMaximized ohne Scope benutzen, während es über System.UITypes nur mit Scope zu nutzen ist.

Delphi-Quellcode:
// System.UITypes, war aber früher in der Forms.pas und SCOPEDENUMS war noch nicht erfunden

{$SCOPEDENUMS ON}

type
  TWindowState = (wsNormal, wsMinimized, wsMaximized);


// Vcl.Forms

const
  wsNormal    = System.UITypes.TWindowState.wsNormal;
  wsMinimized = System.UITypes.TWindowState.wsMinimized;
  wsMaximized = System.UITypes.TWindowState.wsMaximized;

type
  TWindowState = System.UITypes.TWindowState;

bernhard_LA 19. Jul 2020 21:27

AW: wsNormal, wsMinimized, wsMaximized nicht gefunden ?
 
Danke

der RTTI Ansatz als auch TWindowState.wsMaximized sind 2 funktionierende Lösungen , wieder alles gut :lol:


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