Fonctionnalités de portage de logiciels modulaires complexes écrits en Delphi sous Linux OS

Cette histoire n'est pas destinée aux développeurs qui ne savent pas ce qu'est Delphi et ne peuvent pas y programmer. Les personnes qui ne traitent pas de ces outils de développement sont priées de ne pas commenter l'article et de ne pas blesser les nerfs déjà brisés des grands-pères qui continuent obstinément à soutenir les développements à long terme écrits à l'aide de ces outils de développement. Les suggestions pour tout réécrire à partir de zéro en quelque chose de plus à la mode ne sont pas les bienvenues.





introduction

Je m'appelle Konstantin Timofeev, j'ai 40 ans et je suis le principal programmeur de la société 3B Service dans la division des systèmes d'automatisation pour les calculs dynamiques (SADR). Notre principal produit logiciel est l'environnement de simulation pour les systèmes dynamiques SimInTech (née PC Simulation In Technical Devices - 4, abrégé en PC "MVTU").





Historiquement, ce logiciel a commencé à se développer au Département des réacteurs nucléaires et des centrales électriques (E7) de l'Université technique d'État de Moscou. Bauman. Les premières versions de PC «MVTU» ont été développées au département sous la direction de Ph.D. Kozlov Oleg Stepanovich. Le progiciel était destiné à la modélisation structurelle de la dynamique des centrales nucléaires. La fonction du PC "MVTU" consistait à dresser un modèle du système sous forme de schéma bloc avec la formation automatique ultérieure d'un système d'équations différentielles de la dynamique du système et de leur solution numérique et à afficher les résultats des calculs sur des graphiques. Dans le développement ultérieur de ce sujet, j'ai rejoint le développement en 2003 et sur la base du PC "MVTU-3", nous avons commencé à créer une version industrielle du complexe logiciel - PC "MVTU-4", qui a ensuite reçu le nom de SimInTech.Le développement d'une nouvelle version du programme a nécessité une révision très sérieuse de l'architecture du programme et a permis de créer un complexe permettant de construire des modèles grandeur nature de la dynamique des centrales nucléaires, ainsi que des systèmes d'autres industries, et est un digne concurrent des systèmes Simulink, AmeSim, VisSim.





«-3» Delphi, 3 ( 5). , . ( ).





2003 , Delphi 6. Windows Delphi 10.3.3. Delphi, \++ , FORTRAN. , .





1:  –

SimInTech . , - . , – : , , , , , , , (, -, ). - – (). – , – .. ). – ( , ). , , .





:





- , .





- .





- , , , OPC, shared memory.





- .





- .





- \\.





- .





- .





- COM- ( ).





. Delphi , ( , ) :





- – Tee Chart Pro.





- – SynEdit, TBCEditor.





- – DSPack.





- \\ \ \ \ – VirtualTreeView.





- – zeosdbo.





- – GLScenes.





- – JEDI VCL + JCL - , .





, DLL C FORTRAN, RSA MD5 . Windows- Direct2D, ( ).





– , . .





. . , DLL , override . , . ( ) \ \ . , – .. ( ). , – .. .





, , , fastmm5, . , , .





215073 ( , dfm). Delphi 2858375 , .





.





2:

, Windows, (). , , GRS . BDSM – ( ) Suse Linux, -, . , , - . – Wine , 32 Direct2D , . , , . , API , . - Windows-.





Java , FORTRAN - . , Delphi , - ( ). Java ( - , ), . C#, - GUI Linux .





GUI 2:





1.       Qt C++ - , , – VCL . , .   , Qt (qucs ) , .





2.       Free Pascal + Lazarus. ( ) , . , .





  , Delphi IFDEF- Lazarus. , SimInTech Windows 2 .   , .





Lazarus , , -, , 2D-. AggPas Lazarus-, Direct2D . . Lazarus- CodeTyphon Studio , Linux . :





1 – , , Delphi-. . BCEditor ( SynEdit, ), DSPack ( , ), TeeChart Pro ( TAChart, ).





