---
product: Chilkat
product_version: 11.7.0
language: pascal
language_label: Lazarus Pascal
class: MessageSet
license: bundle
deprecated: false
reference_html: https://www.chilkatsoft.com/refdoc/pascal_MessageSetRef.html
---
# Chilkat MessageSet — Lazarus Pascal — v11.7.0

> Chilkat 11.7.0 · language=pascal · class=MessageSet
> Other versions: replace `11.7.0` in this URL. Other languages: `https://www.chilkatsoft.com/ai-docs/v/11.7.0/<lang>/classes/MessageSet.md`.
> Language-wide rules (install, unlock, error model, strings/bytes): `https://www.chilkatsoft.com/ai-docs/v/11.7.0/pascal/guide.md`.

## Purpose

**Represent and pass sets of IMAP message identifiers.**

`Chilkat.MessageSet` represents a set of IMAP message identifiers used by `Chilkat.Imap`. It is a helper object for passing groups of messages to IMAP methods and for receiving groups of message IDs returned by IMAP search, fetch, copy, delete, or flag-related operations. A `MessageSet` may contain either UIDs or sequence numbers, and the `HasUids` setting identifies which form is being used.

**IMAP message IDs**

Store the identifiers used by IMAP operations, either as message UIDs or as sequence numbers.

**Used by Chilkat.Imap**

Pass message sets to IMAP methods that operate on multiple messages, or receive them from IMAP methods that return matching messages.

**UID awareness**

Use `HasUids` to indicate whether the contained identifiers are stable IMAP UIDs or mailbox-relative sequence numbers.

**Add and remove IDs**

Insert message identifiers, remove identifiers, check whether an ID is present, and build the exact message group needed for an IMAP operation.

**Compact string formats**

Load or emit compact IMAP-style message ranges such as comma-separated lists and range expressions.

**Set operations**

Subtract one message set from another when application logic needs to exclude already-processed or unwanted messages.

**Common pattern:** Use `MessageSet` only for IMAP message identifiers, not as a general-purpose collection. Obtain a message set from an IMAP search or build one manually, confirm whether it contains UIDs or sequence numbers, then pass it to the appropriate `Chilkat.Imap` method for fetching, copying, deleting, flagging, or otherwise processing the selected messages.

