Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41

Как правильно использовать функцию из DLL в Делфи?

28.09.2016, 16:40. Показов 2067. Ответов 18

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Имеется датчик RF603, с интерфейсом Ethernet, а так же dll к нему и не большой мануал.

Из мануала берем функции для работы с датчиками с Ethernet интерфейсом.

Первая функция

Открытие порта для получения данных по Ethernet

Функция RF60x_Ethernet_OpenPort открывает сетевой порт, заполняет указатель на дескриптор устройства и возвращает результат операции:

C++
1
2
3
BOOL RF60x_Ethernet_OpenPort (
HANDLE * lpHandle
);
Параметры:
lpHandle - указатель на дескриптор устройства;
Возвращаемое значение:
FALSE или TRUE.

Переписываю тоже самое на делфи:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
funtion RF60x_Ethernet_OpenPort(lpHandle: Thandle):Boolean; cdecl;
external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';
 
.....
 
var
RF603h: THandle;
st: boolean;
 
......
 
st:=RF60x_Ethernet_OpenPort(RF603h);
if st = true then
label1.Caption:='OK';
Здесь вроде все работе, возвращает true.

Следующий шаг получить измерения от датчика. Вот с этим проблема. Не могу записать функцию.

Получение 168-ми результатов измерений из потока

Из мануала:

Функция RF603_Ethernet_GetStreamMeasure получает от датчика 168 измерений и заполняет следующую структуру:

C++
1
2
3
4
5
6
7
8
9
typedef struct _RF60x_UDP_PACKET_ {
RF60xUDPVALUE rf60xValArray[168];
WORD wDeviceSerial;
WORD wDeviceBaseDistance;
WORD wDeviceMeasureRange;
BYTE bPackCount;
DWORD dwReserved;
BYTE bPacketControlSumm;
} RF60xUDPPACKET, *LPRF60xUDPPACKET;
Где:

rf60xValArray –168 структур (измерений) RF60xUDPVALUE,
в которых сохранены измерения и статус;

wDeviceSerial –двубайтная величина содержащая серий-
ный номер устройства устройства (тип WORD);

wDeviceBaseDistance –двубайтная величина содержащая значение
базового расстояния для датчика РФ603 (тип WORD);

wDeviceMeasureRange –двубайтная величина содержащая значение
диапазона для датчика РФ603 (тип WORD);

bPackCount –однобайтная величина содержащая значе-
ние счѐтчика пакетов (тип BYTE);

dwReserved –четырѐхбайтная зарезервированная вели-
чина (тип DWORD);

bPacketControlSumm –однобайтная величина содержащая значе-
ние контрольной суммы (тип BYTE).

Структура RF60xUDPVALUE:
C++
1
2
3
4
typedef struct _RF60x_UDP_VALUE_ {
WORD wMeasure;
BYTE bStatus;
} RF60xUDPVALUE, *LPRF60xUDPVALUE;
Где:
wMeasure –указатель на переменную типа
USHORT/WORD, содержащую результат D;

bStatusоднобайтная –величина, содержащая значение статуса
измерения (тип BYTE);

Функция RF603_Ethernet_GetStreamMeasure:
C++
1
2
3
4
BOOL RF603_Ethernet_GetStreamMeasure (
HANDLE hHandle,
LPRF60xUDPPACKET lprf60xUDPPacket
);
Параметры:

hHandle – дескриптор устройства, полученного от
функции RF60x_Ethernet_OpenPort;

lprf60xUDPPacket - указатель на структуру типа
RF60xUDPPACKET, содержащую результат D.

Возвращаемое значение:
Если в буфере данные отсутствуют, то функция возвращает FALSE, иначе функция возвращает TRUE и заполняет структуру lprf60xUDPPacket.

Помогите пожалуйста записать тоже самое на делфи, как сделал первую функцию. Спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2016, 16:40
Ответы с готовыми решениями:

Как можно использовать функцию mpfr_sqrt() из gmp.dll
Подскажите, пожалуйста, как можно использовать функцию mpfr_sqrt() из gmp.dll в C#?