2 – – ORCA 2D, Direct2D .





3:

– , .. , , :





1 – , shared object – .





2 – C FORTRAN.





3 – , , .. .





4 – .





5 – dfm ( 2 Windows Linux .





1 3, Lazarus LCL VCL, .





VirtualBox , . Open Suse, Alt Linux 8.3 Alt Linux 9. https://pilotlogic.com/ . – su ./install.sh  , Alt Linux , – , .  –   CodeTyphonIns\installbin\ScriptsLin\ln_All_Functions.sh  .





Alt Linux , , Ubuntu:





#------------ 100 Alt (apt-get compitible)----------
 elif [ -f /etc/altlinux-release ] ; then
   vOSVerNum=100
   vOSDistribution="Alt Linux (apt-get compatible)"
   vMultiArchDirPlan=200

      
      







AstraLinux ( sudo). AltLinux 9 Astra Linux Orel.





Astra Linux , – git 2.11, SmartGIT- 2.16. git . 





Linux.





, . , DLL .





, Free Pascal, , RTL- cmem, libc. Delphi dpr- ( Delphi  SimpleShareMem fastmm4 \ fastmm5 ). . , fpcx64mm   Synopse mORMot framework 2.  , , simmm.pas :





unit simmm;
  //       
{$IFNDEF DCAD}
{$DEFINE IS_DLL_UNIT}
{$ENDIF}

{$IFDEF FPC}
 {$MODE Delphi}{$H+} 
{$ENDIF} 

interface

{$IFDEF UNIX}

  {$IFDEF IS_DLL_UNIT}
  uses cthreads, dl;
  {$ELSE}
  uses cthreads, fpcx64mm;
  {$ENDIF}

{$ELSE}
uses  FastMM5;
{$ENDIF}

implementation

{$IFDEF UNIX}
{$IFDEF IS_DLL_UNIT}
  var
     NewMM,
     OldMM:      TMemoryManager;
     MainHandle: Pointer;
     GetCommonMemoryManager: procedure(var aMemMgr: TMemoryManager);
{$ENDIF}
{$ENDIF}

initialization

  {$IFDEF UNIX}
  {$IFDEF IS_DLL_UNIT}

    MainHandle:=dlopen(nil, RTLD_LAZY);
    GetCommonMemoryManager:=dlsym(MainHandle,'GetMemoryManager');
    GetCommonMemoryManager(NewMM);
    GetMemoryManager(OldMM);
    SetMemoryManager(NewMM);

  {$ENDIF}
  {$ELSE}

  //  
  if IsLibrary then
     FastMM_AttemptToUseSharedMemoryManager
  else
     FastMM_ShareMemoryManager;
  {$ENDIF}

  {$IFDEF UNIX}
  {$IFDEF IS_DLL_UNIT}
finalization
    SetMemoryManager(OldMM);
  {$ENDIF}
  {$ENDIF}
end.

      
      







DCAD , GetMemoryManager. dll\so   dlopen(nil, RTLD_LAZY) – , . simmm .





– , dll\so . Delphi . .. TForm.Create, . Lazarus , .. , , so- :





  …..
  Classes,
  {$IFDEF FPC}
  Interfaces,
  {$ENDIF}
  Forms,  

      
      







Application initialization finalization:





{$IFDEF FPC}
initialization
  Application.Initialize;
finalization
  Application.Terminate;
end.
{$ENDIF}

      
      







,   so.





, Lazarus. , UNIX- so , cthreads:





  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}

      
      







dpr- , , dpr‑ :





{$IFDEF FPC}
  {$MODE Delphi}   //  ,   Free Pascal  
{$ENDIF}                  //  Delphi.
                               
