Autor Téma: Record (záznam), DLL  (Přečteno 596 krát)

Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 13
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
Record (záznam), DLL
« kdy: 18-01-2025, 21:39:24 »
Zdravím všechny,
přeposílám v ránci funkcí jednoduché záznamy typu:

Kód: Delphi [Vybrat]
  1. type
  2.   TCircle2d = record
  3.     Center: Struct2d;
  4.     Radius: Double;
  5.   end;

Následně pak lze exportovat fci např:

Kód: Delphi [Vybrat]
  1. function Circle2dFromPoints(out Circle: TCircle2d; const PointA, PointB, PointC: Struct2d): Wordbool; stdcall;

Nové Delphi, Lazarus, FPC umožňují používat pokročilé záznamy s funkcemi, operátory, konstruktor, atd.
Např.:

Kód: Delphi [Vybrat]
  1. type
  2.   TCircle2d = record
  3.     Center: Struct2d;
  4.     Radius: Double;
  5.     function IsValid: Wordbool;
  6.   end;

Neví někdo, co se pak předává? Pouze záznam, nebo se celý record včetně funkce? Což by pak nefungovalo s ostaními jazyky...

Za jakýkoliv poznatek děkuji.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Record (záznam), DLL
« Odpověď #1 kdy: 19-01-2025, 12:30:41 »
Pouze záznam. I když v tvém jednoduchém případě si nejsem jist, jake budes mit napriklad zarovnani dat, packed record je v tomto pripade spise nutnost.
Nevím co je Struct2d.

Vsechny funkce, operatory atd. jsou metody, ktere jsou "spolecne", a pracuji nad "cistym" blokem dat.

Embarcadero MVP - Czech republic

Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 13
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
Re:Record (záznam), DLL
« Odpověď #2 kdy: 20-01-2025, 00:10:29 »
Aha, díky. Struct2d je také záznam:

Kód: Delphi [Vybrat]
  1. TStruct2d = record
  2.   X: Double;
  3.   Y: Double;
  4. end;

Kdy volit packed record?
Přiznám se, že zatím mi vše fungovalo bez něj (komunikace Delphi, Lazarus, VBA; stdcall).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Record (záznam), DLL
« Odpověď #3 kdy: 20-01-2025, 08:31:08 »
Excellent
Rated 1 time
Zalezi na typech, treba double je typ co ma 8 byte, coz je automaticky zarovnane na 8 byte :-), kdyby jsi prenasel napr. typ byte, tak zalezi jak je nastavene zarovnavani, u packed record jsou data za sebou, v pripade zarovnani treba na 4 byte, je ten jeden byte doplnen 3byte "vaty". Proto pri vymene dat v pripade DLL je vhodne oznacit jako packed, protoze je to pak definovane zda tam vata je nebo neni. Pokud mas same double tak je to jedno.
Pokud ti to funguje tak na to kasli.
Obecne ale packed nepouzivat krome vymeny dat, protoze pristup na zarovnane struktury je vetsinou rychlejsi.
Embarcadero MVP - Czech republic

Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 13
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
Re:Record (záznam), DLL
« Odpověď #4 kdy: 21-01-2025, 18:04:48 »
Díky za vysvětlení.
Ono je třeba projít i jednotlivé typy.
Např. při komunikace s VBA je třeba používat Wordbool, neboť má 2 byte. Klasický Delphi boolean 1 byte je no go.