首页 > 其他分享 >unidac在lazarus 3.0/fpc3.3.1遇到的问题

unidac在lazarus 3.0/fpc3.3.1遇到的问题

时间:2024-02-07 11:44:42浏览次数:26  
标签:end Create Add lazarus TBooleanOption 3.0 TAccessConnection unidac FConnectionOp

近日和樵夫交流时发现unidac在aarch64 linux交叉编译UniProvider.pas出错:

UniProvider.pas(1040,1) Error: Compilation raised exception internally

奇怪的是其他CPU类型是正常的。

樵夫的解决办法:
1、修改UniProvider.pas,添加

{$if FPC_FULLVERSION<30301}
  TEnumeratorOption = class(TOption)
  private
    FTypeInfo: PTypeInfo;
    FMinValue: integer;
    FMaxValue: integer;
    FInternalType: boolean;
  protected
    procedure InternalGetValuesList(List: TStrings); override;

  public
    procedure SetTypeInfo(typeInfo: PTypeInfo);
    {$if FPC_FULLVERSION<30301}
    constructor Create(const OptionName: string; InternalIndex: integer; InternalClasses: array of TClass;
      DefaultValue: variant; TypeInfo: PTypeInfo);
    {$endif}
    function GetAsString(const Value: variant): string; override;
    function GetAsNative(const Value: string): variant; override;

    function CheckValue(const Value: string): boolean; override;
  end;

  TOptionsList = class(TStringList)
{$if FPC_FULLVERSION<30301}
constructor TEnumeratorOption.Create(const OptionName: string; InternalIndex: integer;
  InternalClasses: array of TClass; DefaultValue: variant; TypeInfo: PTypeInfo);
var
  TypeData: PTypeData;
  TypeName: string;
begin
  inherited Create(OptionName, InternalIndex, InternalClasses, DefaultValue);

  FTypeInfo := TypeInfo;
  TypeData := GetTypeData(FTypeInfo);
  if TypeData <> nil then begin
    FMinValue := TypeData{$IFNDEF CLR}^{$ENDIF}.MinValue;
    FMaxValue := TypeData{$IFNDEF CLR}^{$ENDIF}.MaxValue;
  end;

{$IFDEF NEXTGEN}
  TypeName := GetTypeName(FTypeInfo);
{$ELSE}
  TypeName := string(FTypeInfo.Name);
{$ENDIF}

  FInternalType := (TypeName <> '') and (TypeName[1] = '_');
end;
{$endif}

 修改相应的TxxxUniProvider.pas,添加

{$if FPC_FULLVERSION>=30301}

参考以下方法修改