library mbtylib;
uses
  simmm,
  {$IFDEF UNIX}
  cthreads, //     simm.pas        
  {$ENDIF}  
  Classes,
  {$IFDEF FPC}
  Interfaces,
  {$ENDIF}
  Forms,  
  MBTYTools in 'MBTYTools.pas',
  MBTYObjts in 'MBTYObjts.pas',
  uMBTYThread in 'uMBTYThread.pas',
  SpecBlocks in 'SpecBlocks.pas',
  InfoUnit in 'InfoUnit.pas' {MBTYInfoForm},
  MBTYtranslate in 'MBTYtranslate.pas',
  uDebugBlockForm in 'uDebugBlockForm.pas' {DebugBlockForm};

{$R *.res}

//   ,         
{$R mbtybuttons.res}

  //     DllInfo
function  GetEntry:Pointer;
begin
  Result:=@DllInfo;
end;

exports
  GetEntry name 'GetEntry',         //    DllInfo
  CreateObject name 'CreateObject'; //  

{$IFDEF FPC}
initialization
  Application.Initialize;
finalization
  Application.Terminate;
end.
{$ENDIF}
begin
end.

      
      







2 Linux. DLL – . .so , , intel fortran gfortran , , DLL\SO. , FORTRAN:





Windows - INTEL FORTRAN, stdcall:





  TSbros = procedure(
    Nuzl,Nu,Ngran,Nmat,Nko,idmdt0,iadiab0: integer;       // +++ 31.03.2014 (iadiab0)
    var El,Iel,Uzel,Iuzel,
      NYZL,G,Nnas,Nzad,Nelu,
      Gran,Granu,Ngu,Ngut,Propm,Nelm,
      Zadv,Pump,Nzadp;
    Dtau,DtauG,Htau,TauE: TPPRealType;
…………………..
    );stdcall;

      
      







  Linux gfortran cdecl:





   //       GFortran	
  TSbros = procedure(
    var Nuzl,Nu,Ngran,Nmat,Nko,idmdt0,iadiab0: integer;       // +++ 31.03.2014 (iadiab0)
    var El,Iel,Uzel,Iuzel,
      NYZL,G,Nnas,Nzad,Nelu,
      Gran,Granu,Ngu,Ngut,Propm,Nelm,
      Zadv,Pump,Nzadp;
    var Dtau,DtauG,Htau,TauE: TPPRealType;
………………….
    );cdecl;

      
      







, Intel FORTRAN , , gfortran . Intel FORRAN Windows – stdcall, gfortran, Windows Linux – cdecl.





DLL: Intel Fortran Windows , gfortran _  :





{$IFDEF Windows}'wwww'{$ELSE}'wwww_'{$ENDIF}





. gcc. so- :





gcc -shared -fPIC -o ../../bin/libcommonclibs.so -s nn.c prime.c r_keygen.c rc4c.c rsa.c md5c.c -fpack-struct=1 -Wconversion





, , Pascal.





CodeTyphon Studio, , . , .













Delphi





CodeTyphon Studio\ Lazarus





TButton





+





+





Tedit





+





+





TjvComponentPanel





+





+





TactionList





+





+





TjvFormMagnet





+





-





TcontrolBar





+





+





TtoolBar





+





+





TjvOfficeColorPanel





+





- ThexaColorPicker





TcheckBox





+





+





TcomboBox





+





+





TjvListBox





+





- TListBox





TeeChart Pro





+





-





TjvSpinEdit





+





- TspinEdit





TjvFontComboBox





+





- TplFontComboBox





TBCEditor





+





- TsynEdit





TvirtualStringTree





+





+





TPageControl





+





+





TTabControl





+





+





TPanel





+





+





TBitBtn





+





+





TJvButton





+





-          TBitBtn





TScrollBar





+





+





TFrame





+





+





TJvListView





+





-          TListView





TSpeedButton





+





+









+





+





GLScenes





+





+





DSPack





+





-         





Indy





+





+





TPngImage





+





+ TPortableNetworkGraphic









JVCL , . , , Linux , TeeChart Pro, , .





CodeTyphon Studio Windows Linux . git SmartGit, altlinux.