For an extended overview, see [MessageSet Class Overview](https://www.chilkatsoft.com/messageset_class_overview.asp).

## Object creation, unlocking and error handling

**Create / Free**

```pascal
uses
  Chilkat.MessageSet;

var
  obj: TMessageSet;
begin
  obj := TMessageSet.Create;
  try
    if not obj.IsValid then
      raise Exception.Create('Failed to create a TMessageSet instance.');

    // ... use obj ...

  finally
    obj.Free;
  end;
end;
```

`constructor Create;`

Allocates the underlying CkMessageSet object and returns a new TMessageSet instance. Simply adding **Chilkat.MessageSet** to the unit's `uses` clause is enough to locate and bind to the Chilkat shared library (DLL / .so / .dylib) at runtime — no separate load step is required. Check `obj.IsValid` after calling `Create`; it is `False` if the underlying library could not be found/loaded or the object could not be allocated (for example, when unlicensed).

`destructor Destroy; override;`

Every TMessageSet created by calling `Create` should eventually be released by calling `.Free` (inherited from `TObject`). The destructor automatically disposes the underlying CkMessageSet handle. A native (unmanaged) memory leak occurs if the object is never freed.

Call `Global.UnlockBundle` once at the start of the program, before using this or any other Chilkat class. Any string unlocks a fully functional 30-day trial; a purchased unlock code is used in production. See `guide.md` for the exact code in Lazarus Pascal.

## Members common to every Chilkat class

Documented once per language in `common-members.md`; listed here so this page is self-contained.

| Property | Signature | Access | Meaning |
|---|---|---|---|
| `DebugLogFilePath` | `property DebugLogFilePath: string read GetDebugLogFilePath write SetDebugLogFilePath;` | read/write | If set to a file path, this property logs the LastErrorText of each Chilkat method or property call to the specified file. |
| `LastErrorHtml` | `property LastErrorHtml: string read GetLastErrorHtml;` | read-only | Provides HTML-formatted information about the last called method or property. |
| `LastErrorText` | `property LastErrorText: string read GetLastErrorText;` | read-only | Provides plain text information about the last called method or property. |
| `LastErrorXml` | `property LastErrorXml: string read GetLastErrorXml;` | read-only | Provides XML-formatted information about the last called method or property. |
| `LastMethodSuccess` | `property LastMethodSuccess: Boolean read GetLastMethodSuccess write SetLastMethodSuccess;` | read/write | Indicates the success or failure of the most recent method call: `True` means success, `False` means failure. |
| `VerboseLogging` | `property VerboseLogging: Boolean read GetVerboseLogging write SetVerboseLogging;` | read/write | If set to `True`, then the contents of LastErrorText (or LastErrorXml, or LastErrorHtml) may contain more verbose information. |
| `Version` | `property Version: string read GetVersion;` | read-only | Version of the component/library, such as "10.1.0" |

## Member index

| Member | Kind | Signature |
|---|---|---|
| `Count` | property, read-only | `property Count: Integer read GetCount;` |
| `HasUids` | property, read/write | `property HasUids: Boolean read GetHasUids write SetHasUids;` |
| `ContainsId` | method | `function ContainsId(msgId: LongWord): Boolean;` |
| `FromCompactString` | method | `function FromCompactString(const str: string): Boolean;` |
| `GetId` | method | `function GetId(index: Integer): LongWord;` |
| `InsertId` | method | `procedure InsertId(id: LongWord);` |
| `LoadTaskResult` | method | `// task is a TTask object. function LoadTaskResult(task: TChilkatBase): Boolean;` |
| `RemoveId` | method | `procedure RemoveId(id: LongWord);` |
| `Subtract` | method | `// msgSet is a TMessageSet object. procedure Subtract(msgSet: TChilkatBase);` |
| `ToCommaSeparatedStr` | method | `function ToCommaSeparatedStr: string;` |
| `ToCompactString` | method | `function ToCompactString: string;` |

## Properties

### MessageSet.Count

`Chilkat 11.7.0 · pascal · MessageSet · Count · property · read-only`

```pascal
property Count: Integer read GetCount;
```

Returns the number of unique message identifiers currently stored in the set. A newly created `MessageSet` has a count of `0`.

The identifiers are maintained in ascending numeric order. They are interpreted as UIDs when `HasUids` is `True`, or as sequence numbers when it is `False`.

### MessageSet.HasUids

`Chilkat 11.7.0 · pascal · MessageSet · HasUids · property · read/write`

```pascal
property HasUids: Boolean read GetHasUids write SetHasUids;
```

**Full documentation for this property (same in every language):** [IMAP Sequence Numbers Explained](https://www.chilkatsoft.com/ai-docs/v/11.7.0/articles/imap_message_sequence_numbers.md)

Indicates how the numeric identifiers in this message set are interpreted:

- `True` — the values are IMAP UIDs. This is the default.
- `False` — the values are mailbox-relative sequence numbers.

Changing this property only changes how the existing numeric values are interpreted. It does not convert, validate, reorder, or clear the identifiers.

An IMAP UID is stable only within its mailbox and while that mailbox's `UIDVALIDITY` remains unchanged. Sequence numbers are temporary and can change when messages are added or expunged.

Set this property consistently before passing a manually constructed message set to an `Imap` method. The string formats produced by `ToCommaSeparatedStr` and `ToCompactString` contain only the numeric values and do not include this setting.

## Methods

### MessageSet.ContainsId

`Chilkat 11.7.0 · pascal · MessageSet · ContainsId · method`

```pascal
function  ContainsId(msgId: LongWord): Boolean;
```

Returns `True` if the raw numeric value in `msgId` is present in the message set; otherwise, returns `False`.

The comparison is numeric only. The `HasUids` setting does not participate in the comparison.

### MessageSet.FromCompactString

`Chilkat 11.7.0 · pascal · MessageSet · FromCompactString · method`

```pascal
function  FromCompactString(const str: string): Boolean;
```

Clears the identifiers currently stored in this object and loads the compact message-set representation in `str`. The existing `HasUids` setting is preserved.

**Important:** The existing set is cleared before `str` is parsed. If parsing fails, the message set remains empty.

An empty string succeeds and leaves the set empty. Valid identifiers are unsigned 32-bit decimal values from `1` through `4294967295`. The value `0` is not accepted. Values too large for an unsigned 32-bit integer cause the method to fail.

The syntax uses commas to separate values or ranges, and a colon to specify an inclusive ascending range. A single range may contain at most 500,001 identifiers; equivalently, the ending value minus the starting value cannot exceed `500000`.

**Version note:** The error-handling behavior described here was added in Chilkat version 11.6.0.

| Input | Result |
| :--- | :--- |
| `1,2,3,4,5` | Loads `1,2,3,4,5`. |
| `1:5` | Loads the inclusive range `1` through `5`. |
| `1:5,8:10` | Loads `1,2,3,4,5,8,9,10`. |
| `1,1,2,2,3` | Loads the unique values `1,2,3`. |
| `1:5,3:7` | Loads the unique values `1` through `7`. |
| `1,,3` | Empty comma-separated elements are ignored; loads `1,3`. |
| `1,2,abc,4` | Unrecognized elements are ignored; loads `1,2,4`. |
| `+1` | A leading plus sign is accepted; loads `1`. |

Whitespace is accepted around values, commas, and colons. This includes spaces, tabs, carriage returns, and line feeds. Empty comma-separated elements and unrecognized non-numeric elements are intentionally ignored. If `str` is nonempty and no valid identifier is loaded, the method returns `False`.

Descending ranges, ranges containing `0`, wildcard ranges such as `1:*`, malformed range syntax, oversized ranges, and numeric overflow cause the method to return `False`.

On success, duplicate identifiers are removed and the resulting identifiers are stored in ascending numeric order. The serialized form contains only the numbers and does not indicate whether they are UIDs or sequence numbers.

Use `ToCompactString` to generate the canonical compact representation.

Returns True for success, False for failure.

### MessageSet.GetId

`Chilkat 11.7.0 · pascal · MessageSet · GetId · method`

```pascal
function  GetId(index: Integer): LongWord;
```

Returns the message identifier at the zero-based index specified by `index`. Identifiers are returned in ascending numeric order.

If `index` is negative or is greater than or equal to `Count`, this method returns `0xFFFFFFFF`.

**Important:** The numeric value `0xFFFFFFFF` can also be stored in the set. Check `index` against `Count` before calling this method when that value could be present.

### MessageSet.InsertId

`Chilkat 11.7.0 · pascal · MessageSet · InsertId · method`

```pascal
procedure InsertId(id: LongWord);
```

Adds `id` to the message set and maintains the identifiers in ascending numeric order.

- If `id` is already present, no duplicate is added.
- If `id` is `0`, the set is unchanged.
- The value `0xFFFFFFFF` is accepted.

The `HasUids` setting determines whether the stored values are interpreted as UIDs or sequence numbers.

### MessageSet.LoadTaskResult

`Chilkat 11.7.0 · pascal · MessageSet · LoadTaskResult · method · since 9.5.0.52`

```pascal
// task is a TTask object.

function  LoadTaskResult(task: TChilkatBase): Boolean;
```

Loads the `MessageSet` result produced by a completed asynchronous operation.

`task` must be a completed `Task` returned by an asynchronous method whose result type is `MessageSet`. If `task` is not a valid completed task of the required result type, this object remains unchanged.

Returns True for success, False for failure.

### MessageSet.RemoveId

`Chilkat 11.7.0 · pascal · MessageSet · RemoveId · method`

```pascal
procedure RemoveId(id: LongWord);
```

Removes the identifier whose raw numeric value equals `id`. If the value is not present, the set is unchanged.

The comparison is numeric only and does not depend on `HasUids`. The remaining identifiers stay in ascending numeric order.

### MessageSet.Subtract

`Chilkat 11.7.0 · pascal · MessageSet · Subtract · method · since 11.3.0`

```pascal
// msgSet is a TMessageSet object.

procedure Subtract(msgSet: TChilkatBase);
```

Removes from this message set every identifier whose raw numeric value is present in `msgSet`. Values not present in this set are ignored.

The comparison is numeric only; the `HasUids` values of the two objects are not compared. This object's `HasUids` value is preserved, and the remaining identifiers stay in ascending numeric order.

Passing the same object as `msgSet` clears the set. Passing an empty set leaves this set unchanged.

For meaningful IMAP results, both objects should represent identifiers of the same type and from the same mailbox.

### MessageSet.ToCommaSeparatedStr

`Chilkat 11.7.0 · pascal · MessageSet · ToCommaSeparatedStr · method`

```pascal
function  ToCommaSeparatedStr: string;
```

Returns the unique identifiers as a comma-separated string in ascending numeric order. An empty set returns an empty string.

For example, a set containing the identifiers `1` through `5` returns `1,2,3,4,5`.

The returned string contains only the numeric values; it does not include the `HasUids` setting.

Returns True for success, False for failure.

### MessageSet.ToCompactString

`Chilkat 11.7.0 · pascal · MessageSet · ToCompactString · method`

```pascal
function  ToCompactString: string;
```

Returns the unique identifiers in ascending numeric order using compact IMAP message-set syntax. Consecutive identifiers are represented as an inclusive range. An empty set returns an empty string.

| Comma-separated form | Compact form |
| :--- | :--- |
| `1,2,3,4,5` | `1:5` |
| `1,2,3,4,5,8,9,10` | `1:5,8:10` |
| `1,3,4,5,8,9,10` | `1,3:5,8:10` |

The returned string is canonical for the current set: identifiers are unique, sorted, and consecutive runs are compacted. It contains only the numeric values and does not include the `HasUids` setting.

Use `FromCompactString` to load this format.

Returns True for success, False for failure.

