Delphi Samples with Sources

  • Автор темы emailx45
  • 658
  • Обновлено
  • 09, Mar 2019
  • #2
Webinar by Marcu Cantu, about High DPI crossing 2 display with distinct resolution 2 display with same app (High res 4K and Low res Windows default) on XE10.3 RIO



 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 09, Mar 2019
  • #6
Firemonkey: How to crop a photo in Delphi (Video lessons) - in PortugueseBR
Easy method and didatic for crop a image, for example, to create your "profile photo" in your app Mobile or Windows.You can change to VCL!


NOTE: You can change the subtitles for your language (google option for all languages)

One feature that leaves your mobile app with a more professional face is to allow your user to change his or her profile picture. But do not just send the new photo to replace the old image. Ideally, it can resize and crop the photo the way you want.

This feature is used in applications such as Facebook and Twitter, and allows a very nice customization of the photos!





 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 09, Mar 2019
  • #7
SHA Hash with C++Builder and Delphi Posted by Jim McKeeth

, 11 MAY 2018 (Embarcadero MVP)


I've always been fascinated by encryption & compression, but my favorite is probably the cryptographic hash function

. A hash function is a one-way algorithm that takes an input of any size and always produces the same size output.

It is one-way in that there is information loss -- you can't easily go from the output to the input again.

The cryptographic hash is a more secure version of the hash function.

It is most often used in signing to validate that data hasn't been modified.
Per Wikipedia

, the ideal cryptographic hash function has five main properties:

  • it is deterministic

    so the same message always results in the same hash
  • it is quick to compute the hash value for any given message
  • it is infeasible

    to generate a message from its hash value except by trying all possible messages
  • a small change to a message should change the hash value so extensively that the new hash value appears uncorrelated with the old hash value
  • it is infeasible

    to find two different messages with the same hash value




The Message Digest family of cryptographic hashes used to be the main players in the area, but they were found to be insecure. Now SHA family rules as the main workhorse of modern cryptography.

The basis of hash support first appeared in the RTL around the 2009 release but in XE8

(2015) we got the System.Hash

unit, which brought the MD5, SHA-1, and Bob Jenkins hashes. Then in 10.0 Seattle

(2015) it was expanded with SHA-2

support. Most recently in 10.2 Tokyo

(2017) the hash functions were expanded to accept either a string or stream in addition to the original bytes input.

The SHA Family includes SHA-0, SHA-1, SHA-2, & SHA-3 family of hashes.

SHA-0 is obsolete, and SHA-3 is an improvement on SHA-2. In practice I see most hashes using either SHA-1 or SHA-2. SHA-1 always produces a 160-bit (20-byte) hash (digest), while SHA-2 includes 224, 256, 384, and 512-bit outputs, making it both more secure and more flexible.

SHA 256 & 512 represent 32 and 64-bit word size hash algorithms.

The 224, 256, & 384 size digests are truncated versions of the 256 & 512 algorithms.

So how do you use it in C++Builder and Delphi? I'm glad you asked.

Once you have included the System.Hash unit then you can use the methods of the THashSHA2 class to create the digest.

I'll show you how to use GetHashString, but know there are other variations you can use too.

The GetHashString takes either a string or a stream and returns a hexadecimal string of the hash.

In C++Builder your code would look like:
 
Edit512->Text = THashSHA2::GetHashString(

EditMessage->Text,

THashSHA2::TSHA2Version::SHA512);

and in Delphi your code would look like:
 
Edit512.Text := THashSHA2.GetHashString(

EditMessage.Text,

THashSHA2.TSHA2Version.SHA512).ToUpper;

I made a little sample app that generates all the different hashes from the text you provide. It is a FireMonkey app, so will work on all the platforms, but the hash code will work in any type of app. There are both C++ and Delphi versions included.






 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 09, Mar 2019
  • #8
3D Credits Scroll with Delphi (A little fun with Delphi for today’s Star Wars day!) by Jim McKeeth, 04/May/2018

A little fun with Delphi for today’s Star Wars day!

