5961 / 4537 / 1094
Регистрация: 29.08.2013
Сообщений: 28,145
Записей в блоге: 3

Бесплатные компоненты

25.08.2017, 16:39. Показов 59471. Ответов 73

Студворк — интернет-сервис помощи студентам
Компоненты

tdbf Packages for Delphi 10.2 - компонент для работы с DBF
ссылка на компонент

ZXing Barcode Scanning Library for Delphi XE to 10.2 Tokyo - компонент для работы со штрихкодами
ссылка на компонент

ZEXMLSS - работа с файлами OpenDocument Format (ods)/Excel XML Spreadsheet/Office Open XML (xlsx) без установленного Excel-а/OO Calc-а.
ссылка на компонет

TscExcelExport - экспорт в Эксель
ссылка на компонент

ZColorStringGrid - StringGrid с возможностью выравнивания текста в ячейке по горизонтали и вертикали, объединением ячеек, поворотом текста в ячейке и др
ссылка на компонет

JCL & JVCL - огромный набор разнообразных компонентов вместе с графическим инсталятором
JCL
JVCL

Virtual-TreeView - очень крутая штука, сочетающая и TreeView и grid и ListView
ссылка на компонент
описание как готовить

alphaskins - наши любимые красивости. но кроме тем есть еще неплохие компоненты в комплекте
ссылка на компонент (для русских бесплатно)

OmniThreadLibrary - библиотека для работы с потоками
ссылка на компонент

Не по теме:

вся литература на английском, на русском есть платная книжка :)



RxLibrary - сборник компонентов
ссылка на компонент




Так же хочу посоветовать вот этот блог - THE ROAD TO DELPHI
  • Отличные работы по VCL Styles (стили для любых стандартных компонентов),
  • Delphi IDE Colorizer (раскрашиваем IDE как хотим),
  • TSMBIOS (работаем с биосом),
  • Network List Manager (NLM) API (работа с сетевыми интерфейсами),
  • NC Buttons (кнопки в заголовке)
... ну и многое другое


PS если есть вопросы по компонентам - задавайте в основной ветке.
тут пишите только если кривые ссылки или есть что дополнить
6
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2017, 16:39
Ответы с готовыми решениями:

Есть ли бесплатные версии среды Delphi?
Например, у Майкрософта есть Express версия Visual студии. Есть ли бесплатные реализации Delphi, но с графическим интерфейсом, как...

Существуют ли бесплатные версии Delphi, работающие под win XP x86?
Доброго здравия всем! Подскажите по сабжу, будьте добры? Пробовал разные версии, но они даже не ставятся- сразу ругают старую...

Бесплатные компоненты с фильтрами DBGrid как в Excel
Добрый день, подскажите есть ли бесплатные компоненты с фильтрами для DBGrid как в Excel для современных делфей? Если есть то как...

73
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
22.01.2021, 16:53
Студворк — интернет-сервис помощи студентам
На вкус и цвет... Лично меня абсолютно устраивает его работа, а вот как реализовать сие - это уже авторское видение. Событие OnPaint тоже срабатывает часто, но не смущает же это.

Добавлено через 1 минуту
А вообще пора бы эту дискуссию в отдельную темку перенести.
0
5961 / 4537 / 1094
Регистрация: 29.08.2013
Сообщений: 28,145
Записей в блоге: 3
22.01.2021, 21:18  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
А зачем писать, если уже есть готовая?
http://docwiki.embarcadero.com... s_(FireDAC)
ну такое
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
02.02.2021, 14:49
Кому интересно... )
0
 Аватар для 777petruh
10 / 7 / 3
Регистрация: 11.08.2021
Сообщений: 107
17.08.2021, 04:01
Доброго времени суток. Постараюсь внести свой вклад.
Компонент для работы с COM портом
comport411f
Компонент для шифрования строк, потоков и вычисления hash.
DCPCrypt
Тут писали про это. Но ссылка не актуальная
TChromium и инструкция как устанавливать тут.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
03.07.2022, 01:01
Тут регулярно задают вопросы о "свежих" версиях Indy для ранних версий Дельфи. Так вот хочу дать ссылку на такой ресурс
Indy
На сегодняшний день присутствуют библиотеки для версий Дельфи от 7 до 10.4
По тому что написано на сайте все библиотеки обновляются до самой свежей версии Indy.
В работоспособности и "свежести" убедился сам поставив её на свою Д2007. После чего моя старая но очень для меня важная программа снова смогла высылать по почте отчеты. Стандартная Indy10 для Д2007 не очень грамотно работала с SSL протоколами.

