-
Content Count
3297 -
Joined
-
Last visited
-
Days Won
110
Everything posted by Lars Fosdal
-
Enlarging the font in code view inside Delphi Alexandria 11.2 Professional
Lars Fosdal replied to JohnLM's topic in Delphi IDE and APIs
Do you have an overlayed numpad accessible via Fn key? In that case, Does Fn+Ctrl +/- (on the overlay) work? -
Enlarging the font in code view inside Delphi Alexandria 11.2 Professional
Lars Fosdal replied to JohnLM's topic in Delphi IDE and APIs
What about Ctrl+Num + Code Editor Context Menu | Increase Font Size Increases the font size of the Code Editor. Ctrl+Num - Code Editor Context Menu | Decrease Font Size Decreases the font size of the Code Editor. -
Call for Delphi 12 Support in OpenSource projects.
Lars Fosdal replied to Tommi Prami's topic in Delphi Third-Party
If you have access to the beta, you can still prepare libs for its release - but you cannot publish / make available the libs. -
What is the benefit of sorting the Uses clause?
Lars Fosdal replied to RCrandall's topic in MMX Code Explorer
I remember having this discussion with an american on LinkedIn. He had written a tool that sorted the uses clause, and he turned a darker shade of crazy when I pointed out the risks, "chanting" USA, USA, USA. No point in discussing with such people. -
I absolutely love Win 11 for ARM on my MBP, but it does irk me that I cannot create native apps for ARM.
-
I assume you mean "smoothly" or "effortlessly"?
-
LiveSearch
-
It depends on the amount/size of the data, the frequency of uploads (batch or streaming). A REST server and JSON data packages sounds like one possible solution.
-
Delphi support for Google Protocol Buffers?
Lars Fosdal posted a topic in Algorithms, Data Structures and Class Design
Has anyone seen any Delphi code intended to support Google's Protocol Buffer spec? I've found https://github.com/marat1961/protobuf-delphi Edit: I also found https://github.com/grijjy/GrijjyFoundation/blob/master/Grijjy.ProtocolBuffers.pas so, I guess that is all I need, but other suggestions are welcome. -
Delphi support for Google Protocol Buffers?
Lars Fosdal replied to Lars Fosdal's topic in Algorithms, Data Structures and Class Design
Comparing YAML and ProtoBuf is like comparing Horse & Carriage with a Cargo Train. ProtoBuf is for transmitting large amounts of structured transactional data. -
@sandokhane - The question way to general to be answered. Be more specific.
-
Have any of you used this old lib in 64-bit? It works fine in 32-bit, but I get Project MyProject.exe raised exception class EDCP_cipher with message 'Unable to allocate sufficient memory for hash digest'. when running as 64-bit. Curious to know if anyone has worked around this issue already.
-
No argument there from me, as I didn't write the code.
-
Spinoff QP entry. https://quality.embarcadero.com/browse/RSP-42133 Warning when a pointer is cast of a different size integer Consider the following code procedure Indata(const InData); var X: array[0..1] of DWord; begin x[0]:= PDWord(@InData)^; x[1]:= PDWord(LongWord(@InData)+4)^; This works well in 32-bit, but when you switch to 64-bit, LongWord is still 32-bit, and and casting a pointer to LongWord will then strip the upper 32-bits of the 64-bit pointer and the PDWord pointer will be wrong; Ideally, the compiler should spot when the integer being cast to a pointer is of a different size (32 vs 64) than the integer type and issue a warning.
-
Is it possible to send text from android to a windows laptop and back over wifi?
Lars Fosdal replied to JohnLM's topic in Cross-platform
Circular Reference - See Reference, Circular Reference, Circular - See Circular Reference Joke aside, simplified it means that you have a UnitA using UnitB, and UnitB using UnitA. -
Ann: NexusDB presence at Embarcadero Bootcamp
Lars Fosdal replied to eivindbakkestuen's topic in Delphi Third-Party
The visibile link is correct, but the underlying link points to this thread 🙂 -
I decided to test switching one my 32-bit apps to 64-bit, to see how it would behave. It uses an encryption algorithm called TwoFish from an old encryption lib - DCPCrypt2 by David Barton- which seems to no longer be maintained, and to my dismay, the encryption failed with a access violation. Project ConsoleTest.exe raised exception class $C0000005 with message ‘c0000005 ACCESS_VIOLATION’. that was eaten by an exception handler in the lib - which presented a different error message EDCP_cipher: Unable to allocate sufficient memory for hash digest It fails on the first half of this expression in the code below; x[1]:= PDWord(longword(@InData)+4)^ xor SubKeys[INPUTWHITEN+1]; i.e. PDWord(longword(@InData)+4)^ Question: Longwords and DWords are supposedly the same in both 32-bit and 64-bit, so why does the pointer arithmetic fail in 64-bit? Below is the original method that works well in 32-bit, but blows up in 64-bit. In the DCPtwofish.pas unit: procedure TDCP_twofish.EncryptECB(const InData; var OutData); var i: longword; t0, t1: DWord; X: array[0..3] of DWord; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); x[0]:= PDWord(@InData)^ xor SubKeys[INPUTWHITEN]; x[1]:= PDWord(longword(@InData)+4)^ xor SubKeys[INPUTWHITEN+1]; // <- 64-bit Access Violation! x[2]:= PDWord(longword(@InData)+8)^ xor SubKeys[INPUTWHITEN+2]; x[3]:= PDWord(longword(@InData)+12)^ xor SubKeys[INPUTWHITEN+3]; i:= 0; while i<= NUMROUNDS-2 do begin t0:= sBox[0,(x[0] shl 1) and $1fe] xor sBox[0,((x[0] shr 7) and $1fe)+1] xor sBox[2,(x[0] shr 15) and $1fe] xor sBox[2,((x[0] shr 23) and $1fe)+1]; t1:= sBox[0,((x[1] shr 23) and $1fe)] xor sBox[0,((x[1] shl 1) and $1fe)+1] xor sBox[2,((x[1] shr 7) and $1fe)] xor sBox[2,((x[1] shr 15) and $1fe)+1]; x[3]:= (x[3] shl 1) or (x[3] shr 31); x[2]:= x[2] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*i]); x[3]:= x[3] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*i+1]); x[2]:= (x[2] shr 1) or (x[2] shl 31); t0:= sBox[0,(x[2] shl 1) and $1fe] xor sBox[0,((x[2] shr 7) and $1fe)+1] xor sBox[2,((x[2] shr 15) and $1fe)] xor sBox[2,((x[2] shr 23) and $1fe)+1]; t1:= sBox[0,((x[3] shr 23) and $1fe)] xor sBox[0,((x[3] shl 1) and $1fe)+1] xor sBox[2,((x[3] shr 7) and $1fe)] xor sBox[2,((x[3] shr 15) and $1fe)+1]; x[1]:= (x[1] shl 1) or (x[1] shr 31); x[0]:= x[0] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)]); x[1]:= x[1] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)+1]); x[0]:= (x[0] shr 1) or (x[0] shl 31); Inc(i,2); end; PDWord(longword(@OutData)+ 0)^:= x[2] xor SubKeys[OUTPUTWHITEN]; PDWord(longword(@OutData)+ 4)^:= x[3] xor SubKeys[OUTPUTWHITEN+1]; PDWord(longword(@OutData)+ 8)^:= x[0] xor SubKeys[OUTPUTWHITEN+2]; PDWord(longword(@OutData)+12)^:= x[1] xor SubKeys[OUTPUTWHITEN+3]; end; The answer came from a fellow developer elsewhere: It fails because pointers are not longwords in 64 bit and casting to longword clips the upper 32 bits, so the cast of a pointer to a longword is not the way to do it. Instead - the correct way would be to change the expression to PDWord(UIntPtr(@InData)+4)^ After some fiddling in the debugger, I thought - why not try a cleaner approach to the pointer casts, and this is what I came up with - and it works as intended in both 32-bit and 64-bit, without the explicit offset calculations. type ArrDWord = array[0..3] of DWord; pArrDWord = ^ArrDWord; procedure TDCP_twofish.EncryptECB(const InData; var OutData); var i: longword; t0, t1: DWord; X: array[0..3] of DWord; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); x[0]:= PArrDWord(@InData)[0] xor SubKeys[INPUTWHITEN]; x[1]:= PArrDWord(@InData)[1] xor SubKeys[INPUTWHITEN+1]; x[2]:= PArrDWord(@InData)[2] xor SubKeys[INPUTWHITEN+2]; x[3]:= PArrDWord(@InData)[3] xor SubKeys[INPUTWHITEN+3]; i:= 0; while i<= NUMROUNDS-2 do begin t0:= sBox[0,(x[0] shl 1) and $1fe] xor sBox[0,((x[0] shr 7) and $1fe)+1] xor sBox[2,(x[0] shr 15) and $1fe] xor sBox[2,((x[0] shr 23) and $1fe)+1]; t1:= sBox[0,((x[1] shr 23) and $1fe)] xor sBox[0,((x[1] shl 1) and $1fe)+1] xor sBox[2,((x[1] shr 7) and $1fe)] xor sBox[2,((x[1] shr 15) and $1fe)+1]; x[3]:= (x[3] shl 1) or (x[3] shr 31); x[2]:= x[2] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*i]); x[3]:= x[3] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*i+1]); x[2]:= (x[2] shr 1) or (x[2] shl 31); t0:= sBox[0,(x[2] shl 1) and $1fe] xor sBox[0,((x[2] shr 7) and $1fe)+1] xor sBox[2,((x[2] shr 15) and $1fe)] xor sBox[2,((x[2] shr 23) and $1fe)+1]; t1:= sBox[0,((x[3] shr 23) and $1fe)] xor sBox[0,((x[3] shl 1) and $1fe)+1] xor sBox[2,((x[3] shr 7) and $1fe)] xor sBox[2,((x[3] shr 15) and $1fe)+1]; x[1]:= (x[1] shl 1) or (x[1] shr 31); x[0]:= x[0] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)]); x[1]:= x[1] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)+1]); x[0]:= (x[0] shr 1) or (x[0] shl 31); Inc(i,2); end; PArrDWord(@OutData)[0] := x[2] xor SubKeys[OUTPUTWHITEN]; PArrDWord(@OutData)[1] := x[3] xor SubKeys[OUTPUTWHITEN+1]; PArrDWord(@OutData)[2] := x[0] xor SubKeys[OUTPUTWHITEN+2]; PArrDWord(@OutData)[3] := x[1] xor SubKeys[OUTPUTWHITEN+3]; end; Here is the test code: uses DCPtwofish, DCPsha1; const CRYPT_KEY = 'TheVØryBÆDSecretStr.ing'; function EncryptTwofish(const s: string; Key: string = CRYPT_KEY) : string; var Cipher : TDCP_twofish; begin Result:=''; Cipher := TDCP_twofish.Create(nil); try Cipher.InitStr(AnsiString(Key), TDCP_sha1); Result := string(Cipher.EncryptString(AnsiString(s))); finally Cipher.Free; end; end; procedure TestEncrypt; begin Writeln(EncryptTwoFish('Keep this text a secret')); end;
-
I figured it out, but I need to do some more checking to figure out why it didn't fail in 32-bit.
-
Is it possible to create a VPN client/server in Delphi?
Lars Fosdal replied to Clément's topic in RTL and Delphi Object Pascal
Writing your own VPN software in Delphi. Would you write your own Firewall too? Just say no. You don't need the liability. -
load a local json file into my app, (fdMemTable, etc)
Lars Fosdal replied to grantful's topic in Databases
You need to load the JSON structures in memory, and then feed them row by row to your memtable. Here is an example: https://stackoverflow.com/questions/55766112/importing-json-into-tfdmemtable -
Strange problem skipping loop with tTask
Lars Fosdal replied to Jud's topic in RTL and Delphi Object Pascal
Precisely. -
Strange problem skipping loop with tTask
Lars Fosdal replied to Jud's topic in RTL and Delphi Object Pascal
Captures problems can be easy to miss. -
How to update and install into new Delphi
Lars Fosdal replied to FLDelphi's topic in OmniThreadLibrary
@FLDelphi Use your favorite git tool (I prefer GitKraken) and clone the OTL main branch to the folder of your liking. If you use components, build and install them. Use the git tool periodically to check for / pull updates. -
Not sure if you missed my edit?
-
That sounds like a bug? There should be a MouseUp event? Edit: The "modal window" may be receiving the event instead of the parent form.