Lazarus\CodeTyphon (pas, dpr include-) UTF8 BOM ! , ! Delphi .









 – (ctpr) .









ctpr-, CodeTyphon Studio xml- . ctpr .





– , . , ctpr-, Code Typhon, , dpr- ( ) – :





  simmm,
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF }
  {$IFDEF FPC}
  Interfaces,
  {$ENDIF}

      
      







:





{$IFDEF FPC}
exports
  GetMemoryManager;  //        SO-
{$ENDIF}

      
      







COM- Excel - -.





«» . – , :





{$IFDEF FPC}
 {$MODE Delphi}{$H+}
{$ELSE}
 {$DEFINE Windows}
{$ENDIF}

      
      







CodeTyphon Studio, .





- uses – Windows Messages:





{$IFDEF FPC} FileUtil,{$ELSE} Windows,{$ENDIF}
      
      







(DataTypes.pas) :





  {$IFDEF FPC}
  PRect = ^TRect;
  {$ENDIF}
TWindowsPointArray = array of {$IFNDEF FPC}Windows.{$ENDIF}TPoint;

      
      







, , Delphi Free Pascal :





Delphi – 1 , FreePascal – 4, , , :





  //   
 SizeOfTColor      = 4;
 SizeOfTPenStyle   = 1;    //SizeOf(TPenStyle);     // FPC  enum 4  !
 SizeOfTBrushStyle = 1;   //SizeOf(TBrushStyle);
SizeOfTDataMode   = 1;  //SizeOf(TDataMode);

      
      







SizeOf !





, Windows:





{$IfDef FPC}
procedure ZeroMemory(const Data: pointer; Size: integer); inline;
begin
  FillChar(Data^,Size,0);
end;
{$EndIf}

      
      







, , Windows - :





{$IfDef fpc}CreateDir(newdir){$else}CreateDirectory(PChar(newdir),nil) and (GetLastError <> ERROR_ALREADY_EXISTS){$endif}
      
      







Windows , .. Lazarus\CodeTyphon – UTF8 , Delphi – UTF16:





{$IFDEF FPC}
procedure   SaveStr(const S:string;Stream:TStream);
  var N,c: cardinal;
      UniString: UnicodeString;
begin
 UniString:=UTF8Decode(S);
 N:=Length(UniString);
 with Stream do begin
   c:=N or $80000000;
   Write(c,SizeOfInt);
   if N > 0 then begin
      Write(Pointer(UniString)^,N*2);
   end;
 end
end;

procedure   LoadStr(var   S:string;Stream:TStream);
  var N: cardinal;
      UniString: UnicodeString;
  procedure DoLoadAsAnsi;
   var tmps: ansistring;
  begin
     //  - ansi
     SetLength(tmps,N);
     if N>0 then Stream.Read(Pointer(tmps)^, N);
     S:=tmps;
  end;
begin
 with Stream do begin
   Read(N,SizeOfInt);
   if (N and $80000000) <> 0 then begin
     //
     N:=N and (not $80000000);
     SetLength(S,N);
     SetLength(UniString,N);
     if N > 0 then begin
        Stream.Read(Pointer(UniString)^, N*2);
        S:=UTF8Encode(UniString);
     end;
   end
   else
     DoLoadAsAnsi;
 end
end;
{$ELSE}
.......
      
      







, - Delphi, , 4- . 1 2- UTF16, 0 – ANSI .





, {$MODE Delphi}.





, :





, :





{$IFDEF FPC}
 {$MODE Delphi}{$H+}
{$ENDIF}

      
      







uses - :





{$IFDEF FPC} LCLType, LCLIntf, LMessages, GraphType,{$ELSE}Windows, Messages,{$ENDIF}
      
      







:





SysUtils, Classes, Graphics, Controls, Forms, Dialogs,





, VCL.  – !





implementation dfm-,   {$R *.dfm} , CodeTyphon frm ( ):