Как правильно использовать функцию datediff?
Использую ADODataSet, при попытке активировать выдает ошибку: "слишком мало параметров, требуется 1" SELECT DateDiff(day, Date(),...

Как правильно использовать strfind функцию?
Привет, я недавно начала заниматься Матлабом в универе и пытаюсь в первый раз решить задачу. У нас есть разные программы ассемблера,...

18
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.09.2016, 16:45
Цитата Сообщение от Sergey1990 Посмотреть сообщение
Здесь вроде все работе, возвращает true.
Хм... А я думала что в качестве параметра нужен var, если передается по указателю.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
 _RF60x_UDP_VALUE_ = record
   wMeasure:Word;
   bStatus:Byte;
 end;
 _RF60x_UDP_PACKET_ =record
  rf60xValArray:array[1..168] of _RF60x_UDP_VALUE_ ;
  wDeviceSerial,wDeviceBaseDistance,wDeviceMeasureRange:WORD;
  bPackCount:byte;
  dwReserved:Cardinal;
  bPacketControlSumm:Byte;
 end;
 
var
 RF60xUDPPACKET:_RF60x_UDP_PACKET_ ;
 LPRF60xUDPPACKET:^_RF60x_UDP_PACKET_ ;
 
RF603_Ethernet_GetStreamMeasure(hHandle,LPRF60xUDPPACKET);
Или
RF603_Ethernet_GetStreamMeasure(hHandle,@RF60xUDPPACKET);
Если не ошибаюсь.
1
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
28.09.2016, 19:58  [ТС]
Большое спасибо за ответ!

Завтра попробую.


Цитата Сообщение от Hikari Посмотреть сообщение
Сообщение от Sergey1990
Здесь вроде все работе, возвращает true.
Хм... А я думала что в качестве параметра нужен var, если передается по указателю.
а что здесь не так?
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.09.2016, 20:03
Цитата Сообщение от Sergey1990 Посмотреть сообщение
а что здесь не так?
Вот это: HANDLE * lpHandle
Это параметр-указатель. Я всегда полагала, что такой параметр в ДЛЛ оформляется в юните как параметр-переменная. Но могу ошибаться.
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
28.09.2016, 21:02  [ТС]
То есть в него нужно что то записать перед открытием порта?

Добавлено через 10 минут
Или другой тип присвоить?
0
18 / 18 / 4
Регистрация: 10.03.2014
Сообщений: 91
28.09.2016, 21:08
Насколько я понял это Триангуляционный лазерный датчик, подключается по протоколу либо RS232 либо RS485(возможно у меня моделька старая).
Выложи rf603.h файл, так проще будет найти в чем заминка.

Ибо в мануале не все иногда описано, тому пример с ВКТ-7 и ТБН
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 09:19  [ТС]
Да, триангуляционный датчик, интерфейс 485+Ethernet, с 485 почти работает, но мне нужно подключить по Ethernet, так как в системе будет 7 датчиков, контроллер, и еще много чего, работающего по Ethernet. Все файлы на работе остались, завтра выложу

Добавлено через 12 часов 6 минут
Совместными усилиями с Hikari написал код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
 
 
type
_RF60x_UDP_VALUE_=record
       wMeasure:Word;
       bstatus: Byte;
     end;
 
    _RF60x_UDP_PACKET_=record
     rf603xValArray:array[1..168] of _RF60x_UDP_VALUE_;
     wDeviceSerial, wDeviceBaseDistance,wDeviceMeasureRange: WORD;
     bPackControlSum: Byte;
      bPackCount: byte;
      dwReserved: Cardinal;
    end;
 
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    Label2: TLabel;
  //  procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
 
 
 
 
var
  Form2: TForm2;
  rf603h,rf603DeviceHandle: THandle;
  st,st2: BOOLEAN;
  RF60xUDPPACKET: _RF60x_UDP_PACKET_;
  LPRF60xUDPPACKET:^_RF60x_UDP_PACKET_;
   wDeviceSerial, wDeviceBaseDistance,wDeviceMeasureRange: WORD;
implementation
 
{$R *.dfm}
    function RF603_Ethernet_GetStreamMeasure (Handle: THandle;   RF60xUDPPACKET:pointer): BOOLEAN; cdecl;
              external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';
 
      function RF60x_Ethernet_OpenPort (lpHandle: THandle): BOOLEAN; cdecl;
    external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';
 
 
 
 
procedure TForm2.Button2Click(Sender: TObject);
begin
 
 
st:= RF60x_Ethernet_OpenPort(rf603h);
if st=true then
 
label1.Caption:='OK';
 st2:=RF603_Ethernet_GetStreamMeasure ( rf603h, @RF60xUDPPACKET) ;
 
                  if st2=true then
label2.Caption:='OK';
 
 edit1.Text:=inttostr(wDeviceSerial);
end;
 
end.
Перестало почему-то работать вот это

Delphi
1
st:= RF60x_Ethernet_OpenPort(rf603h);
выдает Access violation at address ... RF60x.dll ...

Все таки что то не то с rf603h получается. заменяю его на число, допустим 0, RF60x_Ethernet_OpenPort(0) возвращает true, a RF603_Ethernet_GetStreamMeasure - false;

И еще вопрос как оформить вывод, например, wDeviceSerial из _RF60x_UDP_PACKET_ в edit?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.09.2016, 09:42
Цитата Сообщение от Sergey1990 Посмотреть сообщение
BOOL RF60x_Ethernet_OpenPort (
HANDLE * lpHandle
);
Типа ж указатель на HANDLE. Быть может всё же:
Delphi
1
Function RF60x_Ethernet_OpenPort(Var lpHandle: THandle): BooLean; CdeCl; External 'RF60x.dll' Name 'RF60x_Ethernet_OpenPort';
или:
Delphi
1
Function RF60x_Ethernet_OpenPort(lpHandle: PHandle): BooLean; CdeCl; External 'RF60x.dll' Name 'RF60x_Ethernet_OpenPort';
?
Цитата Сообщение от Sergey1990 Посмотреть сообщение
И еще вопрос как оформить вывод, например, wDeviceSerial из _RF60x_UDP_PACKET_ в edit?
эм... У вас же вроде это сделано.

Добавлено через 13 минут
А насчёт CdeCl вы уверены? Это где-то явно указано в документации?
1
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 09:42  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
DelphiВыделить код

Function RF60x_Ethernet_OpenPort(Var lpHandle: THandle): BooLean; CdeCl; External 'RF60x.dll' Name 'RF60x_Ethernet_OpenPort';
Спасибо, помогло.

Но RF603_Ethernet_GetStreamMeasure возвращает по-прежнему false;

Цитата Сообщение от BOGG ART Посмотреть сообщение
Сообщение от Sergey1990
И еще вопрос как оформить вывод, например, wDeviceSerial из _RF60x_UDP_PACKET_ в edit?
эм... У вас же вроде это сделано.
Я думаю не правильно, потому что wDeviceSerial говорит что не объявлена, хотя

Delphi
1
2
3
4
5
6
 _RF60x_UDP_PACKET_=record
     rf603xValArray:array[1..168] of _RF60x_UDP_VALUE_;
    [B] wDeviceSerial, wDeviceBaseDistance,wDeviceMeasureRange: WORD;[/B]
     bPackControlSum: Byte;
      bPackCount: byte;
      dwReserved: Cardinal;
Пришлось еще раз объявлять


Delphi
1
2
3
4
5
6
7
var
  Form2: TForm2;
  rf603h,rf603DeviceHandle: THandle;
  st,st2: BOOLEAN;
  RF60xUDPPACKET: _RF60x_UDP_PACKET_;
  LPRF60xUDPPACKET:^_RF60x_UDP_PACKET_;
   [B]wDeviceSerial, wDeviceBaseDistance,wDeviceMeasureRange: WORD;[/B]
Правильно ли это?
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 09:56  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
А насчёт CdeCl вы уверены? Это где-то явно указано в документации?
Не уверен)) в описание этого вроде нет. Прикрепил мануал, про эти функции - 38-я страница
Вложения
Тип файла: pdf rf603_riftek_67250.pdf (2.01 Мб, 16 просмотров)
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.09.2016, 10:46

