Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Exception bei FMX IntputBox (https://www.delphipraxis.net/187600-exception-bei-fmx-intputbox.html)

jeng37 14. Dez 2015 07:10

Exception bei FMX IntputBox
 
Hallo,

Ich habe folgendes problem mit einer InputBox,
ich bekomme diese fehler meldung:

[DCC Fehler] MiniDOMain.pas(528): E2555 Symbol 'Result' kann nicht erfasst werden
[DCC Fehler] MiniDOMain.pas(1594): E2250 Es gibt keine überladene Version von 'InputBox', die man mit diesen Argumenten aufrufen kann.

Wie kann ich das beheben?

Delphi-Quellcode:

   InputBox('Machine ID: '+ MachineID, 'Release Code',CodeStr,
       procedure(const AResult: TModalResult; const AValue: string)
        begin
            case AResult of
            mrOk:
                begin
                  // AValue is the result of the inputbox dialog
                  HexToBuffer(AValue, SpecialCode, SizeOf(SpecialCode));
                   if IsSpecialCodeValid(ModKey, SpecialCode) then
                      Result := GetSpecialCodeValue(ModKey, SpecialCode);
                end;
              mrCancel:
                begin
                end;
           end;
    end
      );
Kann mir da jemand weiter helfen?

Perlsau 14. Dez 2015 07:31

AW: Exception bei FMX IntputBox
 
Die Fehlermeldung besagt, daß du die Funktion InputBox mit falschen bzw. fehlerhaften Argumenten aufzurufen versuchst. Wenn du dir die Online-Hilfe zu InputBox, die ich dir mal verlinkt habe, anschaust, wirst du unweigerlich feststellen, daß es sich erstens um eine Funktion handelt, die einen Wert zurückliefert, und daß diese Funktion zweitens drei Parameter erwartet, und zwar in dieser Reihenfolge: ACaption, APrompt, ADefault – wobei der erste String die Überschrift (Caption) der InputBox darstellt, die zweite den Text, der zur Eingabe auffordern soll, und der dritte den Text, der bereits im Eingabe-Feld steht, wenn dieser Dialog aufgerufen wird. Davon, daß man der Funktion InputBox als vierten Parameter eine Procedure übergeben kann, habe ich noch nie etwas gehört oder gelesen.

Daher rufst du zuerst die InputBox auf:
Delphi-Quellcode:
AValue := InputBox('Machine ID: '+ MachineID, 'Release Code',CodeStr);
Danach steht in AValue das drin, was du in der InputBox eingegeben hast.

Daniel 14. Dez 2015 07:36

AW: Exception bei FMX IntputBox
 
Zitat:

Zitat von Perlsau (Beitrag 1324331)
Davon, daß man der Funktion InputBox als vierten Parameter eine Procedure übergeben kann, habe ich noch nie etwas gehört oder gelesen.

Die mobilen Plattformen haben ihre liebe Not mit modalen Fenstern und Dialogen. Somit ist dort auch ein Aufruf von "InputBox()" nicht blockierend. Stattdessen gibt man dem Funktionsaufruf eine Prozedur mit auf den Weg, die aufgerufen wird, wenn der Anwender seine Eingabe beendet und bestätigt oder abgebrochen hat.

Perlsau 14. Dez 2015 08:05

AW: Exception bei FMX IntputBox
 
Danke, Daniel :thumb:

Kann man denn in FMX InputBox wirklich als vierten Parameter eine Procedure übergeben? Denn immerhin besagt doch die Fehlermeldung, daß keine überladene Version von InputBox existiert, die man mit diesen Parametern aufrufen könnte. Oder sollte die Procedure etwa anschließend aufgerufen werden?

Mit meinem D2009 kann ich das natürlich nicht nachprüfen, ich hatte mich einzig an die Online-Hilfe gehalten. Okay, ich halte mich da jetzt raus, es gibt genügend gewiefte FMX-Entwickler hier, die sicher mehr dazu schreiben können als ich :stupid:

Sir Rufo 14. Dez 2015 08:32

AW: Exception bei FMX IntputBox
 
  1. [DCC Fehler] MiniDOMain.pas(528): E2555 Symbol 'Result' kann nicht erfasst werden
  2. [DCC Fehler] MiniDOMain.pas(1594): E2250 Es gibt keine überladene Version von 'InputBox', die man mit diesen Argumenten aufrufen kann.
Zu 1. können wir etwas sagen, aber zu 2. können wir nichts sagen, denn den Source hast du uns nicht gezeigt.

Zu 1.
Delphi-Quellcode:

   InputBox('Machine ID: '+ MachineID, 'Release Code',CodeStr,
       procedure(const AResult: TModalResult; const AValue: string)
        begin
            case AResult of
            mrOk:
                begin
                  // AValue is the result of the inputbox dialog
                  HexToBuffer(AValue, SpecialCode, SizeOf(SpecialCode));
                   if IsSpecialCodeValid(ModKey, SpecialCode) then
                      { Man kann hier auf Result nicht zugreifen }
                      Result := GetSpecialCodeValue(ModKey, SpecialCode);
                end;
              mrCancel:
                begin
                end;
           end;
    end
      );
@Perlsau

Dein Link zeigt auf die Doku von XE5 und da gab es das noch nicht. Die Doku der aktuellen Version zeigt auch die Überladungen.

http://docwiki.embarcadero.com/Libra...alogs.InputBox

Ich finde in dem Beitrag aber auch keinen Hinweis auf die verwendete Delphi Version :stupid:

jeng37 14. Dez 2015 08:39

AW: Exception bei FMX InputBox
 
Vileicht hilft das weiter?
Ich habe versucht dieses umzuschreiben so dass es halt auf Android läuft.

Original code für Windows:

Delphi-Quellcode:
if InputQuery('Machine ID: '+ MachineID ,
       'Release Code', CodeStr) then begin
    HexToBuffer(CodeStr, SpecialCode, SizeOf(SpecialCode));
    if IsSpecialCodeValid(ModKey, SpecialCode) then
      Result := GetSpecialCodeValue(ModKey, SpecialCode);
  end;
@Sir Rufo
Wenns weiter Hilft, ich benutze zur Zeit XE8 Trial

Sir Rufo 14. Dez 2015 08:50

AW: Exception bei FMX IntputBox
 
Manchmal hilft es, wenn man in ganzen Sätzen spricht.

Ein paar Codezeilen aus dem Zusammenhang gerissen sind kein ganzer Satz.

Vermutlich sieht es so aus
Delphi-Quellcode:
function foo() : integer;
begin
  if InputQuery(
    {} 'Machine ID: ' + MachineID,
    {} 'Release Code',
    {} CodeStr)
  then
    begin
      HexToBuffer( CodeStr, SpecialCode, SizeOf( SpecialCode ) );
      if IsSpecialCodeValid( ModKey, SpecialCode ) then
        Result := GetSpecialCodeValue( ModKey, SpecialCode );
    end;
end;
Speziell unter Android funktioniert das aber so generell nicht, denn die Doku sagt ja, dass
Delphi-Quellcode:
InputBox
unter Android nicht blockierend ist.

Also kommt dein Funktionsaufruf zurück, obwohl die
Delphi-Quellcode:
InputBox
noch angezeigt wird und es ja noch kein Ergebnis gibt.

Und wenn es ein Ergebnis gibt ... wohin soll das Result denn geliefert werden? An einen Funktionsaufruf, der schon längst ein Gewesener ist.

Du musst dein Konzept umstellen.

Zitat:

Zitat von jeng37 (Beitrag 1324341)
@Sir Rufo
Wenns weiter Hilft, ich benutze zur Zeit XE8 Trial

Da die Versionen sich schon recht stark unterscheiden (wie man sieht) ist es sehr hilfreich die konkrete Delphi-Version zu wissen um eine konkrete Antwort geben zu können.

Information does matter

jeng37 14. Dez 2015 09:13

AW: Exception bei FMX IntputBox
 
Oh, Sorry
Ich meinte dass der Code Schnipsel genug Info währe.
Der Vollständigkeit halber dann hier der ganze Code.

Delphi-Quellcode:
function TMiniDOForm.DecodeSpecialCode : Longint;
var
  CodeStr  : string;
  ModKey   : TKey;
  MachineID : string;
  Modifier : longint;

begin
  Result := 0;
  MachineID := '';
  Modifier := GenerateMachineModifierPrim;
  MachineID := BufferToHex(Modifier, SizeOf(Modifier));
  ModKey := TheKey;
  ApplyModifierToKeyPrim(Modifier, ModKey, SizeOf(ModKey));
  {First see if existing Special code is valid}

  if IsSpecialCodeValid(ModKey, SpecialCode) then begin
    Result := GetSpecialCodeValue(ModKey, SpecialCode);
    Exit;
  end;

  {Otherwise prompt user for Special code}

  CodeStr := '';
  {$IFDEF MSWINDOWS}
 if InputQuery('Machine ID: '+ MachineID ,
       'Release Code', CodeStr) then begin
    HexToBuffer(CodeStr, SpecialCode, SizeOf(SpecialCode));
    if IsSpecialCodeValid(ModKey, SpecialCode) then
      Result := GetSpecialCodeValue(ModKey, SpecialCode);
  end;
  {$ENDIF MSWINDOWS}

  {$IFDEF ANDROID}
   InputBox('Machine ID: '+ MachineID, 'Release Code',CodeStr,
       procedure(const AResult: TModalResult; const AValue: string)
        begin
            case AResult of
            mrOk:
                begin
                  // AValue is the result of the inputbox dialog
                  HexToBuffer(AValue, SpecialCode, SizeOf(SpecialCode));
                   if IsSpecialCodeValid(ModKey, SpecialCode) then
                      Result := GetSpecialCodeValue(ModKey, SpecialCode);
                end;
              mrCancel:
                begin
                end;
           end;
    end
      );
   {$ENDIF ANDROID}
end;

Sir Rufo 14. Dez 2015 09:38

AW: Exception bei FMX IntputBox
 
Da wirst du dir ein anderes, sauberes Konzept ausdenken müssen. Eine Vermischung von UI und Logik war noch nie sauber.


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