P.S. Эти версии библиотек имхо созданы ДСП той фирмы, которая решила ими бесплатно поделиться. Поэтому они распространяются в полностью скомпилированном виде и разумеется без исходников.
P.P.S. Имеются в наличии и библиотеки для аналогичных версий C++ Builder'а

Добавлено через 5 минут
Странно. Хотел создать топик в "Бесплатных компонентах", но тема оказалась тут. Прошу модераторов её перенести туда, где ей и положено быть.
0
Злостный нарушитель
 Аватар для Verevkin
10263 / 5687 / 1266
Регистрация: 12.03.2015
Сообщений: 26,367
03.07.2022, 01:24
Цитата Сообщение от northener Посмотреть сообщение
Эти версии библиотек имхо созданы ДСП той фирмы, которая решила ими бесплатно поделиться. Поэтому они распространяются в полностью скомпилированном виде и разумеется без исходников.
Это может называться как угодно, кроме "поделиться".
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
03.07.2022, 01:47
Цитата Сообщение от Verevkin Посмотреть сообщение
Это может называться как угодно, кроме "поделиться".
На безрыбьи... грех жаловаться. Да и зачем мне исходники Инди? Лезть в её глубины отладчиком - это только в страшном сне может присниться.
И ведь работает!
Причем работает даже на WinXP!
0
Злостный нарушитель
 Аватар для Verevkin
10263 / 5687 / 1266
Регистрация: 12.03.2015
Сообщений: 26,367
03.07.2022, 01:56
Цитата Сообщение от northener Посмотреть сообщение
На безрыбьи...
Да неужели нет опенсорса?
Internet component suite, например?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
03.07.2022, 02:32
Цитата Сообщение от Verevkin Посмотреть сообщение
Да неужели нет опенсорса?
Internet component suite, например?
Есть. Но пока им занимался Franзois PIETTE все было хорошо. Это вообще моя любимая с молодости библиотека. Она тогда даже и не имела имени ICS. Это была первая библиотека для Дельфи, которая работала с сетью. Я даже Франсуа как-то послал открытку с видом Москвы, как он всех просил для своей дочери.
Но после того как Франсуа отдал своей проект на Github они пошли другой дорогой, которая мне мало понятна. Да, приложение написанное с помощью ICS на DCE10.4.2 нормально отсылает письма на Яндекс почту. Но только не из WinXP.
0
Злостный нарушитель
 Аватар для Verevkin
10263 / 5687 / 1266
Регистрация: 12.03.2015
Сообщений: 26,367
03.07.2022, 11:54
Цитата Сообщение от northener Посмотреть сообщение
Но после того как Франсуа отдал своей проект на Github они пошли другой дорогой, которая мне мало понятна. Да, приложение написанное с помощью ICS на DCE10.4.2 нормально отсылает письма на Яндекс почту. Но только не из WinXP.
Зато исходник есть, и если что-то не устраивает, можно засучить рукава и доработать напильником или кувалдой. Мне пришлось это делать неоднократно, это и есть работа программиста, понимаешь?
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
{ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- }
{
 
    Author:                Franзois PIETTE
    Спёрто мной :)        2016-07-12 12:26:10
    И допилено напильником!
 
  А для 64-битной версии пришлось допиливать повторно.
  Конечно, можно плюхнуть компонент из пакета ICS на форму, но он тащит за собой
  кучу модулей и неприлично увеличивает размер ЕХЕшника.
  Поэтому, наткнувшись на факт ошибки в 64-битной версии программы, я полазил
  по интернетам, почитал MSDN, поковырял код в дебаггере и всё наладилось.
 
                                                  Verevkin, 2019-10-09 20:39:50.   }
{ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- }
 
unit uICMPSocket;
 
interface
 
{$REGION 'uses'}
uses
  //=================== Системные модули, добавленные вручную ==================
  Windows, IpExport, Messages, SysUtils, Classes, WinSock;
{$ENDREGION}
 