{$IFDEF ENG}
{$IFnDEF FPC}
{$R *.eng.dfm}
{$ELSE}
{$R *.eng.frm}
{$ENDIF}
{$ELSE}
{$IFnDEF FPC}
  {$R *.dfm}
{$ELSE}
  {$R *.frm}
{$ENDIF}
{$ENDIF}

      
      







Delphi (dfm) CodeTyphon (frm). Lazarus\Code Typhon dfm-, ( ).





, – dfm- :









dfm . «» .





frm - , « \ (F12)» frm-. 2 : – - - – frm- « \ (F12)» :









, frm- FormCreate, . , \ \ GTK2 Lazarus\Code Typhon , .





– , :





    cProgressBar: {$IFDEF FPC}TProgressBar{$ELSE}TJvGradientProgressBar{$ENDIF};
    cMsgView:  {$IFDEF FPC}TListBox{$ELSE}TJvListBox{$ENDIF};

      
      







, . – , , , API, :





- LoadLibrary – WinAPI  DynLibs . Windows, – *.dll lib*.so .





SO , /bin PATH, :





fLibHandle:=LoadLibrary({$IFNDEF FPC}PChar{$ENDIF}(ExtractFilePath({$IFDEF FPC} ParamStr(0) {$ELSE} GetModuleName(HInstance) {$ENDIF})+rsalib_name));
      
      







SO\DLL THandle TLibHandle, .. :





Var fLibHandle: TLibHandle; \\  THandle
      
      











- (InitializeCriticalSection, CreateEvent ..) – syncobjs, Free Pascal Delphi ( TCriticalSection TEvent ):





WinAPI









RTL_CRITICAL_SECTION





TCriticalSection





InitializeCriticalSection





TCriticalSection.Create





DeleteCriticalSection





TCriticalSection.Free





EnterCriticalSection





TCriticalSection.Enter





LeaveCriticalSection





TCriticalSection.Leave





hEvent





TEvent





CreateEvent





TEvent.Create





CloseHandle(hEvent)





TEvent.Free





SetEvent





TEvent.SetEvent





ResetEvent





TEvent.ResetEvent





WaitForSingleObjects





TEvent.WaitFor





EnterCriticalSection… TCriticalSection   .. ! LCL, !





- – . Linux system, exec :





uses {$IFDEF Windows} Windows, {$ELSE} LCLType, unix, Baseunix,{$ENDIF} Classes, SysUtils;
………
  //   
function  WinExecAndWait32(const FileName:string; Visibility : integer = 0;
                          TimeOut: cardinal = {$IFDEF Windows}INFINITE{$ELSE}maxLongInt{$ENDIF}):longword; var ss: AnsiString;
begin
  ss := FileName;
  Result:=fpSystem( ss );
end;

function  MyWinExec(const S: string;aShowMode: cardinal):cardinal;
 var ss : ansistring;
begin
  {$IFDEF Windows}
     ss:=S;
     Result:=Windows.WinExec(PAnsiChar(ss),aShowMode);
  {$ELSE}
     //       -      &
     // :      fpSystem     
     //          .
     ss := S + ' &';
     Result:=fpSystem( ss );
  {$ENDIF}
end;

      
      







- Direct2D.





Windows GDI – GDI+ , ( Windows 7) Direct2D API, . . Linux 2 – TCanvas – . 2d- Linux ORCA2d     TD2Canvas   TDirect2Canvas . TD2Canvas  cairo Linux. API-, . , - Free . - 1.





, TPaintBox, Direct2D :





   :





ShemePanel: {$IFDEF FPC}TD2Scene{$ELSE}TPanel{$ENDIF};
PaintBox: {$IFDEF FPC}TD2Image{$ELSE}TPaintBox{$ENDIF};                          // 

      
      







:





    {$IFDEF FPC}
    PaintBox.Bitmap.SetSize(ShemePanel.Width,ShemePanel.Height);
    PaintBox.OnPaint:=DoPaintPB;
    Canvas:=TDirect2DCanvas.Create(PaintBox.Bitmap.Canvas);
    Canvas.FBaseImageObject:=PaintBox;
    {$ELSE}
    Canvas:=TMyD2Canvas.Create(ShemePanel.Handle);
    {$ENDIF}

      
      







