Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/windows/src/**/*.identcache
/windows/src/**/*.vcxproj.user
/windows/src/**/version.res
/windows/src/**/version*.res
/windows/src/**/*.pch
/windows/src/**/*.wixobj
/windows/src/**/*.sbr
Expand Down
14 changes: 7 additions & 7 deletions common/windows/delphi/components/FixedTrackbar.pas
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,16 @@ procedure TTntFixedDrawGrid.WMEraseBkgnd(var Message: TMessage);

Tested on VER320 (10.2)
Tested on VER330 (10.3) - 29 Oct 2019 - mcdurdin
TODO: Not yet fully verified against Vcl.Grids.pas in VER350 (11) or VER360 (12)
}

{$IFNDEF VER340}
{$MESSAGE WARN 'Not yet checked against Delphi 10.4'}
{$IFNDEF VER330}
{$IFNDEF VER320}
{$IF Defined(VER340) or Defined(VER350) or Defined(VER360)}
{$MESSAGE WARN 'TODO: Trackbar scrolling on bottom cell not yet checked against Delphi 10.4, 11.0 or 12.0'}
{$ELSEIF Defined(VER320) or Defined(VER330)}
// Tested on Delphi 10.2 (VER320) and 10.3 (VER330)
{$ELSE}
{$MESSAGE ERROR 'Check that this fix is still applicable for a new version of Delphi. Checked against Delphi 10.2, 10.3' }
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$IFEND}

