Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   was ist falsch an MessageDlg (https://www.delphipraxis.net/205386-ist-falsch-messagedlg.html)

Nikodel 3. Sep 2020 16:26

was ist falsch an MessageDlg
 
hi,
ich stehe vor einem Rätsel:
In folgendem Programm erhalte ich Fehlermeldungen:
Code:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.IOUtils, System.Variants, FMX.Types, FMX.Controls, FMX.Forms,
  FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.ListBox, FMX.Layouts;

type
  TForm1 = class(TForm)
    Butt_start: TButton;
    Butt_newName: TButton;
    Butt_deleteName: TButton;
    NameList: TListBox;
    ListBoxGroupHeader_active: TListBoxGroupHeader;
    ListBoxGroupHeader_inactive: TListBoxGroupHeader;
    Edit1: TEdit;
    Butt_change_aktiv: TButton;
    procedure Butt_down(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Butt_up(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
      X, Y: Single);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  buttPress: boolean;
  hP: array[0..10] of integer;
  nact: integer;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
var
  F: Text;
  dstr: string;
  i, ii: integer;
begin
  dstr := TPath.GetDirectoryName(ParamStr(0));
  try
    AssignFile(F, dstr + '\NameList.txt');
    Reset(F);
    ReadLn(F, nact); { Read the first line of the file }
    for i := 1 to nact do
    begin // aktive Namen einlesen und auflisten
      ReadLn(F, dstr); { Read Names }
      NameList.Items.Insert(i, dstr); { insert Name }
      ii := i;
    end;
    while not Eof(F) do
    begin // inaktive Namen einlesen und auflisten
      ReadLn(F, dstr);
      inc(ii);
      NameList.Items.Insert(ii + 1, dstr);
    end;
    CloseFile(F);

    // nact := NameList.Items.IndexOf('heute nicht dabei:');
    if nact > 0 then
      Edit1.Text := 'Die Liste enthält ' + IntToStr(nact) + ' aktive und ' +
        IntToStr(NameList.Count - nact - 2) + ' inaktive Namen'
    else
      Edit1.Text := 'Die Datei enthält keine Namen!';

    Edit1.Text := Edit1.Text + ' ' + ParamStr(0);
  except
    MessageDlg('NameList.txt existiert nicht!', mtError, [mbOK], 0);
  end;

end;
Die Zeile ganz am Ende
Zitat:

MessageDlg('NameList.txt existiert nicht!', mtError, [mbOK], 0);
ergibt bereits im Editor die Fehlermeldungen "Undeklarierter Bezeichner 'mtError'" und Undeklarierter Bezeichner 'mbOK'.
Beim Compilieren heißt es außerdem:
[dcc32 Fehler] Unit1.pas(119): E2250 Es gibt keine überladene Version von 'MessageDlg', die man mit diesen Argumenten aufrufen kann (die Zeilennummer 119 passt hier nicht, weil ich einigen Code hier weggelassen habe).

Beispielcode aus dem Help sieht genau so aus.

Was ist nun falsch?

himitsu 3. Sep 2020 16:45

AW: was ist falsch an MessageDlg
 
Bei FMX brauchen viele ENUMs einen Scope.
siehe Delphi-Referenz durchsuchenSCOPEDENUMS http://docwiki.embarcadero.com/RADSt...Enums_(Delphi)

TType.EnumName statt nur EnumName.
Oder du hast vergessen eine Unit einzubinden.
Im FMX wurden einige Typen verschoben, wobei an der alten stelle ein Alias steht, wo aber die EnamNamen anders weitergeleitet werden, womit sie über die "alte" Unit ohne Scop genutzt werden können.

Zitat:

E2250 Es gibt keine überladene Version von
Sowas kann auch kommen, wenn man einen gleichnamigen, aber "anderen" und somit falschgen Typen/Enum/Konstante/... aus einer anderen Unit dort im Gültigkeitsbereich liegen hat, wo die beiden Typen aber nicht kompatibel sind.

Gyrospeter 4. Sep 2020 09:46

AW: was ist falsch an MessageDlg
 
Bei uses statt FMX.Dialogs mal Vcl.Dialogs ausprobieren?

TiGü 4. Sep 2020 10:40

AW: was ist falsch an MessageDlg
 
Zitat:

Zitat von Gyrospeter (Beitrag 1472991)
Bei uses statt FMX.Dialogs mal Vcl.Dialogs ausprobieren?

In einem FMX-Projekt? :roll:

Stevie 4. Sep 2020 11:31

AW: was ist falsch an MessageDlg
 
Zitat:

Zitat von himitsu (Beitrag 1472934)
Bei FMX brauchen viele ENUMs einen Scope.

So issues.

Delphi-Quellcode:
  MessageDlg('NameList.txt existiert nicht!', TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);

Der schöne Günther 4. Sep 2020 11:35

AW: was ist falsch an MessageDlg
 
Nur hat das mit FMX nicht unbedingt was zu tun, das "ScopedEnums ON" kommt ja schon direkt aus der
Delphi-Quellcode:
System.UITypes
.

himitsu 4. Sep 2020 12:19

AW: was ist falsch an MessageDlg
 
Das {$ScopedEnums} hat auf das Einfluss, was danach/darunter definiert wurde, nicht wo es verwendet wird.
Es legt einfach nur fest, ob die Namen der Enum-Werte auch öffentlich/global/einzeln freigegeben werden.

Was aber noch fehlt. wäre dass man die ENUMs auch über den Namen/Scope des SETs aufrufen kann.
Weil hab ich 'ne SET-Variable, dann kann ich den Typen der Variable sehen, aber muß mir denno den Namen des zugrundeliegenden ENUM-Typen raussuchen.

Stevie 4. Sep 2020 12:50

AW: was ist falsch an MessageDlg
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1473011)
Nur hat das mit FMX nicht unbedingt was zu tun, das "ScopedEnums ON" kommt ja schon direkt aus der
Delphi-Quellcode:
System.UITypes
.

Hast recht - dass man das bei VCL noch herkömmlich nutzen kann, liegt an den Aliasen bzw consts, die in Vcl.Dialogs definiert sind - z.B.

Delphi-Quellcode:
mtError   = System.UITypes.TMsgDlgType.mtError;

himitsu 4. Sep 2020 13:22

AW: was ist falsch an MessageDlg
 
Zitat:

Zitat von himitsu (Beitrag 1472934)
Im FMX wurden einige Typen verschoben, wobei an der alten stelle ein Alias steht, wo aber die EnamNamen anders weitergeleitet werden, womit sie über die "alte" Unit ohne Scop genutzt werden können.


Wobei, ScopedEnum und Prefix ist aber auch eine Unart.

Es wäre auch schön, dass wenn das Ziel definitiv fest steht (z.B. da der Parameter/Property nur diesen Typ zulässt, dass man dort den Scope implizit einfach weglassen könnte. Schade das sowas niemand in den Compiler einbauen will.

KodeZwerg 4. Sep 2020 13:57

AW: was ist falsch an MessageDlg
 
Warning: MessageDlg is deprecated. Dafür nun MessageDialogAsync verwenden.


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