Ja, beim Klick auf "Get services" hängt es sich nicht auf. Aber es kann gut sein, dass du einen Thread um die Funktion ServicesDiscovered bauen musst. Dies scheint mir in dem Beispiel falsch zu sein.
Probiere mal diese Anpassung:
Delphi-Quellcode:
procedure TFrDeviceExplorer.ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
begin
TThread.CreateAnonymousThread(
procedure()
var
I: Integer;
CharList: TBluetoothGattCharacteristicList;
AChar: TBluetoothGattCharacteristic;
J: Integer;
CurrentRow: Integer;
Options: string;
ServiceItem, Characteristic, CharProps: TTreeViewItem;
begin
TvCharacteristics.Clear;
for I := 0 to AServiceList.Count - 1 do
begin
ServiceItem := TTreeViewItem.Create(nil);
ServiceItem.Parent := TvCharacteristics;
ServiceItem.Tag := I;
ServiceItem.IsExpanded := True;
if AServiceList[I].UUIDName.IsEmpty then
ServiceItem.Text := 'Unnamed'
else
ServiceItem.Text := AServiceList[I].UUIDName;
CharList := AServiceList[I].Characteristics;
for J := 0 to CharList.Count - 1 do
begin
AChar := CharList[J];
TThread.Synchronize(nil, procedure begin
Options := '';
if TBluetoothProperty.Broadcast in AChar.Properties then Options := Options + 'Broadcast ';
if TBluetoothProperty.ExtendedProps in AChar.Properties then Options := Options + 'ExtendedProps ';
if TBluetoothProperty.Notify in AChar.Properties then Options := Options + 'Notify ';
if TBluetoothProperty.Indicate in AChar.Properties then Options := Options + 'Indicate ';
if TBluetoothProperty.Read in AChar.Properties then Options := Options + 'Read ';
if TBluetoothProperty.Write in AChar.Properties then Options := Options + 'Write ';
if TBluetoothProperty.WriteNoResponse in AChar.Properties then Options := Options + 'WriteNoResponse ';
if TBluetoothProperty.SignedWrite in AChar.Properties then Options := Options + 'SignedWrite ';
Characteristic := TTreeViewItem.Create(nil);
Characteristic.Parent := ServiceItem;
Characteristic.IsExpanded := False;
if AChar.UUIDName.IsEmpty then
Characteristic.Text := 'Unnamed'
else
Characteristic.Text := AChar.UUIDName;
Characteristic.Tag := J;
CharProps := TTreeViewItem.Create(nil);
CharProps.Tag := -1;
CharProps.Parent := Characteristic;
CharProps.IsExpanded := True;
CharProps.Text := GUIDToString(AChar.UUID);
CharProps := TTreeViewItem.Create(nil);
CharProps.Tag := -1;
CharProps.Parent := Characteristic;
CharProps.IsExpanded := True;
CharProps.Text := Options;
end);
Application.ProcessMessages;
end;
end;
tmAnimateFindServices.Enabled := False;
PbServices.Value := 100;
end).Start;
end;
D.h. übertragen auf das Beispiel müsste es