procedure TAccessUniProvider.CreateConnectionOptions;
{$if FPC_FULLVERSION>=30301}
var
   tmpOption: TEnumeratorOption;
{$endif}
begin
  if FConnectionOptions = nil then begin
    FConnectionOptions := TOptionsList.Create(GetProviderName);
    FConnectionOptions.Add(TBooleanOption.Create('ColumnWiseBinding', prColumnWiseBinding, [TAccessConnection], False));
    FConnectionOptions.Add(TIntegerOption.Create('ConnectionTimeout', prConnectionTimeout, [TAccessConnection], 15));
    FConnectionOptions.Add(TBooleanOption.Create('ExclusiveLock', prExclusiveLock, [TAccessConnection], False));
    FConnectionOptions.Add(TBooleanOption.Create('ExtendedAnsiSQL', prExtendedAnsiSQL, [TAccessConnection], False));
    FConnectionOptions.Add(TBooleanOption.Create('ForceCreateDatabase', prForceCreateDatabase, [TAccessConnection], False));
    FConnectionOptions.Add(TStringOption.Create('SystemDatabase', prSystemDatabase, [TAccessConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('UseUnicode', prUseUnicode, [TAccessConnection], False));
    {$if FPC_FULLVERSION>=30301}
    tmpOption:=TEnumeratorOption.Create('DriverVersion', prDriverVersion, [TAccessConnection], Variant(dvAuto));
    tmpOption.SetTypeInfo(TypeInfo(TDriverVersion));
    FConnectionOptions.Add(tmpOption);
    {$else}
    FConnectionOptions.Add(TEnumeratorOption.Create('DriverVersion', prDriverVersion, [TAccessConnection], Variant(dvAuto), TypeInfo(TDriverVersion)));
    {$endif}
  end;
end;

procedure TAccessUniProvider.CreateSQLOptions;
begin
  if FSQLOptions = nil then begin
    FSQLOptions := TOptionsList.Create(GetProviderName);
    FSQLOptions.Add(TIntegerOption.Create('CommandTimeout', prCommandTimeout, [TAccessCommand], 0));
  end;
end;

procedure TAccessUniProvider.CreateDataSetOptions;
begin
  if FDataSetOptions = nil then begin
    FDataSetOptions := TOptionsList.Create(GetProviderName);
    FDataSetOptions.Add(TIntegerOption.Create('CommandTimeout', prCommandTimeout, [TAccessRecordSet], 0));
    FDataSetOptions.Add(TBooleanOption.Create('ExtendedFieldsInfo', prExtendedFieldsInfo, [TAccessRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('FetchAll', prFetchAll, [TAccessRecordSet], True));
  end;
end;

 相关单元按以上方法修改后就能交叉编译。

标签:end,Create,Add,lazarus,TBooleanOption,3.0,TAccessConnection,unidac,FConnectionOp
From: https://www.cnblogs.com/qiufeng2014/p/18001664

相关文章

  • docker-compose部署nacos2.3.0+mysql5.7
    docker-compose-nacos.ymlservices:mysql-nacos:restart:alwaysimage:mysql:5.7.18container_name:mysql-lablevolumes:-/Users/docker/mysql/source/mydir:/mydir-/Users/docker/mysql/source/datadir:/var/lib/mysql-/U......
  • Version 1.23.0 of PhpSpreadsheet breaks PHP 7.3+ support
    Version1.23.0ofPhpSpreadsheetbreaksPHP7.3+supporthttps://github.com/PHPOffice/PhpSpreadsheet/issues/2779当你升级composerupdate时候,项目跑不通的时候,请检查相关依赖的版本;欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。Don’treinventthewh......
  • lazarus 3.0/fpc3.3.1写线程要注意的事项
    近日和高勇交流中发现,以下代码在delphi能编译及正确执行。procedureTForm1.Button2Click(Sender:TObject);vari:integer;beginTThread.CreateAnonymousThread(procedurebeginsleep(3000);TThread.Synchronize(TThread.CurrentThread,proced......
  • 转载洛谷:23.08.19 普及模拟1 T1
    Past题目描述所有人,都有一段支离破碎的过去。你有\(n\)段过去的经历,有时顺利,有时不顺,于是你用一个评价值\(a_i\)来描述你的第\(i\)段经历,它们构成了长度为\(n\)的序列\(a\)。你决定对过去进行反思总结,反思深度为\(d\)。如果\(d\ge1\),那你就要算出\(a\)的所有子区间的和之和;如......
  • Oracle Version 19.3.0.0.0 On Windows Hyper-V Server 2019 Try In_Memory
    SQL*Plus:Release19.0.0.0.0-ProductiononTueFeb608:31:432024Version19.3.0.0.0Copyright(c)1982,2019,Oracle. Allrightsreserved.Enteruser-name:/assysdbaConnectedto:OracleDatabase19cStandardEdition2Release19.0.0.0.0-Produc......
  • (11)lazarus带历史记忆,并模糊带出功能的Edit
    procedureTForm1.Edit1KeyDown(Sender:TObject;varKey:Word;Shift:TShiftState);beginif(key=40)and(listbox2.Items.Count>0)andlistbox2.Visiblethenbegin//defines.icnVK_DOWN=40;ListBox2.SetFocus;ListBox2.ItemIndex:=0;......
  • (10)Lazarus下ListBox自画
    参考:VCL下ListBox自画,Lazarus也一样usesLCLType; ListBox的两个设置:自画事件:ListBox1DrawItemprocedureTForm1.ListBox1DrawItem(Control:TWinControl;Index:Integer;ARect:TRect;State:TOwnerDrawState);beginWithListBox1.CanvasDoBeginBrus......
  • Lazarus windows远程交叉调试Linux
    一、在目标机上安装gdbserver服务。运行gdbserver:2345你要调试的程序二、编译gdb(重点)1、下载gdb源,下载msys2-x86_64-20220118.exe。2、安装msys23、到Msys2安装目录下运行mingw64.exe4、安装以下包pacman-Syupacman-Smingw-w64-x86_64-toolchainpacman-Stexinfo......
  • Vue3.0学习(一)
    1.Vue脚手架创建通过npm命令可以创建Vue3的脚手架工程:##创建工程npminitvite-app<project-name>##进入工程目录cd<project-name>##安装依赖npminstall##运行npmrundev2.关于setupVue中支持两种Api风格:选项式、组合式。官网中解释:使用选项式API,我们可以用......
  • Nacos 官网重大升级,提供官方发行版下载包,3.0 里程碑版本新特性预告
    作者:袁坤(丹坤)、黄子纯(梓莼)、朱颜(竞竞)、季敏(清铭)、杨翊(席翁)、王晨(望宸)、邢学超(于怀)什么是Nacos以及 nacos.ioNacos/nɑ:kəʊs/是Dynamic Namingand Configuration Service的首字母简称,Nacos开源产品定位是更易于构建云原生应用的动态服务发现、配置管理和......