procedure TTntFixedDrawGrid.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Expand Down
4 changes: 2 additions & 2 deletions common/windows/delphi/general/CleartypeDrawCharacter.pas
Original file line number Diff line number Diff line change
Expand Up @@ -591,11 +591,11 @@ function TestFont(FFontName: string): Boolean;
StrPCopy(lf.lfFaceName, FFontName); //'Code2000');
hdc := GetDC(0);
//FPlane0FontName := 'Code2000';
{$IFDEF VER340}
{$IF Defined(VER340) or Defined(VER350) or Defined(VER360)}
if EnumFontFamiliesEx(hdc, lf, @EnumFallbackFonts, 0, 0) <> 0 then
{$ELSE}
if EnumFontFamiliesEx(hdc, lf, @EnumFallbackFonts, 0, 0) then
{$ENDIF}
{$IFEND}
begin
FPlane0FontName := FFontName;
Result := True;
Expand Down
4 changes: 4 additions & 0 deletions common/windows/delphi/general/JsonUtil.pas
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ function JSONToString(obj: TJSONAncestor; ReplaceSlashes: Boolean = False): stri
begin
builder := TStringBuilder.Create;
try
{$IF Defined(VER350) or Defined(VER360)}
obj.ToChars(builder, []);
{$ELSE}
obj.ToChars(builder);
{$IFEND}
Result := builder.ToString;
finally
builder.Free;
Expand Down
23 changes: 15 additions & 8 deletions common/windows/delphi/tools/devtools/DevIncludePaths.pas
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ class function TIncludePaths.AddPathToProjectXML(const ProjectXMLFileName, Path:
doc: IXMLDocument;
sn, node: IXMLNode;
IncludePath: string;
Condition: string;
I: Integer;
begin
if not FileExists(ProjectXMLFileName) then
Expand All @@ -159,16 +160,20 @@ class function TIncludePaths.AddPathToProjectXML(const ProjectXMLFileName, Path:
for I := 0 to node.ChildNodes.Count - 1 do
begin
sn := node.ChildNodes[I];
// Delphi 12 EnvOptions.proj emits an empty <PropertyGroup/> without a
// Condition attribute; convert defensively via VarToStrDef so a Null or
// Empty variant returns '' instead of raising EVariantTypeCastError in Pos().
Condition := VarToStrDef(sn.Attributes['Condition'], '');
if (sn.NodeName = 'PropertyGroup') and
not VarIsNull(sn.Attributes['Condition']) and
((Pos('Win32', sn.Attributes['Condition']) > 0) or
(Pos('Win64', sn.Attributes['Condition']) > 0)) then
((Pos('''Win32''', Condition) > 0) or (Pos('''Win64''', Condition) > 0)) then
begin
IncludePath := sn.ChildNodes['DelphiBrowsingPath'].NodeValue;
// Guard against empty child nodes (e.g. <DelphiBrowsingPath/>) whose
// NodeValue is Null on Delphi 12 and can't coerce to a string directly.
IncludePath := VarToStrDef(sn.ChildNodes['DelphiBrowsingPath'].NodeValue, '');
if AddPathToIncludePath(IncludePath, Path) then
sn.ChildNodes['DelphiBrowsingPath'].nodeValue := IncludePath;

IncludePath := sn.ChildNodes['DelphiLibraryPath'].NodeValue;
IncludePath := VarToStrDef(sn.ChildNodes['DelphiLibraryPath'].NodeValue, '');
if AddPathToIncludePath(IncludePath, Path) then
sn.ChildNodes['DelphiLibraryPath'].nodeValue := IncludePath;
end;
Expand Down Expand Up @@ -256,6 +261,7 @@ class function TIncludePaths.Reset: Boolean;
doc: IXMLDocument;
node: IXMLNode;
ProjectFileName: string;
Condition: string;
I: Integer;
sn: IXMLNode;
begin
Expand Down Expand Up @@ -296,10 +302,11 @@ class function TIncludePaths.Reset: Boolean;
for I := 0 to node.ChildNodes.Count - 1 do
begin
sn := node.ChildNodes[I];
// See AddPathToProjectXML: guard against Delphi 12's empty
// <PropertyGroup/> where Attributes['Condition'] returns a Null variant.
Condition := VarToStrDef(sn.Attributes['Condition'], '');
if (sn.NodeName = 'PropertyGroup') and
not VarIsNull(sn.Attributes['Condition']) and
((Pos('Win32', sn.Attributes['Condition']) > 0) or
(Pos('Win64', sn.Attributes['Condition']) > 0)) then
((Pos('''Win32''', Condition) > 0) or (Pos('''Win64''', Condition) > 0)) then
begin
sn.ChildNodes['DelphiBrowsingPath'].NodeValue := SDefault_DelphiBrowsingPath;
sn.ChildNodes['DelphiLibraryPath'].NodeValue := SDefault_DelphiSearchPath;
Expand Down
8 changes: 8 additions & 0 deletions common/windows/delphi/tools/devtools/SourceRootPath.pas
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,19 @@ interface
{$IFDEF VER340}
const DelphiMajorVersion = '21.0';
{$ELSE}
{$IFDEF VER350}
const DelphiMajorVersion = '22.0';
{$ELSE}
{$IFDEF VER360}
const DelphiMajorVersion = '23.0';
{$ELSE}
ERROR: must define Delphi version
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}

const DelphiBasePath = 'C:\Program Files (x86)\Embarcadero\Studio\' + DelphiMajorVersion + '\';

Expand Down
13 changes: 9 additions & 4 deletions common/windows/delphi/web/Keyman.System.HttpServer.Base.pas
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,15 @@ function CrackUTF8ZeroExtendedString(CommandType: THTTPCommandType; const p: str
end;

// Indy's UTF8 handling of URLs is *completely* broken.
// We may need to check this with updated versions of Delphi
{$IFNDEF VER330}
ERROR! Check if this is still needed with Delphi update
{$ENDIF}
// We may need to check this with updated versions of Delphi.
// VER340/VER350/VER360 (10.4/11/12): unblocked but not re-verified; workaround kept.
{$IF Defined(VER340) or Defined(VER350) or Defined(VER360)}
{$MESSAGE WARN 'TODO: Check if Indy URL UTF-8 handling is still needed with Delphi 10.4/11.0/12.0'}
{$ELSEIF Defined(VER330)}
// Verified against Delphi 10.3 (VER330)
{$ELSE}
{$MESSAGE ERROR 'Check if Indy URL UTF-8 handling is still needed with Delphi update'}
{$IFEND}

SetLength(s, p.Length);
for i := 1 to p.Length do
Expand Down
5 changes: 4 additions & 1 deletion developer/src/ext/jedi/jcl/jcl/source/common/JclSynch.pas
Original file line number Diff line number Diff line change
Expand Up @@ -1075,7 +1075,10 @@ constructor TJclMutex.Create(SecAttr: PSecurityAttributes; InitialOwner: Boolean
begin
inherited Create;
FName := Name;
FHandle := JclWin32.CreateMutex(SecAttr, InitialOwner, PChar(Name));
// Keyman patch (D12, source-compiled JCL): JclWin32.CreateMutex is an external
// decl with a BOOL param; D12 rejects Boolean->BOOL there (E2010). Route via the
// RTL like OpenMutex below. Only bites when JCL is built from source.
FHandle := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}Windows.CreateMutex(SecAttr, BOOL(InitialOwner), PChar(Name));
if FHandle = 0 then
raise EJclMutexError.CreateRes(@RsSynchCreateMutex);
FExisted := GetLastError = ERROR_ALREADY_EXISTS;
Expand Down
2 changes: 2 additions & 0 deletions developer/src/ext/jedi/jvcl/jvcl/run/JvComponent.pas
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,10 @@ constructor TJvForm.Create(AOwner: TComponent);
finally
Exclude(FFormState, fsCreating);
end;
{$IFDEF HAS_PROPERTY_OLDCREATEORDER}
if OldCreateOrder then
DoCreate;
{$ENDIF HAS_PROPERTY_OLDCREATEORDER}
end;
finally
GlobalNameSpace.EndWrite;
Expand Down
20 changes: 20 additions & 0 deletions developer/src/ext/mbcolor/mxs.inc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,26 @@
{$define DELPHI_10_UP}
{$endif}

// Keyman patch (D11/12, vendored mbcolor): define DELPHI_*_UP on VER350/VER360
// too, else HTMLColors.pas drops "uses Variants" and Null won't resolve.
{$ifdef VER350}
{$define DELPHI_5_UP}
{$define DELPHI_6_UP}
{$define DELPHI_7_UP}
{$define DELPHI_8_UP}
{$define DELPHI_9_UP}
{$define DELPHI_10_UP}
{$endif}

{$ifdef VER360}
{$define DELPHI_5_UP}
{$define DELPHI_6_UP}
{$define DELPHI_7_UP}
{$define DELPHI_8_UP}
{$define DELPHI_9_UP}
{$define DELPHI_10_UP}
{$endif}

{$ifdef VER330}
{$define DELPHI_5_UP}
{$define DELPHI_6_UP}
Expand Down
13 changes: 9 additions & 4 deletions docs/build/windows.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@ In bash, run the following commands:
cd /c/Projects/keyman
git clone https://github.com/emscripten-core/emsdk
cd emsdk
emsdk install 3.1.58
emsdk activate 3.1.58
emsdk install 3.1.64
emsdk activate 3.1.64
cd upstream/emscripten
npm install
```
Expand All @@ -195,8 +195,8 @@ If you are updating an existing install of Emscripten:
```bash
cd emsdk
git pull
emsdk install 3.1.58
emsdk activate 3.1.58
emsdk install 3.1.64
emsdk activate 3.1.64
cd upstream/emscripten
npm install
```
Expand Down Expand Up @@ -257,6 +257,11 @@ of appropriate node versions during builds.
for a short time. (We are actively working to remove Delphi dependencies
given the licensing issues with using it.)

* If you have Delphi 11 or 12 with a CLI-capable license (Professional or
higher), set `KEYMAN_DELPHI_VERSION` to the Studio path — `22.0` for
Delphi 11, `23.0` for Delphi 12 — before running `build.sh`. The default
(`20.0`, Delphi 10.3) is preserved when the variable is unset.

Start Delphi IDE once after installation as it will create various environment
files and take you through required registration.

Expand Down
6 changes: 4 additions & 2 deletions resources/build/win/configure_environment.inc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,11 @@ _build_vs_environment() {

_locate_rsvars() {
#
# Delphi Compiler Configuration - Delphi 10.3.2
# Delphi Compiler Configuration - defaults to Delphi 10.3 (BDS 20.0).
# Override via the KEYMAN_DELPHI_VERSION environment variable to build with
# a newer Delphi installation (e.g., KEYMAN_DELPHI_VERSION=23.0 for Delphi 12).
#
DELPHI_VERSION=20.0
DELPHI_VERSION="${KEYMAN_DELPHI_VERSION:-20.0}"
DCC32PATH="$(cygpath -u "$ProgramFilesx86\\Embarcadero\\Studio\\$DELPHI_VERSION\\bin")"
RSVars_path="$DCC32PATH/rsvars.bat"
}
Expand Down
5 changes: 4 additions & 1 deletion resources/build/win/delphi_environment.inc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
DELPHIWARNINGS=(-W-MESSAGE_DIRECTIVE -W-IMPLICIT_STRING_CAST -W-IMPLICIT_STRING_CAST_LOSS -W-EXPLICIT_STRING_CAST -W-EXPLICIT_STRING_CAST_LOSS -W-CVT_WCHAR_TO_ACHAR -W-CVT_NARROWING_STRING_LOST -W-CVT_ACHAR_TO_WCHAR -W-CVT_WIDENING_STRING_LOST -W-UNICODE_TO_LOCALE -W-LOCALE_TO_UNICODE -W-IMPLICIT_VARIANTS -W-IMPLICIT_INTEGER_CAST_LOSS -W-IMPLICIT_CONVERSION_LOSS -W-COMBINING_SIGNED_UNSIGNED64 -W-COMBINING_SIGNED_UNSIGNED64)
# !ENDIF

DELPHI_VERSION=20.0
# DELPHI_VERSION defaults to Delphi 10.3 (BDS 20.0). Override via the
# KEYMAN_DELPHI_VERSION environment variable to build with a newer Delphi
# installation (e.g., KEYMAN_DELPHI_VERSION=23.0 for Delphi 12).
DELPHI_VERSION="${KEYMAN_DELPHI_VERSION:-20.0}"
DCC32PATH="$(cygpath -u "$ProgramFilesx86\\Embarcadero\\Studio\\$DELPHI_VERSION\\bin")"

source "$KEYMAN_ROOT/resources/build/win/delphi_environment_generated.inc.sh"
Expand Down
3 changes: 2 additions & 1 deletion resources/builder.inc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2323,7 +2323,8 @@ builder_describe_platform() {
# Detect delphi compiler (see also delphi_environment.inc.sh)
if builder_is_windows; then
local ProgramFilesx86="$(cygpath -w -F 42)"
if [[ -x "$(cygpath -u "$ProgramFilesx86\\Embarcadero\\Studio\\20.0\\bin\\dcc32.exe")" ]]; then
local _delphi_version="${KEYMAN_DELPHI_VERSION:-20.0}"
if [[ -x "$(cygpath -u "$ProgramFilesx86\\Embarcadero\\Studio\\$_delphi_version\\bin\\dcc32.exe")" ]]; then
builder_installed_tools+=(delphi)
fi
fi
Expand Down
7 changes: 6 additions & 1 deletion windows/src/global/delphi/cust/CustomisationStorage.pas
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,13 @@ function TCustomisationStorage.GetFileOfType(FileType: TCustFileType; StartIndex
{ TCustFileList }

function TCustFileList.AddCustFile: TCustFile;
var
NewObj: TObject;
begin
Result := Items[inherited Add(FObjectClass.Create)];
// Delphi 12 dcc64 rejects the inline form with E2010 'TCustFile' and 'TObject';
// splitting via a local TObject makes the widening explicit.
NewObj := FObjectClass.Create;
Result := Items[inherited Add(NewObj)];
end;

constructor TCustFileList.Create(AObjectClass: TCustFileClass);
Expand Down
Loading