This is a pretty simple 3D form with a 3D layout at an angle, and then a 2D layout with text and images is animated up the 3D layout. The only code is populating the labels as the animation kicks off automatically.

change the message to share with your friends. It is FireMonkey, and while I only tested it on Windows, it should work on Android, iOS, macOS, and even Linux if you are running FMX Linux

.

May the Fourth be with You!







 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 16, May 2019
  • #10
Did you know is possible use VCL and FMX (FireMonkey) togheter in your app?


Here my test about use of "VCL" and "FMX" objects togheter, to create one app to MS Windows!

Many want to use DLLs written in C / C ++ or another language along with their project in RAD Studio (Delphi or CBuilder), but they forget or do not know that a BPL is actually a binary library, such as a DLL, with due exceptions and differences in your call.

However, since a BPL is actually a binary Delphi / CBuilder code container, then this means you can create your own repository of objects (classes) and codes to use in your projects, in order to re-use their codes. (Remember one of the pillars of object-oriented language - Inheritance)

To use one framework within the other, in the case it may be: VCL within FMX, or FMX within VCL - you have to take a few basic steps.

You must create the objects that will be used by the other framework with a package (BPL / DCP), as RAD Studio does.
In your application project, VCL or FMX, you must inform that you will use a custom "RUNTIME PACKAGE", which is your newly created package.
Add the DCP file - not BPL file ok!
IT's NOT NECESSARY INSTALL THE PACKAGE IN YOUR IDE, JUST HAVE IT TO USE!
By default, RAD Studio saves the BPL and DCP files in your "Documents Public \ Embarcadero \ .... DCP and BPL sub-folders" - if you want, you can "copy it" for you project folder or any other place!
Just DONT FORGET where is it, ok!
After that, you simply inform in your application project, in the "USES" clause, which unit you intend to use, and which is inside your "package" that you created before.
Then you can use the objects and classes as you normally do when using the RAD Studio default packages.


 

My project VCL that will use my TForm FMX (FireMonkey)

-------------------------------------------------------------------------------

unit uVCLFormMain;

interface

uses

Winapi.Windows,

Winapi.Messages,

System.SysUtils,

System.Variants,

System.Classes,

Vcl.Graphics,

Vcl.Controls,

Vcl.Forms,

Vcl.Dialogs,

Vcl.StdCtrls,

Vcl.Menus,

//

uFMXForm_inVCLproject // in my package with my objects FMX

//

;

type

TVCLFormMain = class(TForm)

Label1: TLabel;

MainMenu1: TMainMenu;

Files1: TMenuItem;

About1: TMenuItem;

CallFMXform1: TMenuItem;

N1: TMenuItem;

Exit1: TMenuItem;

procedure CallFMXform1Click(Sender: TObject);

procedure Exit1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

VCLFormMain: TVCLFormMain;

implementation

{$R *.dfm}

procedure TVCLFormMain.CallFMXform1Click(Sender: TObject);

var

lFMXForm_inVCLprj: TfrmFMXForm_inVCLproject;

begin

lFMXForm_inVCLprj := TfrmFMXForm_inVCLproject.Create(nil);

try

lFMXForm_inVCLprj.ShowModal;

finally

Self.SetFocus;

//

lFMXForm_inVCLprj.DisposeOf;

lFMXForm_inVCLprj := nil;

end;

end;

procedure TVCLFormMain.Exit1Click(Sender: TObject);

begin

Close;

end;

end.

my TForm FireMonkey (FMX) used in my VCL project

-------------------------------------------------------------------------------

unit uFMXForm_inVCLproject;

interface

uses

System.SysUtils,

System.Types,

System.UITypes,

System.Classes,

System.Variants,

FMX.Types,

FMX.Controls,

FMX.Forms,

FMX.Graphics,

FMX.Dialogs,

FMX.Layouts,

FMX.StdCtrls,

FMX.Controls.Presentation;

type

TfrmFMXForm_inVCLproject = class(TForm)

AniIndicator1: TAniIndicator;

Layout1: TLayout;

Label1: TLabel;