, ORCA2D single.





, Linux Direct2D , , TD2Image OnPaint , .. . ShemePanel.Repaint Direct2D .





4: Linux

, , – (.. ).  .. , . . - 2 . . - 2 5. .   - common . - 15 . DLL   try except finally  2 . Linux ( Windows ) , try except threadvar except.inc RTL . - threadvar- SO cthreads. SO . - , threadvar- var  -  . . cthreads  .  cthreads simm .





except.inc RTL Free Pascal:





{$ifdef FPC_HAS_FEATURE_THREADING}
ThreadVar
{$else FPC_HAS_FEATURE_THREADING}
Var
{$endif FPC_HAS_FEATURE_THREADING}
  ExceptAddrStack   : PExceptAddr;
  ExceptObjectStack : PExceptObject;
  ExceptTryLevel    : ObjpasInt;

......

Function fpc_PushExceptAddr (Ft: {$ifdef CPU16}SmallInt{$else}Longint{$endif};_buf,_newaddr : pointer): PJmp_buf ;
  [Public, Alias : 'FPC_PUSHEXCEPTADDR'];compilerproc;
var
  _ExceptAddrstack : ^PExceptAddr;
begin
{$ifdef excdebug}
  writeln ('In PushExceptAddr');
{$endif}
  _ExceptAddrstack:=@ExceptAddrstack;
  PExceptAddr(_newaddr)^.Next:=_ExceptAddrstack^;
  _ExceptAddrStack^:=PExceptAddr(_newaddr);
  PExceptAddr(_newaddr)^.Buf:=PJmp_Buf(_buf);
  PExceptAddr(_newaddr)^.FrameType:=ft;
  result:=PJmp_Buf(_buf);
end;

      
      











, cthreads   threadvar- , , , . - .





5.

, FreePascal – , . - FreeLibrary . , - . fpc_ansistr_decr_ref, . – Delphi Windows . – , . Init, . , , Init TMain.AddMenuItem (TMain , , , . InterfaceUnit.pas).





:





AddMenuItem:function(Parent: Pointer;const Caption:string;OnClick: TNotifyEvent;Tag:NativeInt):Pointer;









DllInfo.Main.AddMenuItem(DllInfo.Main.Menu,txtTppTools,nil,0);





txtTppTools –





AddMenuItem Caption Caption TMenuItem. – !





:





FreePascal   – .. - = - 1 , - - 1. shared object . – , (.. ). string - PChar. PChar , .. , , .





, PChar :





AddMenuItem:function(Parent: Pointer;Caption:PChar;OnClick: TNotifyEvent;Tag:NativeInt):Pointer;







InsertMenuItem:function(Parent: Pointer;Caption:PChar;OnClick: TNotifyEvent;Tag,AIndex:integer):Pointer;







InsertMenuItem:function(Parent: Pointer;Caption:PChar;OnClick: TNotifyEvent;Tag,AIndex:integer):Pointer;







SetAlias: function(aAlias,aAliasValue: PChar;fReplace: boolean):boolean;







:





SetComponentName:  procedure(aComponentPtr: Pointer;aName: PChar);







TComponent(aComponentPtr).Name := aName





const … : string PChar .





6. Linux LCL

LCL VCL, .





TTabControl LCL , TTabControl.Tabs.Objects LCL VCL ! Objects Tabs TTabControl   LCL ! , FPC Delphi :





         {$IFDEF FPC}
         TCComps.Tabs.Add( TranslationEngine.TranslateWordFunc(  MainLibrary.Tabs[i], TID_PANELBUTTONS) );
         TShowedTabList.Add(Tab);
         {$ELSE}
         TCComps.Tabs.AddObject( TranslationEngine.TranslateWordFunc(MainLibrary.Tabs[i],TID_PANELBUTTONS ),Tab);
         {$ENDIF}

      
      



