Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/tinybiggames/chandra

Lua Scripting for Delphi
https://github.com/tinybiggames/chandra

delphi embedded-scripting library lua pascal win64 windows-10 windows-11

Last synced: about 1 month ago
JSON representation

Lua Scripting for Delphi

Awesome Lists containing this project

README

        

![Chandra](media/chandra.png)
[![Chat on Discord](https://img.shields.io/discord/754884471324672040?style=for-the-badge)](https://discord.gg/tPWjMwK)
[![Follow on Bluesky](https://img.shields.io/badge/Bluesky-tinyBigGAMES-blue?style=for-the-badge&logo=bluesky)](https://bsky.app/profile/tinybiggames.com)

# Chandra - Lua Scripting for Delphi πŸ› οΈ

Chandra is a Lua πŸ“œ integration library tailored specifically for Delphi πŸ› οΈ developers. It enables seamless interaction πŸ”„ between Delphi applications and Lua scripts, combining Delphi's robustness πŸ’ͺ with Lua's flexibility 🀸. Chandra is designed for professional developers who need to add dynamic ⚑ capabilities to their software without sacrificing performance πŸš€ and stability πŸ”’. This comprehensive guide πŸ“– aims to help you make the most out of Chandra in your projects.

## Overview πŸ“

Chandra integrates Lua 5.4.7+, statically compiled into your Delphi application, with no external DLL dependencies πŸ“¦ to manage. This enhances portability 🚚 and simplifies distribution, making it easier to integrate scripting capabilities into your Delphi applications.

With Chandra, you can easily expose Delphi classes, methods, and data structures to Lua scripts, giving your applications dynamic behavior πŸŒ€ and extensibility. The library leverages Delphi's RTTI (Run-Time Type Information) 🧠 to facilitate method registration, providing a streamlined process for integrating Lua.

## Key Features ✨

- **Integrated Lua Version**: Lua 5.4.7+ is embedded directly, eliminating external dependencies πŸ“¦.
- **Automatic Routine Registration** πŸ”„: Published Delphi methods are automatically available to Lua, simplifying the process of scripting your application.
- **Basic Types Support** 🧩: Supports parameters and return types such as strings πŸ“, floating-point numbers πŸ”’, Booleans βœ…βŒ, and pointers ➑️.
- **Pointer Handling** πŸ”§: Safe pointer management ensures stability πŸ”’ when working with complex data structures.
- **Error Handling** ⚠️: Robust error handling during script execution is included, ensuring your application runs smoothly πŸš€ even when Lua scripts fail.
- **Interactive Debugging** 🐞: Add `dbg()` in Lua code to begin debugging, useful for identifying issues during runtime.
- **Script Importing and Bundling** πŸ“¦: Use a custom `import` command to combine scripts, compile them into a single file, and optionally store them as an EXE resource for a fully self-contained application.

## Usage Instructions πŸ› οΈ

To get started with Chandra, follow these steps:

1. **Compile** πŸ“¦ your program in the Delphi IDE with the Chandra library included.
2. **Run** ▢️ the application to register the Delphi classes and methods with the Lua runtime.
3. **Write and Load Lua Scripts** πŸ“πŸ“œ that interact with your Delphi classes using the integrated scripting capabilities.

## Example Integration: Testbed Program πŸ§ͺ

The Testbed Program is a sample project demonstrating how to use Chandra to integrate Lua scripting with a Delphi application. It provides practical examples, including arithmetic operations βž•, string manipulation βœ‚οΈ, record handling πŸ—‚οΈ, memory management πŸ’Ύ, and error handling ⚠️.

### Features Demonstrated 🧩

- **Arithmetic Operations** βž•: Methods for addition and multiplication are exposed to Lua scripts.
- **String Manipulation** βœ‚οΈ: Concatenates strings and creates lists accessible in Lua.
- **Record Handling** πŸ—‚οΈ: Create and update Delphi records from Lua, and retrieve their values via pointers.
- **Memory Management** πŸ’Ύ: Allocate, write, read, and free memory blocks from Lua scripts, demonstrating pointer management.
- **Lua Integration** πŸ“œ: Load, execute, and interact with Lua scripts calling Delphi functions.

### Example Lua Script πŸ“œ

```lua
print("Testing TTestClass methods...")
print("Add:", TTestClass.Add(5, 3))
print("Multiply:", TTestClass.Multiply(4.5, 2.0))
print("Concat:", TTestClass.Concat("Hello ", "World"))

-- Record handling example
local rec = TTestClass.CreateRecord(1, "Test Record", 42.0)
print("Initial Record Value:", TTestClass.GetRecordValue(rec))
TTestClass.UpdateRecord(rec, 100.0)
print("Updated Record Value:", TTestClass.GetRecordValue(rec))

-- Memory management example
local mem = TTestClass.AllocateMemory(4)
TTestClass.WriteToMemory(mem, 12345)
print("Memory Value:", TTestClass.ReadFromMemory(mem))
TTestClass.FreeMemory(mem)

function add(a, b)
return a + b
end

function concat(str1, str2)
return str1 .. str2
end

function process_record(rec, str)
print("Value:", TTestClass.GetRecordValue(rec))
print("str: " .. str)
end
```

### Delphi Side Example πŸ› οΈ

Below is an example of how to use Chandra in a Delphi application:

```delphi

type
TTestRecord = record
ID: Integer;
Name: string;
Value: Double;
end;
PTestRecord = ^TTestRecord;

{$M+}
TTestClass = class
published
class function Add(A, B: Integer): Integer;
class function Multiply(A, B: Double): Double;
class function Concat(const A, B: string): string;
class function CreateList: TStringList;
class function GetListCount(List: TStringList): Integer;
class function CreateRecord(ID: Integer; const Name: string; Value: Double): TTestRecord;
class procedure UpdateRecord(P: PTestRecord; NewValue: Double);
class function GetRecordValue(P: PTestRecord): Double;
class function AllocateMemory(Size: Integer): Pointer;
class procedure FreeMemory(P: Pointer);
class procedure WriteToMemory(P: Pointer; Value: Integer);
class function ReadFromMemory(P: Pointer): Integer;
end;
{$M-}

var
LChandra: TChandra;
LRec: TTestRecord;

begin
LChandra := TChandra.Create();
try
try
LChandra.RegisterRoutines(TTestClass);
LChandra.LoadString(CScript);

WriteLn('Integer value: ', LChandra.Call('add', [50, 50]).AsInteger);
WriteLn('String value: ', LChandra.Call('concat', ['Hello, ', 'World!']).AsString);

LRec.ID := 1;
LRec.Name := 'test';
LRec.Value := 200;

LChandra.Call('process_record', [@LRec, 'test']);
except
on E: Exception do
begin
WriteLn(Format('Error: %s', [E.Message]));
end;
end;
finally
LChandra.Free();
end;
end;
```

### Key Takeaways πŸ“Œ

This example showcases the powerful interoperability πŸ”— between Delphi and Lua. It highlights how you can:

- **Extend Application Functionality** ⚑: Use Lua scripts to add dynamic features to your Delphi applications.
- **Safe Memory Management** πŸ’Ύ: Demonstrates best practices for handling pointers and memory between Delphi and Lua.
- **Error Handling and Debugging** 🐞: Learn practical techniques to debug and handle errors when integrating scripting into Delphi applications.

## Advanced Usage Notes 🧠

### Integrated Lua Version 🐍

Chandra uses Lua 5.4.7+, which is statically compiled into the Delphi application. This approach eliminates the need for external DLLs πŸ“¦, ensuring your applications remain self-contained.

### Automatic Registration of Delphi Routines πŸ”„

Chandra automatically registers Delphi routines declared as published class methods. You don’t need to manually bind methods to Luaβ€”simply declare them as `published`, and Chandra makes them available for scripting.

### Supported Parameter and Return Types βœ…

Chandra supports basic types for method parameters and return values:

- `string` πŸ“
- `float` (single or double) πŸ”’
- `Boolean` βœ…βŒ
- `Pointer` ➑️

When designing methods for use with Lua, ensure parameters and return values are restricted to these types.

### Pointer Management πŸ”§

Pointers created on the Delphi side must be managed by Delphi code:

- Pointers passed to Lua can be referenced within Lua scripts, but modification or memory operations must be handled by Delphi.
- Dynamically allocated pointers need proper cleanup to avoid memory leaks πŸ’§.

### Prerequisites πŸ“‹

- **Delphi Version**: Delphi 12.2 or higher is required.
- **Operating System**: Windows 10 or higher; tested on Windows 11 64-bit (23H2).

## Getting Started with the Chandra Testbed Program πŸš€

The Testbed Program is an example application included with Chandra. It demonstrates how to:

- **Integrate Lua scripting** πŸ“œ into a Delphi application.
- **Expose Delphi methods** πŸ› οΈ and data structures to Lua.
- **Combine static and dynamic programming paradigms** πŸ”„ for powerful application extensibility.

### How to Run the Testbed Program ▢️

1. Compile the program in the Delphi IDE, ensuring that the Chandra library is correctly included.
2. Run the program to see how Lua interacts with Delphi methods.
3. Observe console outputs that demonstrate arithmetic operations βž•, record handling πŸ—‚οΈ, and memory management πŸ’Ύ.

### Example Workflow πŸ”„

- **Arithmetic with Lua** βž•: Lua scripts call Delphi methods to perform addition and multiplication.
- **String Operations** βœ‚οΈ: Lua can concatenate strings using methods exposed from Delphi.
- **Record Management** πŸ—‚οΈ: Delphi records can be created and updated via Lua scripts, showing how to pass complex data between the two environments.
- **Memory Management** πŸ’Ύ: Demonstrates safe handling of dynamically allocated memory through pointers.

## Notes and Recommendations πŸ“

- **Lua Interpreter Setup** 🐍: Ensure the embedded Lua version is correctly linked and compiled with the Delphi project.
- **Pointer Safety** πŸ”’: Pointers passed to Lua should be managed exclusively by Delphi to prevent memory issues.
- **Documentation** πŸ“–: Thoroughly document any methods exposed to Lua, specifying the intended usage and parameter types.

## Conclusion 🎯

Chandra offers a straightforward solution for integrating Lua scripting πŸ“œ into Delphi applications, providing developers with a way to leverage the flexibility 🀸 of Lua without sacrificing the strong typing and performance πŸš€ advantages of Delphi. By using Chandra, you can significantly enhance your applications' extensibility, maintainability πŸ› οΈ, and customization potential.

Whether you're building complex applications that require runtime customization or just want to offer script-based configuration options, Chandra makes Lua scripting integration both accessible and powerful πŸ’ͺ for Delphi developers.

## Requirements βœ…

- **Delphi 12.2 or higher** πŸ› οΈ
- **Windows 10 or higher** πŸ–₯️ (Tested on Windows 11 64-bit, version 23H2)

### Contributing

Contributions to **Chandra** are highly encouraged. Please feel free to submit issues, suggest new features, or create pull requests to expand the capabilities and robustness of the scripting engine.

### License

**Chandra** is distributed under the πŸ†“ **BSD-3-Clause License**, allowing for redistribution and use in both source and binary forms, with or without modification, under specific conditions. See the [LICENSE](https://github.com/tinyBigGAMES/Chandra?tab=BSD-3-Clause-1-ov-file#BSD-3-Clause-1-ov-file) file for more details.

### Support

- Issues
- Discussions
- Learn Delphi
- Learn Lua
---
For any professional Delphi developer interested in enhancing application flexibility with scripting capabilities, Chandra offers a tested and reliable solution that keeps everything self-contained and performant. πŸš€


Delphi


Made with :heart: in Delphi