StyleBook1: TStyleBook;

ToolBar1: TToolBar;

sbtnClickMe: TSpeedButton;

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormCreate(Sender: TObject);

procedure sbtnClickMeClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmFMXForm_inVCLproject: TfrmFMXForm_inVCLproject;

implementation

{$R *.fmx}

procedure TfrmFMXForm_inVCLproject.FormClose(Sender: TObject; var Action: TCloseAction);

begin

AniIndicator1.Enabled := False;

end;

procedure TfrmFMXForm_inVCLproject.FormCreate(Sender: TObject);

begin

Position := TFormPosition.ScreenCenter;

end;

procedure TfrmFMXForm_inVCLproject.FormShow(Sender: TObject);

begin

AniIndicator1.Enabled := False;

AniIndicator1.Enabled := True;

end;

procedure TfrmFMXForm_inVCLproject.sbtnClickMeClick(Sender: TObject);

begin

ShowMessage('Hello FMX project');

end;

end.

my project FireMonkey (FMX) that will use my TForm VCL

-------------------------------------------------------------------------------

unit uFMXFormMain;

interface

uses

System.SysUtils,

System.Types,

System.UITypes,

System.Classes,

System.Variants,

FMX.Types,

FMX.Controls,

FMX.Forms,

FMX.Graphics,

FMX.Dialogs,

FMX.Controls.Presentation,

FMX.StdCtrls,

FMX.Layouts,

//

uVCLForm_inFMXproject // in my package with my objects VCL

//

;

type

TFMXFormMain = class(TForm)

Layout1: TLayout;

ToolBar1: TToolBar;

sbtnCallVCLForm: TSpeedButton;

sbtnCloseApp: TSpeedButton;

Label1: TLabel;

StyleBook1: TStyleBook;

procedure FormCreate(Sender: TObject);

procedure sbtnCallVCLFormClick(Sender: TObject);

procedure sbtnCloseAppClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FMXFormMain: TFMXFormMain;

implementation

{$R *.fmx}

procedure TFMXFormMain.FormCreate(Sender: TObject);

begin

Position := TFormPosition.ScreenCenter;

end;

procedure TFMXFormMain.sbtnCallVCLFormClick(Sender: TObject);

var

lVCLForm_inFMXprj: TfrmVCLForm_inFMXproject; // my TForm VCL

begin

lVCLForm_inFMXprj := TfrmVCLForm_inFMXproject.Create(nil);

try

lVCLForm_inFMXprj.ShowModal;

finally

Self.Active := True;

//

lVCLForm_inFMXprj.DisposeOf;

lVCLForm_inFMXprj := nil;

end;

end;

procedure TFMXFormMain.sbtnCloseAppClick(Sender: TObject);

begin

Close;

end;

end.

-------------------------------------------------------------------------------

my TForm VCL used in my project FireMonkey (FMX)

-------------------------------------------------------------------------------

unit uVCLForm_inFMXproject;

interface

uses

Winapi.Windows,

Winapi.Messages,

System.SysUtils,

System.Variants,

System.Classes,

Vcl.Graphics,

Vcl.Controls,

Vcl.Forms,

Vcl.Dialogs,

Vcl.StdCtrls,

Vcl.ExtCtrls,

Vcl.ComCtrls,

Vcl.ToolWin,

Vcl.Menus,

System.ImageList,

Vcl.ImgList,

System.Actions,

Vcl.ActnList,

Vcl.StdActns,

Vcl.Themes;

type

TfrmVCLForm_inFMXproject = class(TForm)

Label1: TLabel;

Panel1: TPanel;

Animate1: TAnimate;

ToolBar1: TToolBar;

Button1: TButton;

Button2: TButton;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

ComboBox1: TComboBox;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmVCLForm_inFMXproject: TfrmVCLForm_inFMXproject;

implementation

{$R *.dfm}

const

lPathStyles = 'C:\Users\Public\Documents\Embarcadero\Studio\20.0\Styles';

procedure TfrmVCLForm_inFMXproject.Button1Click(Sender: TObject);