{$REGION 'const'}
const
  IcmpVersion = 102;
  IcmpDLL     = 'icmp.dll';
 
  // IP status codes returned to transports and user IOCTLs.
  IP_SUCCESS                  = 0;
  IP_STATUS_BASE              = 11000;
  IP_BUF_TOO_SMALL            = (IP_STATUS_BASE + 1);
  IP_DEST_NET_UNREACHABLE     = (IP_STATUS_BASE + 2);
  IP_DEST_HOST_UNREACHABLE    = (IP_STATUS_BASE + 3);
  IP_DEST_PROT_UNREACHABLE    = (IP_STATUS_BASE + 4);
  IP_DEST_PORT_UNREACHABLE    = (IP_STATUS_BASE + 5);
  IP_NO_RESOURCES             = (IP_STATUS_BASE + 6);
  IP_BAD_OPTION               = (IP_STATUS_BASE + 7);
  IP_HW_ERROR                 = (IP_STATUS_BASE + 8);
  IP_PACKET_TOO_BIG           = (IP_STATUS_BASE + 9);
  IP_REQ_TIMED_OUT            = (IP_STATUS_BASE + 10);
  IP_BAD_REQ                  = (IP_STATUS_BASE + 11);
  IP_BAD_ROUTE                = (IP_STATUS_BASE + 12);
  IP_TTL_EXPIRED_TRANSIT      = (IP_STATUS_BASE + 13);
  IP_TTL_EXPIRED_REASSEM      = (IP_STATUS_BASE + 14);
  IP_PARAM_PROBLEM            = (IP_STATUS_BASE + 15);
  IP_SOURCE_QUENCH            = (IP_STATUS_BASE + 16);
  IP_OPTION_TOO_BIG           = (IP_STATUS_BASE + 17);
  IP_BAD_DESTINATION          = (IP_STATUS_BASE + 18);
 
  // status codes passed up on status indications.
  IP_ADDR_DELETED             = (IP_STATUS_BASE + 19);
  IP_SPEC_MTU_CHANGE          = (IP_STATUS_BASE + 20);
  IP_MTU_CHANGE               = (IP_STATUS_BASE + 21);
 
  IP_GENERAL_FAILURE          = (IP_STATUS_BASE + 50);
 
  MAX_IP_STATUS               = IP_GENERAL_FAILURE;
 
  IP_PENDING                  = (IP_STATUS_BASE + 255);
 
  // IP header flags
  IP_FLAG_DF                  = $02;         // Don't fragment this packet.
 
  // IP Option Types
  IP_OPT_EOL                  = $00;         // End of list option
  IP_OPT_NOP                  = $01;         // No operation
  IP_OPT_SECURITY             = $82;         // Security option.
  IP_OPT_LSRR                 = $83;         // Loose source route.
  IP_OPT_SSRR                 = $89;         // Strict source route.
  IP_OPT_RR                   = $07;         // Record route.
  IP_OPT_TS                   = $44;         // Timestamp.
  IP_OPT_SID                  = $88;         // Stream ID (obsolete)
  MAX_OPT_SIZE                = $40;
{$ENDREGION}
 
{$REGION 'общие типы'}
type
  // IP types
  TIPAddr   = LongInt;   // An IP address.
  TIPMask   = LongInt;   // An IP subnet mask.
  TIPStatus = LongInt;   // Status code returned from IP APIs.
 