TControlBar TToolBar – frm-. TControlBar GTK2 .





( ) :





        {$IFDEF FPC}
        ActiveEditor.DefRect:=ActiveEditor.BoundsRect;
        ActiveEditor.PaintTimer.Enabled:=False;
        {$ENDIF}

        ActiveEditor.BorderStyle:=bsNone;

        {$IFDEF FPC}
        RecreateWnd(ActiveEditor);   //        
        {$ENDIF}

      
      







LCL ( bsSizeable bsNone), frm- , . override CreateParams :





procedure TEditForm.CreateParams(var Params :TCreateParams);
begin
  //          ,       !
  if global_projects_window_no_border then begin
     {$IFDEF FPC}
     FFormBorderStyle:=bsNone;
     {$ELSE}
     //    FBorderStyle   RecreateWindow    
     TFormBorderStyle((@BorderStyle)^):=bsNone;
     {$ENDIF}
  end;

      
      







\ , .. .





  {$IFDEF FPC}
  // Linux   , ..     
  PostMessage(Handle,WM_PaintSheme,0,0) ;
  {$ELSE}
  RepaintFormAll;    //   , ..      !!!
  {$ENDIF}

      
      







SO (DLL) , , – Action:=caFree ! OnClose Free – .





procedure TDebugBlockForm.FormClose(Sender: TObject; var Action: TCloseAction);
 var i: integer;
begin

  if aBlockPtr <> nil then begin
    StopShowData;
    TMBTYBlock(aBlockPtr).fBlockDebugForm:=nil;
    for I := 0 to Length(aInputsDataList) - 1 do
      aInputsDataList[i].fReplaceArray.Free;
    for I := 0 to Length(aOutputsDataList) - 1 do
      aOutputsDataList[i].fReplaceArray.Free;
  end;

  {$IFDEF FPC}
  Free;
  {$ELSE}
  Action:=caFree;
  {$ENDIF}
end;

      
      







7. Linux?

(2- 3- ). , . Delphi  Windows TeeChart Pro Steema software , . 100 Windows 2017 .   .





Linux Lazarus , . -  TAChart, . IFDEF- , TChart- Delphi ( ).





TeeChart Pro :





:





! ! - LCL - !





,   Code Typhon:





-          Source .pas, .lpr, .lfm UTF8+BOM Linux.





-          .lfm  .frm  CodeTyphon .





-          teechart.lpk teechart.ctpkg  





-          lfm- IFDEF:





Windows- Code Typhon. !





, , .





Linux – usr\local\codetyphon\typhon\components  my_TeeChartPro.





  teechart.ctpkg  teechartlinux.ctpkg.  «». . ,   ,   OpenGLLinux :





, ( OpenGL ). . .. OpenGL .





TeCanvas.pas , Windows:





.





. IFDEF- Linux TeeChart Pro Linux .





, ☹ . FPC , .





, :





IsWindowsNT True . Linux Windows, 2- :





1.       .





2.       , .





, Linux. ,   TeCanvas.pas ( ).





TeeChart Pro LCL , . .





1.       Delphi Linux . . Excel COM- COM- .





2.       , , . , .





3.       Java ( C++) - . , 3. , , .. , Windows-.





4.       Code Typhon , Delphi. Lazarus .





5.       Code Typhon\Lazarus , , Delphi . 90 % . Delphi Windows , .





6.       , UTF8+BOM.





7.       VCL LCL, FMX, .





8.       Delphi , .. Win32 , Linux . Free Pascal Linux, FORTRAN – RTL .





:





Fragment d'un modèle dynamique d'une centrale à turbine à gaz sous Alt Linux 9
Alt Linux 9
Fragment d'un modèle de circuit de refroidissement intermédiaire d'une centrale nucléaire avec un réacteur de type VVER sous Astra Linux Orel
Astra Linux Orel








All Articles