begin

ShowMessage('Hello VCL project');

end;

procedure TfrmVCLForm_inFMXproject.Button2Click(Sender: TObject);

begin

Close;

end;

procedure TfrmVCLForm_inFMXproject.ComboBox1Change(Sender: TObject);

begin

if (ComboBox1.Items.Count > 0) then

TStyleManager.SetStyle(ComboBox1.Text);

end;

procedure TfrmVCLForm_inFMXproject.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Animate1.Active := False;

end;

procedure TfrmVCLForm_inFMXproject.FormCreate(Sender: TObject);

var

lStyleName: string;

begin

Position := TPosition.poScreenCenter;

//

for lStyleName in TStyleManager.StyleNames do

ComboBox1.Items.Add(lStyleName);

//

if (ComboBox1.Items.Count > 0) then

ComboBox1.ItemIndex := 0;

end;

procedure TfrmVCLForm_inFMXproject.FormShow(Sender: TObject);

begin

Animate1.Active := False;

Animate1.Active := True;

end;

initialization

finalization

end.






Скрытая информация :: Авторизуйтесь для просмотра »





 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 11, Oct 2019
  • #18

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 12, Feb 2020
  • #23

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 20, Mar 2020
  • #25
Here my sample to works with Class Helper to Strings to divide it in "before" and "after" Delimiter char! - very easy!



 

unit uMainForm;

interface

uses

Winapi.Windows,

Winapi.Messages,

System.SysUtils,

System.Variants,

System.Classes,

Vcl.Graphics,

Vcl.Controls,

Vcl.Forms,

Vcl.Dialogs,

Vcl.StdCtrls;

type

TForm1 = class(TForm)

btnUsinSPLIT_function: TButton;

ListBox1: TListBox;

btnUsingListBox: TButton;

ListBox2: TListBox;

Memo1: TMemo;

btnMyNewSplitStrings: TButton;

procedure btnUsinSPLIT_functionClick(Sender: TObject);

procedure btnUsingListBoxClick(Sender: TObject);

procedure btnMyNewSplitStringsClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnUsinSPLIT_functionClick(Sender: TObject);

var

lMyArraySpplited: TArray<string>;

lMyRegKey : string;

lNewRegKey : string;

i : Integer;

lLastDelimiter : integer;

begin

memo1.Lines.Clear;

//

// if lMyRegKey = '' or '\' -> it's necessary verify too!

// But DONT problem if lLastDelimiter <= 0

// on the end, your "string" resulted can be EMPTY!

// None exception will be raised!

//

lMyRegKey := 'part1\part2\part3\value';

//