type
  // IcmpCreateFile:
  //     Opens a handle on which ICMP Echo Requests can be issued.
  // Arguments:
  //     None.
  // Return Value:
  //     An open file handle or INVALID_HANDLE_VALUE. Extended error information
  //     is available by calling GetLastError().
  TIcmpCreateFile  = function: THandle; stdcall;
 
  // IcmpCloseHandle:
  //     Closes a handle opened by ICMPOpenFile.
  // Arguments:
  //     IcmpHandle  - The handle to close.
  // Return Value:
  //     TRUE if the handle was closed successfully, otherwise FALSE. Extended
  //     error information is available by calling GetLastError().
  TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
 
  // IcmpSendEcho:
  //     Sends an ICMP Echo request and returns one or more replies. The
  //     call returns when the timeout has expired or the reply buffer
  //     is filled.
  // Arguments:
  //     IcmpHandle         - An open handle returned by ICMPCreateFile.
  //     DestinationAddress - The destination of the echo request.
  //     RequestData        - A buffer containing the data to send in the
  //                          request.
  //     RequestSize        - The number of bytes in the request data buffer.
  //     RequestOptions     - Pointer to the IP header options for the request.
  //                          May be NULL.
  //     ReplyBuffer        - A buffer to hold any replies to the request.
  //                          On return, the buffer will contain an array of
  //                          ICMP_ECHO_REPLY structures followed by options
  //                          and data. The buffer should be large enough to
  //                          hold at least one ICMP_ECHO_REPLY structure
  //                          and 8 bytes of data - this is the size of
  //                          an ICMP error message.
  //     ReplySize          - The size in bytes of the reply buffer.
  //     Timeout            - The time in milliseconds to wait for replies.
  // Return Value:
  //     Returns the number of replies received and stored in ReplyBuffer. If
  //     the return value is zero, extended error information is available
  //     via GetLastError().
  TIcmpSendEcho    = function(IcmpHandle:          THandle;
                              DestinationAddress:  TIPAddr;
                              RequestData:         Pointer;
                              RequestSize:         Word;
                              RequestOptions:      PIPOptionInformation;
                              ReplyBuffer:         Pointer;
                              ReplySize:           DWord;
                              Timeout:             DWord
                             ): DWord; stdcall;
 
  TPingResult = (prUnknown, prInProgress, prHostOnline, prHostOffline);
  TICMPException = class(Exception);
{$ENDREGION}
 
{$REGION 'типы событий'}
  // Event handler type declaration for TICMP.OnDisplay event.
  TICMPDisplay = procedure(Sender: TObject; Msg : String) of object;
  TICMPReply   = procedure(Sender: TObject; Error : Integer) of object;
{$ENDREGION}
 
{$REGION 'TICMPSocket = class(TObject)'}
// The object wich encapsulate the ICMP.DLL
type
  TICMPSocket = class(TObject)
  private
    hICMPdll :        HModule;                    // Handle for ICMP.DLL
    IcmpCreateFile :  TIcmpCreateFile;
    IcmpCloseHandle : TIcmpCloseHandle;
    IcmpSendEcho :    TIcmpSendEcho;
    hICMP :           THandle;                    // Handle for the ICMP Calls
    FReply :          TIcmpEchoReply;             // ICMP Echo reply buffer
    FAddress :        String;                     // Address given
    FHostName :       String;                     // Dotted IP of host (output)
    FHostIP :         String;                     // Name of host      (Output)
    FIPAddress :      TIPAddr;                    // Address of host to contact
    FSize :           Integer;                    // Packet size (default to 56)
    FTimeOut :        Integer;                    // Timeout (default to 4000mS)
    FTTL :            Integer;                    // Time To Live (for send)
    FFlags :          Integer;                    // Options flags
    FOnDisplay :      TICMPDisplay;               // Event handler to display
    FOnEchoRequest :  TNotifyEvent;
    FOnEchoReply :    TICMPReply;
    FLastError :      DWORD;                      // After sending ICMP packet
    FAddrResolved :   Boolean;
    procedure ResolveAddr;
  public
    constructor Create; virtual;
    destructor  Destroy; override;
    function    Ping : Integer;
    procedure   SetAddress(Value : String);
    function    GetErrorString : String;
 
    property Address       : String         read  FAddress   write SetAddress;
    property Size          : Integer        read  FSize      write FSize;
    property Timeout       : Integer        read  FTimeout   write FTimeout;
    property Reply         : TIcmpEchoReply read  FReply;
    property TTL           : Integer        read  FTTL       write FTTL;
    Property Flags         : Integer        read  FFlags     write FFlags;
    property ErrorCode     : DWORD          read  FLastError;
    property ErrorString   : String         read  GetErrorString;
    property HostName      : String         read  FHostName;
    property HostIP        : String         read  FHostIP;
    property OnDisplay     : TICMPDisplay   read  FOnDisplay write FOnDisplay;
    property OnEchoRequest : TNotifyEvent   read  FOnEchoRequest
                                            write FOnEchoRequest;
    property OnEchoReply   : TICMPReply     read  FOnEchoReply
                                            write FOnEchoReply;
  end;
{$ENDREGION}
 
{$REGION 'TPingThread = class(TThread)'}
type
    TPingThread = class(TThread)
    private
        FIcmp: TICMPSocket;
    public
        PingHostName: string ;      // host name or IP address to ping
        PingLookupReply: boolean ;  // if true, ReplyAddress is reverse DNS looked-up to ReplyHostName
        PingSize: Integer ;         // bytes of data to ping
        PingTimeout: Integer ;      // milliseconds ping timeout
        PingTTL: Integer ;          // ping Time To Live, to stop ping short of host
        PingFlags: Integer ;        // ping options
        PingId: integer ;           // available in terminate event to distinguish multiple pings
        PingThreadNum: integer ;    // thread number (not ThreadId) to used in terminate event to remove thread
        DnsHostIP: String ;         // IP address looked up for PingHostName
        ReplyIPAddr: String ;       // Replying IP address (integer)
        ReplyStatus: DWORD ;        // IP status value
        ReplyRTT: DWORD ;           // Round Trip Time in milliseconds
        ReplyDataSize: Word ;       // Reply data size
        ReplyTotal: integer ;       // Number of replies to ping
        ReplyHostName: String ;     // Reply host name (if PingLookupReply=true)
        ErrCode: Integer ;          // non-zero ping or DNS error
        ErrString: String ;         // error literal if errcode non-zero
 
        procedure Execute; override;
    public
        property ReturnValue; // (+21 ноя 2020)
    end;
{$ENDREGION}
 
{$REGION 'глобальные переменные'}
var
// list of thread Ids allocated for TPingThread, so they can be stopped
    PingThreadList: array of Cardinal;
{$ENDREGION}
 
{$REGION 'прототипы'}
function PingAddThread (ThreadId: Cardinal): integer ;
procedure PingRemoveThread (ThreadNum: integer) ;
procedure PingTerm1Thread (ThreadNum: integer) ;
procedure PingTermAllThreads ;
function LongAddr2Dotted (IPAddr: string): string ;
{$ENDREGION}
 
implementation
 
uses uWinsockUtils;
 
{$REGION 'TICMPSocket'}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TICMPSocket.Create;
var
    WSAData: TWSAData;
begin
    hICMP    := INVALID_HANDLE_VALUE;
    FSize    := 56;
    FTTL     := 64;
    FTimeOut := 4000;
 
    // initialise winsock
    if WSAStartup($101, WSAData) <> 0 then
        raise TICMPException.Create('Error initialising Winsock');
 
    // register the icmp.dll stuff
    hICMPdll := LoadLibrary(icmpDLL);
    if hICMPdll = 0 then
        raise TICMPException.Create('Unable to register ' + icmpDLL);
 
    @ICMPCreateFile  := GetProcAddress(hICMPdll, 'IcmpCreateFile');
    @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
    @IcmpSendEcho    := GetProcAddress(hICMPdll, 'IcmpSendEcho');
 
    if (@ICMPCreateFile = Nil) or
       (@IcmpCloseHandle = Nil) or
       (@IcmpSendEcho = Nil) then
          raise TICMPException.Create('Error loading dll functions');
 
    hICMP := IcmpCreateFile;
    if hICMP = INVALID_HANDLE_VALUE then
        raise TICMPException.Create('Unable to get ping handle');
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
destructor TICMPSocket.Destroy;
begin
    if hICMP <> INVALID_HANDLE_VALUE then
        IcmpCloseHandle(hICMP);
    if hICMPdll <> 0 then
        FreeLibrary(hICMPdll);
    WSACleanup;
    inherited Destroy;
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function MinInteger(X, Y: Integer): Integer;
begin
    if X >= Y then
        Result := Y
    else
        Result := X;
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TICMPSocket.ResolveAddr;
var
    Phe : PHostEnt;             // HostEntry buffer for name lookup
begin
    // Convert host address to IP address
    FIPAddress := inet_addr(PChar(FAddress));
    if FIPAddress <> LongInt(INADDR_NONE) then
        // Was a numeric dotted address let it in this format
        FHostName := FAddress
    else begin
        // Not a numeric dotted address, try to resolve by name
        Phe := GetHostByName(PChar(FAddress));
        if Phe = nil then begin
            FLastError := GetLastError;
            if Assigned(FOnDisplay) then
                FOnDisplay(Self, 'Unable to resolve ' + FAddress);
            Exit;
        end;
 
        FIPAddress := longint(plongint(Phe^.h_addr_list^)^);
        FHostName  := string(Phe^.h_name);
    end;
 
    FHostIP       := inet_ntoa(TInAddr(FIPAddress));  //StrPas(inet_ntoa(TInAddr(FIPAddress)));
    FAddrResolved := TRUE;
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TICMPSocket.SetAddress(Value : String);
begin
    // Only change if needed (could take a long time)
    if FAddress = Value then
        Exit;
    FAddress      := Value;
    FAddrResolved := FALSE;
//    ResolveAddr;
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TICMPSocket.GetErrorString : String;
begin
    case FLastError of
    IP_SUCCESS:               Result := 'No error';
    IP_BUF_TOO_SMALL:         Result := 'Buffer too small';
    IP_DEST_NET_UNREACHABLE:  Result := 'Destination network unreachable';
    IP_DEST_HOST_UNREACHABLE: Result := 'Destination host unreachable';
    IP_DEST_PROT_UNREACHABLE: Result := 'Destination protocol unreachable';
    IP_DEST_PORT_UNREACHABLE: Result := 'Destination port unreachable';
    IP_NO_RESOURCES:          Result := 'No resources';
    IP_BAD_OPTION:            Result := 'Bad option';
    IP_HW_ERROR:              Result := 'Hardware error';
    IP_PACKET_TOO_BIG:        Result := 'Packet too big';
    IP_REQ_TIMED_OUT:         Result := 'Request timed out';
    IP_BAD_REQ:               Result := 'Bad request';
    IP_BAD_ROUTE:             Result := 'Bad route';
    IP_TTL_EXPIRED_TRANSIT:   Result := 'TTL expired in transit';
    IP_TTL_EXPIRED_REASSEM:   Result := 'TTL expired in reassembly';
    IP_PARAM_PROBLEM:         Result := 'Parameter problem';
    IP_SOURCE_QUENCH:         Result := 'Source quench';
    IP_OPTION_TOO_BIG:        Result := 'Option too big';
    IP_BAD_DESTINATION:       Result := 'Bad Destination';
    IP_ADDR_DELETED:          Result := 'Address deleted';
    IP_SPEC_MTU_CHANGE:       Result := 'Spec MTU change';
    IP_MTU_CHANGE:            Result := 'MTU change';
    IP_GENERAL_FAILURE:       Result := 'General failure';
    IP_PENDING:               Result := 'Pending';
    else
        Result := 'ICMP error #' + IntToStr(FLastError);
    end;
end;
 
 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TICMPSocket.Ping : Integer;
var
  BufferSize:        Integer;
  pReqData, pData:   Pointer;
  pIPE:              PIcmpEchoReply;       // ICMP Echo reply buffer
  IPOpt:             TIPOptionInformation; // IP Options for packet to send
  Msg:               String;
begin
    Result     := 0;
    FLastError := 0;
 
    if not FAddrResolved then
        ResolveAddr;
 
    if FIPAddress = LongInt(INADDR_NONE) then begin
        FLastError := IP_BAD_DESTINATION;
        if Assigned(FOnDisplay) then
            FOnDisplay(Self, 'Invalid host address');
        Exit;
    end;
 
    // Allocate space for data buffer space
    BufferSize := SizeOf(TICMPEchoReply) + FSize;
    GetMem(pReqData, FSize);
    GetMem(pData,    FSize);
    GetMem(pIPE,     BufferSize);
 
    try
        // Fill data buffer with some data bytes
        FillChar(pReqData^, FSize, $20);
        Msg := 'Pinging from Delphi code written by F. Piette';
        Move(Msg[1], pReqData^, MinInteger(FSize, Length(Msg)));
 
        pIPE^.Data := pData;
        FillChar(pIPE^, SizeOf(pIPE^), 0);
 
        if Assigned(FOnEchoRequest) then
            FOnEchoRequest(Self);
 
        FillChar(IPOpt, SizeOf(IPOpt), 0);
        IPOpt.TTL   := FTTL;
        IPOpt.Flags := FFlags;
        Result      := IcmpSendEcho(hICMP, FIPAddress, pReqData, FSize,
                                    @IPOpt, pIPE, BufferSize, FTimeOut);
        FLastError  := GetLastError;
        FReply      := pIPE^;
 
        if Assigned(FOnEchoReply) then
            FOnEchoReply(Self, Result);
    finally
        // Free those buffers
        FreeMem(pIPE);
        FreeMem(pData);
        FreeMem(pReqData);
    end;
end;
{$ENDREGION}
 
var
    num4: longword ;   // used for converting long IP address to dots
    num1: array [1..4] of byte absolute num4 ;
 
{$REGION 'TPingThread'}
//------------------------------------------------------------------------------
//---- TPingThread -------------------------------------------------------------
//------------------------------------------------------------------------------
 
procedure TPingThread.Execute;
var
  ReplyIp: TIPAddr;
  HostEnt: PHostEnt;
begin
  FIcmp:= TICMPSocket.Create();
  try
    // see if overriding default parameters
    if PingSize <> 0
      then FIcmp.Size:= PingSize;
 
    if PingTimeout <> 0
      then FIcmp.Timeout:= PingTimeout;
 
    if PingTTL <> 0
      then FIcmp.TTL:= PingTTL;
 
    FIcmp.Flags:=   PingFlags;
    FIcmp.Address:= trim(PingHostName);
 
    // blocking ping, will also lookup IP address if required
    ReplyTotal:= FIcmp.Ping();
    DnsHostIP:=  FIcmp.HostIP;
 
    if ReplyTotal <> 0
      then begin
             ErrCode:= 0;
             // PingTTL:= FIcmp.Reply.Options.TTL;  // not sure if this gets updated
             ReplyIp:=       FIcmp.Reply.Address;
             ReplyIPAddr:=   inet_ntoa (in_addr (ReplyIp));
             ReplyHostName:= ReplyIPAddr;    // may get reversed looked up
             ReplyStatus:=   FIcmp.Reply.Status;
             ReplyRTT:=      FIcmp.Reply.RoundTripTime;
             ReplyDataSize:= FIcmp.Reply.DataSize;
 
             // see if now looking up host name for reply address,
             // which might not be the same address ping if TTL was less
             if PingLookupReply and (ReplyIp <> 0)
               then begin
                      HostEnt:= GetHostByAddr(@ReplyIp, 4, PF_INET);
                      if HostEnt <> nil
                        then ReplyHostName:= string(HostEnt^.h_name); //StrPas (HostEnt^.h_name);
                    end;
           end
      else begin       // ping failed
             ErrCode:=   FIcmp.ErrorCode;
             ErrString:= FIcmp.ErrorString;
           end;
  finally
    FIcmp.Free(); //Destroy;
    Terminate();
  end;
end;
 
//------------------------------------------------------------------------------
 
// keep ping ThreadId so it may be freed if it gets stuck
 
function PingAddThread (ThreadId: Cardinal): integer ;
begin
    SetLength (PingThreadList, Succ (Length (PingThreadList))) ;
    result := Length (PingThreadList) ;
    PingThreadList [Pred (result)] := ThreadId ;
end ;
 
//------------------------------------------------------------------------------
 
// remove ping ThreadId now it's finished
 
procedure PingRemoveThread (ThreadNum: integer) ;
begin
    if (ThreadNum > Length (PingThreadList)) or (ThreadNum = 0) then exit ;
    PingThreadList [Pred (ThreadNum)] := 0 ;
end ;
 
//------------------------------------------------------------------------------
 
// force ping thread to quit
 
procedure PingTerm1Thread (ThreadNum: integer) ;
var
    ThreadId: Cardinal ;
    I: integer ;
begin
    if (ThreadNum > Length (PingThreadList)) or (ThreadNum = 0) then exit ;
    ThreadId := PingThreadList [Pred (ThreadNum)] ;
    if ThreadId <> 0 then
            PostThreadMessage (ThreadId, WM_QUIT, 0, 0);  // terminate thread
    PingThreadList [Pred (ThreadNum)] := 0 ;              // remove from list
 
// if freed all threads, free memory
    for I := 1 to Length (PingThreadList) do
    begin
        if PingThreadList [Pred (I)] <> 0 then exit ;
    end ;
    SetLength (PingThreadList, 0) ;
end ;
 
//------------------------------------------------------------------------------
 
// force all pending ping threads to quit
 
procedure PingTermAllThreads;
var
    I: integer;
begin
    if Length (PingThreadList) <> 0 then
    begin
        for I := 1 to Length (PingThreadList) do PingTerm1Thread (I) ;
        SetLength (PingThreadList, 0) ;
    end ;
end;
 
//------------------------------------------------------------------------------
 
// convert long IP numeric address (ie 12345678) into a dotted address
 
function LongAddr2Dotted (IPAddr: string): string ;
var
    I: integer ;
begin
    result := trim (IPAddr) ;
    if pos ('.', IPAddr) > 0 then exit ;  // got a dotted address
    try
        num4 := StrToInt64 (IPAddr) ;
    except ;
        exit ;
    end ;
    if num4 = 0 then exit ;
    result := '' ;
    for I := 4 downto 1 do
    begin
        result := result + IntToStr (num1 [I]) ;
        if I = 1 then exit ;
        result := result + '.' ;
    end ;
end ;
{$ENDREGION}
 
//------------------------------------------------------------------------------
 
Initialization
    SetLength(PingThreadList, 0) ;
 
Finalization
    PingTermAllThreads();
 
end.
0
 Аватар для Beltar
819 / 434 / 38
Регистрация: 05.05.2022
Сообщений: 2,969
01.12.2022, 23:42
Вопрос №1, своим делиться можно?
Вопрос №2, кто-нить может порекомендовать хороший яркий и крупный CheckBox (версия Delphi 10/11)? Делаю софтинку для тестов, т. е. пользователю нужно отмечать правильные ответы и желательно, чтобы галочка для этого была большая и красивая, ну и вообще, вопросов в одном экзамене могут быть сотни, а ответов до 12, высматривать стандартные TCheckBox'ы и целиться в них мышкой - это фу-у.

Я пробовал TIACheckControl, но выяснилось, что в режиме увеличенного масштаба он просто не отрисовывается. Конечно, всегда можно взять какую-нибудь кнопку и по нажатию переключать картинку, но может есть совсем готовое и бесплатное?
0
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
02.12.2022, 04:47
Цитата Сообщение от Beltar Посмотреть сообщение
своим делиться можно?
свое, как правило, выкладывают на всеобщее обозрение тут
0
5961 / 4537 / 1094
Регистрация: 29.08.2013
Сообщений: 28,145
Записей в блоге: 3
02.12.2022, 09:11  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
чтобы галочка для этого была большая и красивая
делай в виде страницы в HTML
0
 Аватар для Beltar
819 / 434 / 38
Регистрация: 05.05.2022
Сообщений: 2,969
02.12.2022, 15:13
Delphi
1
делай в виде страницы в HTML
Рогом в глаз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2022, 15:13
Помогаю со студенческими работами здесь

Добавить компоненты за компонентами; удалить первые компоненты, вторые встанут на его место и т.д
Всем Hi 8-) Есть ScrollBox, на нём расположены компоненты, скажем в ряд. Есть две кнопки, Добавить и Удалить. При нажатии на кнопку...

Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, кратные и
Дан файл f , компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, кратные и 3, и 5.

Дан файл f, компоненты которого являются натуральными числами. Получить в файле g все компоненты файла f, делящиеся на 3 и не делящиеся на 7.
Дан файл f, компоненты которого являются натуральными числами. Получить в файле g все компоненты файла f, делящиеся на 3 и не делящиеся...

Записать в файл h сначала компоненты файла f , затем – компоненты файла g с сохранением порядка
Даны символьные файлы f иg . Записать в файлh сначала компоненты файлаf , затем – компоненты файлаg с сохранением порядка.

Бесплатные СУБД
Какие есть бесплатные СУБД с которыми можно работать через делфи ХЕ7+ Важно что бы была возможность поднять сервер этой самой бд и...


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

Или воспользуйтесь поиском по форуму:
74
Ответ Создать тему
Опции темы

Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru