Jump to content

ertank

Members
  • Content Count

    234
  • Joined

  • Last visited

Posts posted by ertank


  1. Hello,

     

    There seems to be a lot of VCL based free solutions. I could not find one for FMX platform.

     

    I am looking for a free AES256-CBC FMX compatible solution that I can pass IV and Key values manually.

     

    I installed "LockBox VCL and FMX 2.3" from GetIt package manager. It seems to take string value as Key for TLbRijndael component and does everything internally.

     

    Any help is appreciated.

     

    Thanks & regards,

    Ertan


  2. 12 hours ago, Dave Nottage said:

    In Kotlin, however does this help at all?

    Unfortunately not a big help. I have read that article before posting my question in here. I do not know java language. I might use some small app running in the background just to communicate with RFID and send back my Delphi app replies for these commands though. Just not sure if that is possible.

    12 hours ago, Dave Nottage said:

    It uses the IsoDep class to send the APDU commands

    I would like Delphi to use IsoDep.transceive() in a way.

     

    Thanks for the help.


  3. Hello,

     

    I am using Delphi 10.3.2 and I have that project I need to use APDU commands communicating a Mifare card.

     

    I do not know java language. However, Android seems to have support for APDU commands for a very long time (like old versions such as 4.4 has that support). I have found following document:

    https://developer.android.com/reference/android/nfc/tech/IsoDep

     

    My problem is, I do not know APDU command use is possible with Delphi 10.3.2 on Android. I have found only one blog about RFID with Delphi FMX and that is for communicating smart tags. Unfortunately not providing help on APDU usage.

    http://blong.com/articles/delphixe7nfc/nfc.htm

     

    I can't find any other information about Delphi FMX and APDU.

     

    I appreciate any help.

     

    Thanks & regards,

    Ertan


  4. That code did work. Though, it block my main thread. I just need to modify my logic slightly and put it in a thread and call a procedure once some json is in.

     

    I will definitely use some json parser. I simply failed to get data from server to start parsing it.

     

    Thank you.


  5. Hello,

     

    I am using Delphi 10.3.2, Indy version: 10.6.2.5366 (default coming with Delphi).

     

    There is a gpsd daemon running on a Raspberry Pi. It is broadcasting some json strings over TCP:2947

    - I can successfully establish a connection using TIdTCPClient. There is no data incoming after connection.

    - Send command to stream my client these json strings after connection. There is no data incoming after sending command.

    Memo output:

    Memo1
    Connecting to 192.168.1.90.
    Connected.
    

     

    On the other hand;

    - Using Putty, I instantly get initial greeting json string right after connection without sending anything.

    - if I send command to stream I instantly get json string replies.

     

    Putty terminal output:

    {"class":"VERSION","release":"3.17","rev":"3.17","proto_major":3,"proto_minor":12}
    ?WATCH={"enable":true,"json":true}
    {"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/ttyS0","activated":"2019-08-31T15:56:43.607Z","native":0,"bps":9600,"parity":"N","stopbits":1,"cycle":1.00}]}
    {"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}
    

     

    My current test code:

    unit uMain;
    
    interface
    
    uses
      Winapi.Windows,
      Winapi.Messages,
      System.SysUtils,
      System.Variants,
      System.Classes,
      Vcl.Graphics,
      Vcl.Controls,
      Vcl.Forms,
      Vcl.Dialogs,
      IdBaseComponent,
      IdComponent,
      IdTCPConnection,
      IdTCPClient,
      Vcl.ExtCtrls,
      Vcl.StdCtrls;
    
    type
      TForm2 = class(TForm)
        IdTCPClient1: TIdTCPClient;
        Memo1: TMemo;
        Timer1: TTimer;
        Button1: TButton;
        procedure IdTCPClient1Connected(Sender: TObject);
        procedure IdTCPClient1Disconnected(Sender: TObject);
        procedure IdTCPClient1Status(ASender: TObject; const AStatus: TIdStatus;
          const AStatusText: string);
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        SentStreamCommand: Boolean;
      public
        { Public declarations }
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      if Button1.Tag <> 0 then
      begin
        IdTCPClient1.Disconnect();
        Button1.Caption := 'Connect';
        Button1.Tag := 0;
      end
      else
      begin
        IdTCPClient1.Connect('192.168.1.90', 2947);
        Button1.Caption := 'Disconnect';
        Button1.Tag := 1;
      end;
    end;
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      Timer1.Enabled := False;
      SentStreamCommand := False;
    end;
    
    procedure TForm2.FormDestroy(Sender: TObject);
    begin
      if IdTCPClient1.Connected then IdTCPClient1.Disconnect(False);
    end;
    
    procedure TForm2.IdTCPClient1Connected(Sender: TObject);
    begin
      Timer1.Enabled := True;
    end;
    
    procedure TForm2.IdTCPClient1Disconnected(Sender: TObject);
    begin
      Timer1.Enabled := False;
    end;
    
    procedure TForm2.IdTCPClient1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: string);
    begin
      Memo1.Lines.Add(AStatusText);
    end;
    
    procedure TForm2.Timer1Timer(Sender: TObject);
    var
      ReceivedText: string;
    begin
      Timer1.Enabled := False;
      try
        with IdTCPClient1 do
        begin
          if not Connected then Exit();
    
          // read any data in
          if IOHandler.InputBufferIsEmpty then
          begin
            IOHandler.CheckForDataOnSource(0);
            IOHandler.CheckForDisconnect;
            if IOHandler.InputBufferIsEmpty then Exit();
            ReceivedText := IOHandler.AllData();
            if ReceivedText <> EmptyStr then Memo1.Lines.Add(ReceivedText);
          end;
    
          // if not already, send streaming command
          if not SentStreamCommand then
          begin
            IdTCPClient1.IOHandler.WriteLn('?WATCH={"enable":true,"json":true}');
            SentStreamCommand := True;
            Exit();
          end;
        end;
      finally
        if IdTCPClient1.Connected then Timer1.Enabled := True;
      end;
    end;
    
    end.

     

    I would like to understand what I am doing wrong. My main purpose is to read each json string separately as they are incoming one per line.

     

    I appreciate any help, please.

     

    Thanks & regards,

    Ertan


  6. Hello,

     

    Everybody has own needs. Working on a multi-monitor system. I do not want to have IDE jump from one monitor to other when I start debugging. I failed to find a report about that and add one myself.

    https://quality.embarcadero.com/browse/RSP-25646

     

    It is indicated to be under consideration. I would like if you choose to vote for it. I do strongly believe that will help people working using Delphi on a multi-monitor systems.

     

    Thanks & regards,

    Ertan


  7. I finally got a regular HDD (spin drive) and when using it compilation works. It also gives errors like above, but so rare that you can ignore them.

     

    All SMART checks on all drives are good. Now, I wonder if it is Windows 10 thing appeared with its latest update or something. I still cannot find a reason why creating files on disk fails or why it cannot find existing files.

     


  8. 26 minutes ago, David Schwartz said:

    How much experience do you have working with Delphi?

    I have been using Delphi 1 until Delphi 7. Then I stop programming for long years and started again recently.

    28 minutes ago, David Schwartz said:

    Do you even know how to locate files on the hard drive?

    Yes, they exists under project directory with DPR file itself.

    image.thumb.png.ec4638c89821ceb3c447140f9e36f62a.png

     

    29 minutes ago, David Schwartz said:

    If you don't know how to find files on the disk or set up Delphi's search paths properly, there's no way you're going to make any sense at all of the crap you're going to see as a result of rebuilding this D7 app with Unicode strings!

    It is not about search paths. It is something with Delphi not able to cope with very fast drives or something else that I do not know. DPR file has following lines:

    uses
      Forms,
      UnitLogin in 'UnitLogin.pas' {Login},
      UnitMainForm in 'UnitMainForm.pas' {MAINFORM},

     

    Error is not on same file each time. It changes. I just give some examples there. However, it mostly stops either at first or second file defined in DPR. 


  9. Hello,

     

    I am using Delphi 10.3.2.

     

    There is that Delphi7 project which uses over 200 units and forms.

     

    I am asked to migrate it to Delphi Rio. There are some components used for skinning that will be removed during migration. Other than this, code is mostly compatible.

     

    However, I cannot have a good compile. I get one of below errors too frequently that it gets a person fed up. Consider each line as an error returned after a different compile

    
    Could not create output file 'DCU-DEBUG\xyz.dcu'
    
    File not found: 'UnitMainForm.pas'
    
    File not found: 'UnitLogin.pas'
    
    File not found: 'UnitSalesEntry.pas'
    
    File not found: 'ERP.dpr'
    
    

     

    I am sure all these files exists. I did not copy-paste them. Used SVN to have all files in my computer. Removing all add-ons, even IdeFixPack and problem still exists.

     

    Files are on an SSD drive and there is plenty of free space on that drive.

    "DCU-DEBUG" folder is writable by Delphi.

     

    I do not have any errors reported by Delphi when closing (tested to see if some memory leaks or similar).

     

    I failed to find a fix for that problem and asking in here in case someone else might faced that before and can suggest a solution.

     

    Thanks & regards,

    Ertan


  10. Seems like initial code I share is faster than RegEx after initial call. Moreover, RegEx is failing at certain formats at the moment which will probably make it slower in all cases when all features added.

     

    Timing test code:

    program Project2;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      uUtils.ParseExact,
      System.RegularExpressions,
      System.Diagnostics;
    
    
    
    function Test(const Value: string; const fmtset: TFormatSettings): TDateTime;
    var
      pattern: string;
      match: TMatch;
      day: word;
      month: word;
      year: word;
    begin
      pattern := //
        '(' + string.Join('|', fmtset.LongDayNames) + ')' + // "dddd"
        ', ' + // ", "
        '(\d{2})' + // "dd"
        ' ' + // " "
        '(' + string.Join('|', fmtset.LongMonthNames) + ')' + // "mmmm"
        ' ' + // " "
        '(\d{4})'; // "yyyy"
    
      match := TRegEx.match(Value, pattern);
    
      if not match.Success then
        raise Exception.Create('Invalid data');
    
      day := word.Parse(match.Groups.Item[2].Value);
      month := 1;
      while (month <= 12) and (fmtset.LongMonthNames[month] <> match.Groups.Item[3].Value) do
        inc(month);
      year := word.Parse(match.Groups.Item[4].Value);
    
      try
        Result := EncodeDate(year, month, day);
      except
        Result := 0;
      end;
    end;
    
    
    
    const
      Date1 = 'Sunday, 22 September 2019';
      Date2 = 'Monday, 20 January 2018';
      Date3 = 'Sun 15 Sep 2019';
    
    var
      ADate: TDateTime;
      AFormatSettings: TFormatSettings;
      Timing: TStopWatch;
    begin
      try
        AFormatSettings := TFormatSettings.Create('en-US');
    
        WriteLn('Long code timings');
        Timing := TSTopWatch.StartNew();
        ADate := TDateTime.ParseExact(Date1, 'dddd, dd mmmm yyyy', AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TStopwatch.StartNew();
        ADate := TDateTime.ParseExact(Date2, 'dddd, dd mmmm yyyy', AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TStopwatch.StartNew();
        ADate := TDateTime.ParseExact(Date2, 'dddd, dd mmmm yyyy', AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TStopwatch.StartNew();
        ADate := TDateTime.ParseExact(Date3, 'ddd dd mmm yyyy', AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
    
        WriteLn('RegEx code timings');
        Timing := TSTopWatch.StartNew();
        ADate := Test(Date1, AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TSTopWatch.StartNew();
        ADate := Test(Date2, AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TSTopWatch.StartNew();
        ADate := Test(Date2, AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
        Timing := TSTopWatch.StartNew();
        ADate := Test(Date3, AFormatSettings);
        Timing.Stop();
        WriteLn(DateToStr(ADate), 'Time: ' + Timing.Elapsed);
    
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    
      ReadLn;
    end.

     

    My system output:

    Long code timings
    22.09.2019Time: 00:00:00.0001696
    20.01.2018Time: 00:00:00.0000132
    20.01.2018Time: 00:00:00.0000157
    15.09.2019Time: 00:00:00.0000134
    RegEx code timings
    22.09.2019Time: 00:00:00.0001281
    20.01.2018Time: 00:00:00.0000404
    20.01.2018Time: 00:00:00.0000255
    Exception: Invalid data

     


  11. 1 hour ago, Schokohase said:

     

    
      pattern := //
        '(' + string.Join('|', fmtset.LongDayNames) + ')' + // "dddd"
        ', ' + // ", "
        '(\d{2})' + // "dd"
        ' ' + // " "
        '(' + string.Join('|', fmtset.LongMonthNames) + ')' + // "mmmm"
        ' ' + // " "
        '(\d{4})'; // "yyyy"

    Well there is a lot to improve, but you should get the idea.

    Only thing that maybe missing is "ddd" and "mmm" aka ShortDayNames and ShortMonthNames above. I find RegEx powerful. Unfortunately, I am not familiar with it at all.

     

    Would you add these two possible patterns in your sample code, please?


  12. Shared C# code conversion is out of my league. I would vote for such a function to be implemented in Delphi by Embarcadero though.

     

    For now, I have written something as following. My two versions are parsed OK with that.

     

    I might improve this code to have time part and to handle my possible fail cases in the future. I am not after very fast code at the moment. For now I will keep that one.

    unit uUtils.ParseExact;
    
    interface
    
    uses
      System.SysUtils;
    
    type
      TDateTimeHelper = record helper for TDateTime
      public
        class function ParseExact(const Value, Format: string; AFormatSettings: TFormatSettings): TDateTime; static;
      end;
    
    implementation
    
    
    procedure GetNumber(const InValue: string; out OutValue: Integer);
    var
      Finish: Integer;
    begin
      Finish := 1;
      while CharInSet(InValue.Chars[Finish], ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']) do
        Inc(Finish);
    
      if not TryStrToInt(InValue.Substring(0, Finish), OutValue) then raise Exception.Create('Cannot convert to number');
    end;
    
    class function TDateTimeHelper.ParseExact(const Value, Format: string; AFormatSettings: TFormatSettings): TDateTime;
    label
      Again;
    var
      Day: Integer;
      Month: Integer;
      Year: Integer;
      TempString: string;
      TempFormat: string;
      I: Integer;
    begin
      Result := 0;
    
      TempString := Value.ToLower();
      TempFormat := Format.ToLower();
    
      if TempFormat.Contains('mmm') or TempFormat.Contains('mmmm') then
      begin
        // month string literals converted to numbers
        for I := Low(AFormatSettings.LongMonthNames) to High(AFormatSettings.LongMonthNames) do
        begin
          TempString := TempString.Replace(AFormatSettings.LongMonthNames[I].ToLower(), I.ToString());
          TempString := TempString.Replace(AFormatSettings.ShortMonthNames[I].ToLower(), I.ToString());
        end;
    
        TempFormat := TempFormat.Replace('mmmm', 'mm');
        TempFormat := TempFormat.Replace('mmm', 'mm');
      end;
    
      if TempFormat.Contains('ddd') or TempFormat.Contains('dddd') then
      begin
        // day string literals are simply removed
        for I := Low(AFormatSettings.LongDayNames) to High(AFormatSettings.LongDayNames) do
        begin
          TempString := TempString.Replace(AFormatSettings.LongDayNames[I].ToLower(), EmptyStr);
          TempString := TempString.Replace(AFormatSettings.ShortDayNames[I].ToLower(), EmptyStr);
        end;
    
        TempFormat := TempFormat.Replace('dddd', EmptyStr);
        TempFormat := TempFormat.Replace('ddd', EmptyStr);
      end;
    
      TempFormat := TempFormat.Trim();
      TempString := TempString.Trim();
    
    Again:
      // remove non relevant chars at beginning
      while not CharInSet(TempFormat.Chars[0], ['a'..'z']) do
      begin
        TempFormat := TempFormat.Substring(1, MaxInt);
        TempString := TempString.Substring(1, MaxInt);
      end;
    
      if TempString.Length > 0 then
      begin
        case TempFormat[1] of
          'd':
          begin
            if Day = 0 then GetNumber(TempString, Day);
            I := 0;
            while CharInSet(TempString.Chars[I], ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', AFormatSettings.DateSeparator]) do
              Inc(I);
            TempString := TempString.Substring(I, MaxInt);
            TempFormat := TempFormat.Replace('dd', EmptyStr);
            goto Again;
          end;
    
          'm':
          begin
            if Month = 0 then GetNumber(TempString, Month);
            I := 0;
            while CharInSet(TempString.Chars[I], ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']) do
              Inc(I);
            TempString := TempString.Substring(I, MaxInt);
            TempFormat := TempFormat.Replace('mm', EmptyStr);
            goto Again;
          end;
    
          'y':
          begin
            if Year = 0 then GetNumber(TempString, Year);
            I := 0;
            while CharInSet(TempString.Chars[I], ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']) do
              Inc(I);
            TempString := TempString.Substring(I, MaxInt);
            goto Again;
          end;
        end;
      end;
    
      if (Day > 0) and (Month > 0) and (Year > 0) then
      begin
        try
          Result := EncodeDate(Year, Month, Day);
        except
          raise Exception.Create('uUtils.ParseExact(): Cannot encode.' + sLineBreak + sLineBreak +
            'Year: ' + Year.ToString() + sLineBreak +
            'Month: ' + Month.MaxValue.ToString() + sLineBreak +
            'Day: ' + Day.ToString());
        end;
      end
      else
      begin
        raise Exception.Create('uUtils.ParseExact(): Cannot parse all day, month and year');
      end;
    end;
    
    end.

     

    Usage is as following:

    uses
      uUtils.ParseExact;
    
    var
      ADate: TDateTime;
      AFormatSettings: TFormatSettings;
    begin
      AFormatSettings := TFormatSettings.Create('en-US');
    
      ADate := TDateTime.ParseExact('Sunday, 22 September 2019', 'dddd, dd mmmm yyyy', AFormatSettings);
      ShowMessage(DateToStr(ADate));
    
      ADate := TDateTime.ParseExact('Sun 15 Sep 2019', 'ddd dd mmm yyyy', AFormatSettings);
      ShowMessage(DateToStr(ADate));
    end;

     


  13. Hello,

     

    I am using Delphi 10.3.2.

     

    I used to parse date string "Tue 17 Sep 2019" in an e-mail message using VarToDateTime() which served its purpose well. Now, format changed to "Sunday, 22 September 2019" and that function is not so helpful as before.

     

    I am trying not to manually parse the string as it is due to change in the future, too.

     

    My questions are;

    1- It is always possible one cannot see a simple solution. I appreciate if you can point me to right existing Delphi solution. I could not make StrToDate() working for me even with TFormatSettings provided and even with several different input strings like "22 September 2019", "22/September/2019", etc.

     

    2- It would be great if anybody have a unit or a function he/she can share which handles provided date format like 'dddd, dd mmmm yyyy' and convert the input string to TDateTime using that given format. I do not know C#. I saw several examples of DateTime.ParseExact() which seems like what I am searching for. I might be completely wrong about that though.

     

    Thanks & regards,

    Ertan

     

     


  14. 3 hours ago, pcplayer99 said:

    If you write SOAP code with using DELPHI, you must know, in SOAP interface methods, if the data type is a object, it must derive from TRemotable. If it is a TComponent, it can not using in SOAP method. Here I mean is that you design a SOAP server.

    I am not designing SOAP server side. It is a production server running for years. Very much likely that it is designed using Microsoft tools. I am to consume it using Delphi.

    3 hours ago, pcplayer99 said:

    If there is a running SOAP server, you can using  "Component/import WSDL" menu in Delphi IDE menu, and Delphi will create some SOAP client code for you.

    I already did that. Using generated web service file, I am doing below request.

    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <SOAP-ENV:Header>
          <NS1:AuthHeader xmlns:NS1="http://tempuri.org/">
             <UserName xmlns="http://tempuri.org/">myuser</UserName>
             <Password xmlns="http://tempuri.org/">mypassword</Password>
          </NS1:AuthHeader>
       </SOAP-ENV:Header>
       <SOAP-ENV:Body>
          <GetRestaurantList xmlns="http://tempuri.org/" />
       </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    Response I get is already shared in my initial post. Web service consuming is not open to public. It has IP restrictions and so it will not help even if I share my login credentials to anybody for doing some tests.

     

    Problem as to my understanding is that, Delphi cannot parse response from server. I cannot suppress raised exception and such an exception stops me doing anything like trying to manually parse the raw XML as I always get a dialog displayed on the screen.

     

    That application I need to run headless and do web server requests in intervals automatically. An error message with a dialog stops me doing so.


  15. Hello,

     

    I cannot compile latest revision of Indy using fpcupdeluxe. Below is log of errors I receive:

    Compiling Debug Version
    (1002) Target OS: Win64 for x64
    (3104) Compiling indylaz.pas
    (3104) Compiling .\Core\IdAboutVCL.pas
    (3104) Compiling .\Core\IdDsnCoreResourceStrings.pas
    (1010) Writing Resource String Table file: IdDsnCoreResourceStrings.rsj
    (3104) Compiling .\System\IdGlobal.pas
    (3104) Compiling .\System\IdException.pas
    (3104) Compiling .\System\IdResourceStrings.pas
    (1010) Writing Resource String Table file: IdResourceStrings.rsj
    (3104) Compiling .\System\IdStream.pas
    (3104) Compiling .\System\IdStreamVCL.pas
    (3104) Compiling .\Core\IdAntiFreeze.pas
    (3104) Compiling .\System\IdAntiFreezeBase.pas
    (3104) Compiling .\System\IdBaseComponent.pas
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(101,96) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(103,91) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(104,82) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(112,83) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(113,80) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(114,81) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(115,78) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(118,91) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(119,86) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(121,12) Error: (2021) ENDIF without IF(N)DEF
    C:\fpcupdeluxe\ccr\indy\Lib\.\Core\IdAntiFreeze.pas(122,3) Fatal: (2003) Syntax error, "=" expected but ")" found
    Fatal: (1018) Compilation aborted
    Error: C:\fpcupdeluxe\fpc\bin\x86_64-win64\ppcx64.exe returned an error exitcode
    Error: (lazarus) Compile package indylaz 10.6.2: stopped with exit code 1
    Error: (lazarus) [TLazPackageGraph.CompileRequiredPackages] "Exit code 1"
    Error: (lazarus) Building IDE: Compile AutoInstall Packages failed.
    make: *** [useride] Error 2
    
    fpcupdeluxe: ERROR: UniversalInstaller (ConfigModule: indy): Failure trying to rebuild Lazarus. 
    Details: 
    
    
    ERROR: Fpcupdeluxe fatal error !

     

    I checked IdAntiFreeze.pas, but it is slightly complicated IF conditionals in there for me.

     

    I do not have a spare VM with Delphi to test if it is compiled fine with Delphi. Using stock Indy delivered with Delphi installation for now.

     

    Thanks & regards,

    Ertan

     

     


  16. 8 hours ago, ertank said:

    There is such a menu item. Nothing is listed when I click on it. Seems I don't have any expired certificate at all. that makes sense as initially that app distributed by some other developer using some other development tool.

     

    However, I finally found reason. I go to Preferences under XCode menu item. Under accounts, I click Manage Certificates and below is what I see.

    image.thumb.png.6a0fee48a375b620c4868faf5b7d0618.png

     

    Even if I have found reason, I still do not know how to fix that.

    Following following steps, I finally can deploy for Application Store and have my IPA file generated.

    1. revoke your active certificate in the provisioning portal
    2. create new developer certificate (keychain access/.../request for csr...etc.)
    3. download and install a new certificate
    4. create a new provisioning profile for existing app id (on provisioning portal)
    5. download and install new provisioning profile and in the build, settings set the appropriate code signing identities

    More details can be found at here: https://stackoverflow.com/questions/12867878/missing-private-key-in-the-distribution-certificate-on-keychain

     

    Thanks to everyone.


  17. 47 minutes ago, Rollo62 said:

    Would be a very useful option.

    Unfortunately I have never noticed this in my keychain.

     

    As it is explained, it is in the "menu" of Keychain application. Below screen capture is from my system. Highlighting the relevant menu item. Even if my system is not English, location should be same in your system.

     

    image.thumb.png.6344d3956b2d18b86a8d98c322121169.png


  18. There is such a menu item. Nothing is listed when I click on it. Seems I don't have any expired certificate at all. that makes sense as initially that app distributed by some other developer using some other development tool.

     

    However, I finally found reason. I go to Preferences under XCode menu item. Under accounts, I click Manage Certificates and below is what I see.

    image.thumb.png.6a0fee48a375b620c4868faf5b7d0618.png

     

    Even if I have found reason, I still do not know how to fix that.

×