lMyArraySpplited := lMyRegKey.Split(['\']);

//

lLastDelimiter := lMyRegKey.LastDelimiter('\') + 1; // +1 here or below (Rigth substring)

//

memo1.Lines.Add('SubString Left = ' + lMyRegKey.Substring(-lLastDelimiter, lLastDelimiter));

memo1.Lines.Add('SubString Right = ' + lMyRegKey.Substring(lLastDelimiter));

//

memo1.Lines.Add('LastDelimiter = ' + lMyRegKey.LastDelimiter('\').ToString);

//

memo1.Lines.Add('');

//

lNewRegKey := lMyRegKey.Join('\', lMyArraySpplited, 0, 2); // "part1\part2"

//

memo1.Lines.Add('Join 0 to 2 = ' + lNewRegKey);

//

lNewRegKey := lMyRegKey.Join('\', lMyArraySpplited, 3, 4); // "value"

//

memo1.Lines.Add('Join 3 to 4 = ' + lNewRegKey);

//

memo1.Lines.Add('');

//

for i := 0 to high(lMyArraySpplited) do

begin

if lMyArraySpplited[i] <> '' then

memo1.Lines.Add(lMyArraySpplited[i]);

end;

end;

procedure TForm1.btnMyNewSplitStringsClick(Sender: TObject);

var

lMyRegKey : string;

lMyArraySpplited: TArray<string>;

begin

Memo1.Lines.Clear;

//

lMyRegKey := 'part1\part2\part3\value';

//

// start from "1" and ending on "3" chars!

// using "\" like my "Delimiter" to split my string!

//

lMyArraySpplited := lMyRegKey.Split(['\'], '1', '3', Length(lMyRegKey));

//

Memo1.Lines.Add('How many items SPLITTED = ' + Length(lMyArraySpplited).ToString);

Memo1.Lines.Add('');

Memo1.Lines.Add('my items:');

//

Memo1.Lines.AddStrings(lMyArraySpplited); // working with my items splitted (my array)

end;

procedure TForm1.btnUsingListBoxClick(Sender: TObject);

var

lMyRegKey: string;

begin

lMyRegKey := 'part1\part2\part3\value';

//

ListBox1.Items.Delimiter := '\';

ListBox1.Items.DelimitedText := lMyRegKey;

//

ListBox2.Items.Clear;

ListBox2.Items.Add(ListBox1.Items[3]);

//

// another ways can help too, when using a "List"

//

// ListBox1.Items.IndexOf('first position to start')

// ListBox1.Items.IndexOf('last position to end')

// ShowMessage(ListBox1.Items.KeyNames[2]);

end;

end.






 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 03, Apr 2020
  • #31
Quick Tip: Fixing “Could not convert variant of type (Null) into type…” thansk to CodeSmithing ...I often use the XML Data Binding wizard in Delphi.

However, it doesn’t seem to have been given a lot of attention from Borland/Inprise/Borland/CodeGear/Embarcadero/Idera.

And unfortunately, out of the box what it generates is often error prone, apparently not supporting optional elements/attributes.
 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 11, Apr 2020
  • #34
GeekAlarm!




GeekAlarm! is a unique way for you to keep track of when you should take a break while using your computer.

By taking breaks you can increase your productivity, reduce eye strain, and allay fatigue.

GeekAlarm! has varying degrees of break enforcement including passive, medium, and aggressive enforcement.

This helpful utility is a must have for anyone that uses a computer for long periods of time.
 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 19, Apr 2020
  • #36
Mobile GFX - Creating Icons and Launchers for Delphi Mobile Applications by TGrubb

If you have ever tried to create the icons, spotlights, settings and launchers for Delphi Android and iOS applications, you have quickly realized that the process is fairly ridiculous.



There are 2 different platforms (iOS and Android), 3 different device types (iPhone, iPad, Android), and 7 different ratios (1:1, 1.33:1, etc) of icon/launcher graphic sizes all combining to require a whopping total of 28 different png files to be created (See Figure 1). Talk about taking the Rapid out of Rapid Application Development!









After doing this once, I realized that I never want to do that again. For my own sanity and yours, I have created a small little utility for quickly creating these 30 different png files and for helping fill in the Application Options page.
The utility works by allowing you to specify base image(s) for each graphic ratio, optionally defining what portion of the image to extract for each ratio, and then generating the png files.

You have the option of creating iPhone, iPad, and/or Android files.

In addition, the utility will even make the .optset files which Delphi uses to fill in the blanks (Click Apply… for each configuration and select the .optset file).
To use the Mobile Gfx Setup tool:
First, set up your images on the Graphics Tab







  • For each image ratio, enter or browse to an image file
  • Select the part of the image to be used for the format (shown in red)
  • Move the image selection around by Ctrl Dragging the red rectangle


Next, set up the output options from the Setup tab







  • Enter a base filename for the generated images. The tool will append the Width and Height of an image to this filename (e.g., ‘c:\junk.png’ becomes ‘c:\junk114x114.png’
  • Select which devices you want to generate images for
  • Finally, check the ‘Generate .optset file(s)’ checkbox if you want the .optset file generated which you can then later import into Delphi


Finally, generate your images from the Generate tab







  • When you go to the Generate tab, the tool will verify you have entered everything correctly
  • If validation has passed, click the Generate button to generate the images and, optionally, the .optset files (which will be called basename.android.optset and basename.ios.optset)


Finished!
If you generated the .optset file, do the following steps:

  • Load your Delphi project
  • Select Project->Options to show the project options (See Figure 1)
  • Click Application on the left to show application options
  • Change the Target configuration
  • Click the Apply… button
  • Browse to the .optset file
  • Modify the configuration and click OK!


 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 20, Apr 2020
  • #37
Single File Data Storage (storing data-file in zip file like in SQLite way) by coyoteelabs

Hi all, I've updated the library Single File Data Storage to work with all Delphi versions

About the library:

  • The Single File Data Storage library provides an efficient solution for an application to store many different types of data inside one file
  • able to access this data very fast and easily, without bothering about creating temporary files or streams (when requesting to read, the compressed data is decompressed on the fly directly from the source stream).


Look at the samples and in the help file to see how easy it is to use SFDS.

Features:

  • Single-file Virtual File System (read-only): SFDS files are ZIP like archive files (not really ZIP files) with enhanced functionality (see below). One or more SFDS files can be "mounted" in the application.

    Searching or requesting to open a stream for read will query all "mounted" files or you can just specify a single one.
  • Transparent streaming compression/decompression with full TStream compatibility.
  • Thread-safe (When reading from files): Read from multiple streams (located in the same SFDS file archive) at the same time (Just create a new clone of the stream in each thread - see demo).
  • High performance: SFDS is perfect for Games(and other applications such as backup, etc) which need to store many (usually small) files in just a small number of (big) archives.

    Storing data in a small number of SFDS files results in faster access time to data (When opening a SFDS file the list of streams inside is cached in memory), and also makes it harder to modify files inside.
  • Large file support (64-bit size) lets you store all the data you need in SFDS files of virtually unlimited size.
  • Supported compression types: none (stored), zlib, bzip2. New formats can easily be added.
  • Compression support is modular. Each application can chose to add only the compression it needs (if you need zlib compression/decompression simply add sfds_compressorzlib to the uses clause somewhere inside your project; add sfds_compressorbzip2 for BZip2).
  • Per stream compression option; store one stream uncompressed, another compressed with zlib, another with bzip2, etc.
  • No DLLs required.
  • No file name restrictions (including unicode file names allowed - strings are stored UTF-8 encoded, just like in .dfm files). If the file name is an empty string, then you can still access the data via file index.
  • Reading from compressed streams is just like reading from any other stream (even full seeking in any direction is allowed).
  • You can create links to streams inside SFDS files (the new entries will point to the same data).
  • Includes a list of opened reader objects, which are automatically destroyed if you forget about them (you only need to free the streams you open).
  • It has lots of routines for adding/extracting, testing (MD5 error checking) files to/from the SFDS file format.
  • It also has search routines, to easily find files inside SFDS archives (SFDS_FindFirst, SFDS_FindNext, SFDS_FindClose).
  • Supports metadata information: you can set any fields: string, number, date, boolean, binary (Metadata Editor Form included).
  • You can write/read SFDS files directly to/from any data source.

    Already implemented: Disk File [R/W], Memory Stream [R/W], Resource Stream [R]. Make a descendent of TSFDSCustomReader to read from any other custom source and a descendent of TSFDSCustomWriter to write to any other custom source.

    Once written, a SFDS file cannot have more data appended to it.
  • There are no components to install, so this library also works with the free Turbo Delphi.
  • Best of all: it's completely free (Even for commercial use).


I've made 2 versions:

  • 1st version (version 1.4.2) simply updates the library to work with the newest Delphi versions. Should still be compatible with sfds files created with original version but doesn't have unicode support. Use this one if you need to use files created in versions 1.4.1 or older.
  • 2nd version (version 1.5.0) also updates the library to support unicode (now uses string instead of ansistring). This version won't work with sfds files created with older versions (1.4.1 or older). Note that I only updated the demo .sfds files for the "Basic SFDS File Creator" demo only


 

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 20, Apr 2020
  • #40

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343
  • 30, Apr 2020
  • #41

emailx45


Рег
05 May, 2008

Тем
607

Постов
1273

Баллов
7343