Не по теме:

Не используйте теги вроде [B] в коде, оно там не работает.

  • Зачем вам глобальные переменные? Тут они не нужны.
  • Зачем вам вообще переменные "wDeviceSerial, wDeviceBaseDistance, wDeviceMeasureRange"? Они же как часть пакета идут.
Кстати, найдите суперкосяк:
Цитата Сообщение от Sergey1990 Посмотреть сообщение
Delphi
1
2
3
4
function RF603_Ethernet_GetStreamMeasure (Handle: THandle; * RF60xUDPPACKET:pointer): BOOLEAN; cdecl;
      external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';
function RF60x_Ethernet_OpenPort (lpHandle: THandle): BOOLEAN; cdecl;
      external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';


Добавлено через 10 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Unit
      Unit2;
 
Interface
 
Uses
      Windows,
      Messages,
      SysUtils,
      Variants,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      StdCtrls;
 
Type
      PRF60xUDPValue = ^TRF60xUDPValue;
      _RF60x_UDP_VALUE_ = { Packed ? } Record
            wMeasure: Word;
            bStatus: Byte;
      End;
      TRF60xUDPValue = _RF60x_UDP_VALUE_;
      PRF60xUDPPacket = ^TRF60xUDPPacket;
      _RF60x_UDP_PACKET_ = { Packed ? } Record
            rf60xValArray: Array [0..168-1] Of TRF60xUDPValue;
            wDeviceSerial: WORD;
            wDeviceBaseDistance: WORD;
            wDeviceMeasureRange: WORD;
            bPackCount: Byte;
            dwReserved: DWORD;
            bPackControlSum: Byte;
      End;
      TRF60xUDPPacket = _RF60x_UDP_PACKET_;
 
Type
      TForm2 = Class(TForm)  
            Label1: TLabel;
            Label2: TLabel;
            Button1: TButton;
            Button2: TButton;
            Edit1: TEdit;
            Procedure FormCreate(Sender: TObject);
            Procedure Button1Click(Sender: TObject);
            Procedure Button2Click(Sender: TObject);
      Private { Private declarations }
            rf603h: THandle;
            rf603DeviceHandle: THandle;
            // RF60xUDPPACKET: TRF60xUDPPacket; // Можно тут объявить, но надо ли? Может локальной в нужных процедурах логичнее?
      Public { Public declarations }
      End;
 
Var
      Form2: TForm2;
 
Function RF60x_Ethernet_OpenPort(Var lpHandle: THandle): BooLean; CdeCl; External 'RF60x.dll' Name 'RF60x_Ethernet_OpenPort';
Function RF60x_Ethernet_GetStreamMeasure(Handle: THandle; Var RF60xUDPPacket: TRF60xUDPPacket): BooLean; CdeCl; External 'RF60x.dll' Name 'RF60x_Ethernet_GetStreamMeasure';
 
Implementation
 
{$R *.dfm}
 
Procedure TForm2.FormCreate(Sender: TObject);
Begin
rf603h:=0;
rf603DeviceHandle:=0;
DoubleBuffered:=True;
End;
 
Procedure TForm2.Button1Click(Sender: TObject);
Begin
//
End;
 
Procedure TForm2.Button2Click(Sender: TObject);
Var RF60xUDPPACKET: TRF60xUDPPacket;
Begin
Label1.Caption:='';
Label2.Caption:='';
Edit1.Text:='';
If RF60x_Ethernet_OpenPort(rf603h) Then
      Begin
      Label1.Caption:='OK';
      If RF60x_Ethernet_GetStreamMeasure(rf603h, RF60xUDPPACKET) Then
            Begin
            Label2.Caption:='OK';
            Edit1.Text:=IntToStr(RF60xUDPPACKET.wDeviceSerial);
            // CloseStream ?
            End
      Else
            Label2.Caption:='Failed';
      // ClosePort ?
      End
Else
      Label1.Caption:='Failed';
End;
 
End.
Добавлено через 19 минут
Пардон,
Delphi
1
2
3
Function RF60x_Ethernet_OpenPort(Var lpHandle: THandle): BOOL; {calling convention}; External 'RF60x.dll' Name 'RF60x_Ethernet_OpenPort';
Function RF60x_Ethernet_ClosePort(hHandle: THandle): BOOL; {calling convention}; External 'RF60x.dll' Name 'RF60x_Ethernet_ClosePort';
Function RF60x_Ethernet_GetStreamMeasure(hHandle: THandle; Var RF60xUDPPacket: TRF60xUDPPacket): BOOL; {calling convention}; External 'RF60x.dll' Name 'RF60x_Ethernet_GetStreamMeasure';
Где {calling convention} одно из: CdeCl, Pascal, StdCall, SafeCall, FastCall, ThisCall.
В описании не нашёл явного указания. Вероятнее всего CdeCl / StdCall.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
29.09.2016, 10:52
Если верить их собственным примерам на Дельфи, то cdecl
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 13:23  [ТС]
BOGG ART, Спасибо, почти работает, обе функции возвращают True, но
Delphi
1
Edit1.Text:=IntToStr(RF60xUDPPACKET.wDeviceSerial);
выдает 0, так же как и любые другие переменные из этого пакета. С чем это может быть связано?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.09.2016, 13:29
У вас Name всюду верное прописано? x86? Packed ставить пробовали? Разные {calling convention} подставлять?

Добавлено через 1 минуту
Можно вместо вместо "передачи параметра как Var" явно прописать указатели (PHandle и PRF60xUDPPacket), мало ли чего.
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 15:04  [ТС]
x64
Ошибся в Name.

Сейчас в приходят данные, но не те. Серийный номер устройства 21092, а выдает 46249

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
 
 
type
  PRF60xUDPValue = ^TRF60xUDPValue;
      _RF60x_UDP_VALUE_ = { Packed ? } Record
            wMeasure: Word;
            bStatus: Byte;
      End;
      TRF60xUDPValue = _RF60x_UDP_VALUE_;
      PRF60xUDPPacket = ^TRF60xUDPPacket;
      _RF60x_UDP_PACKET_ = { Packed ? } Record
            rf60xValArray: Array [0..168-1] Of TRF60xUDPValue;
            wDeviceSerial: WORD;
            wDeviceBaseDistance: WORD;
            wDeviceMeasureRange: WORD;
            bPackCount: Byte;
            dwReserved: DWORD;
            bPackControlSum: Byte;
      End;
      TRF60xUDPPacket = _RF60x_UDP_PACKET_;
 
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    Label2: TLabel;
  //  procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
 
  rf603h: THandle;
            rf603DeviceHandle: THandle;
    { Private declarations }
  public
    { Public declarations }
  end;
 
 
 
 
 
var
  Form2: TForm2;
 // rf603h,rf603DeviceHandle: THandle;
  st,st2: BOOLEAN;
 
 
implementation
 
{$R *.dfm}
 
 
     Function RF603_Ethernet_GetStreamMeasure(Handle: THandle; Var RF60xUDPPacket: TRF60xUDPPacket): BooLean; CdeCl;
     External 'RF60x.dll' Name 'RF603_Ethernet_GetStreamMeasure';
 
     function RF60x_Ethernet_OpenPort (var lpHandle: THandle): BOOLEAN; cdecl;
    external 'RF60x.dll' name 'RF60x_Ethernet_OpenPort';
 
 
 
procedure TForm2.Button2Click(Sender: TObject);
Var RF60xUDPPACKET: TRF60xUDPPacket;
begin
 
 
Label1.Caption:='';
Label2.Caption:='';
Edit1.Text:='';
If RF60x_Ethernet_OpenPort(rf603h) Then
      Begin
      Label1.Caption:='OK';
      If RF603_Ethernet_GetStreamMeasure(rf603h, RF60xUDPPACKET) Then
            Begin
            Label2.Caption:='OK';
            Edit1.Text:=IntToStr(RF60xUDPPACKET.wDeviceSerial);
            // CloseStream ?
            End
      Else
            Label2.Caption:='Failed';
      // ClosePort ?
      End
Else
      Label1.Caption:='Failed';
 
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
rf603h:=0;
rf603DeviceHandle:=0;
DoubleBuffered:=True;
end;
 
end.
Что то с кодировкой?

Добавлено через 16 минут
На Packed кстати ругается
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.09.2016, 15:14
Это же не текст, это число. Может как раз смещение не то.
Цитата Сообщение от Sergey1990 Посмотреть сообщение
На Packed кстати ругается
Вариант 1
Delphi
1
_RF60x_UDP_VALUE_ = Record
Вариант 2
Delphi
1
_RF60x_UDP_VALUE_ = Packed Record
Добавлено через 25 секунд
и так обе структуры чтоб одинаково **
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 15:29  [ТС]
Спасибо, все получилось!
и надеюсь последний вопрос, как мне вывести массив данных?
Delphi
1
Edit1.Text:=IntToStr(RF60xUDPPACKET.rf60xValArray[1]);
не работает, при компиляции пишет что inttostr не может быть вызван с таким аргументом
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.09.2016, 16:38
Лучший ответ Сообщение было отмечено Sergey1990 как решение

Решение

У вас там промелькнуло "uses Winapi.Windows, ...", видимо Делфи относительно новая.
Я тестер самодельной IDE, она уметь сама генерирование ToString(). Попробуйте-ка такую фишку:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Type
      PRF60xUDPValue = ^TRF60xUDPValue;
      _RF60x_UDP_VALUE_ = { Packed } Record
            wMeasure: Word;
            bStatus: Byte;
            Function ToJSON(): String;
      End;
      TRF60xUDPValue = _RF60x_UDP_VALUE_;
      PRF60xUDPPacket = ^TRF60xUDPPacket;
      _RF60x_UDP_PACKET_ = { Packed } Record
            rf60xValArray: Array [0..168-1] Of TRF60xUDPValue;
            wDeviceSerial: WORD;
            wDeviceBaseDistance: WORD;
            wDeviceMeasureRange: WORD;
            bPackCount: Byte;
            dwReserved: DWORD;
            bPackControlSum: Byte;
            Function ToJSON(): String;
      End;
      TRF60xUDPPacket = _RF60x_UDP_PACKET_;
 
.....
 
Implementation
 
.....
 
Function _RF60x_UDP_VALUE_.ToJSON(): String;
Begin
Result:='{ wMeasure: '+IntToStr(wMeasure)+', bStatus: '+IntToStr(bStatus)+' }';
End;
 
Function _RF60x_UDP_PACKET_.ToJSON(): String;
Var i: Integer;
Begin
Result:='{'#13#10'   rf60xValArray: {';
For i:=Low(rf60xValArray) To High(rf60xValArray) Do
      Begin
      Result:=Result+#13#10'      "'+IntToStr(i)+'": '+rf60xValArray[i].ToJSON();
      If i<High(rf60xValArray) Then
            Result:=Result+',';
      End;
Result:=Result+#13#10'   },';
Result:=Result+#13#10'   wDeviceSerial: '+IntToStr(wDeviceSerial)+',';
Result:=Result+#13#10'   wDeviceBaseDistance: '+IntToStr(wDeviceBaseDistance)+',';
Result:=Result+#13#10'   wDeviceMeasureRange: '+IntToStr(wDeviceMeasureRange)+',';
Result:=Result+#13#10'   bPackCount: '+IntToStr(bPackCount)+',';
Result:=Result+#13#10'   dwReserved: '+IntToStr(dwReserved)+',';
Result:=Result+#13#10'   bPackControlSum: '+IntToStr(bPackControlSum);
Result:=Result+#13#10'}';
End;
Если не позволит - то перепишите как просто функции принимающие соответствующую запись в параметрах.
И как-то так:
Delphi
1
ShowMessage(RF60xUDPPacket.ToJSON());
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
29.09.2016, 19:51  [ТС]
Hikari, BOGG ART, northener, sairex, огромное спасибо за помощь, все работает как надо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2016, 19:51
Помогаю со студенческими работами здесь

Как правильно вызвать функцию из dll на С++?
Добрый вечер. Подскажите, пожалуйста, как описать функции в дельфи-проекте если имеется dll которая описана следующим образом: #include...

Как написать функцию в ActiveX DLL и как её использовать в другой проге?
Как написать функцию в ActiveX DLL и как её использовать в другой проге, ну допустим как апи: Declare Function имя Lib 'DLL'ка'...

Как правильно использовать одну функцию внутри другой?
Доброго времени суток. Функция func1() должна поменять переменную var1 внутри функции func2. &lt;? function func1(){ $var1 ++; ...

Как правильно использовать функцию RANK для подсчитываемых полей
Здравствуйте. Само задание звучит так: Для каждого района показать его ранг (место) в списках ранжирования по: – количеству...

Можно ли в одной dll использовать функцию из другой?
Можно в длл использовать функцию из другой?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru