{"id":6607,"date":"2023-02-08T19:36:39","date_gmt":"2023-02-08T18:36:39","guid":{"rendered":"https:\/\/gdksoftware.com\/knowledgebase\/unit-specific-typing-in-delphi"},"modified":"2026-05-28T08:27:31","modified_gmt":"2026-05-28T07:27:31","slug":"unit-specific-typing-in-delphi","status":"publish","type":"knowledge","link":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi","title":{"rendered":"Specific typing in Delphi"},"content":{"rendered":"<p>Primitieve types hebben standaard conversieregels; veel programmeertalen werken standaard zo. Dit zorgt ervoor dat je niet alles hoeft te casten en is puur voor het gemak. Je kunt bijvoorbeeld een Integer probleemloos aan een Extended toewijzen, zowel door een letterlijke 42 mee te geven als door een variabele van het type Integer toe te wijzen.<\/p>\n<pre><code class=\"language-pascal\" data-line=\"\">procedure Hello;\nvar\n  SomeNumber: Extended;\n  AnotherNumber: Integer;\nbegin\n  AnotherNumber := 6;\n  SomeNumber := 2; \/\/ works\n  SomeNumber := AnotherNumber; \/\/ works\nend;<\/code><\/pre>\n<p>Zelfs als je type-aliasing toepast, blijven de types dezelfde types als voorheen en gelden er automatische conversieregels:<\/p>\n<pre><code class=\"language-pascal\" data-line=\"\">type\n  ANewType = Extended;\n  AnotherNewType = Integer;\n\nimplementation\n\nprocedure Hello;\nvar\n  SomeNumber: ANewType;\n  AnotherNumber: AnotherNewType;\nbegin\n  AnotherNumber := 6;\n  SomeNumber := 2; \/\/ works\n  SomeNumber := AnotherNumber; \/\/ works\nend;<\/code><\/pre>\n<p>Wil je echt strikte conversieregels, bijvoorbeeld omdat je wilt voorkomen dat meters aan seconden worden toegekend of andersom, dan moet je nieuwe types aanmaken. En nieuwe types maak je met behulp van een record of een class.<\/p>\n<p>Om bepaalde conversies toch toe te staan, kun je die regels aan de types toevoegen met operator overloading (zie <a href=\"https:\/\/docwiki.embarcadero.com\/RADStudio\/Sydney\/en\/Operator_Overloading_(Delphi)\" target=\"_blank\">Embarcadero Wiki<\/a>).<br \/>\nIn FreePascal is de syntaxis anders, maar je kunt hetzelfde bereiken (zie <a href=\"https:\/\/www.freepascal.org\/docs-html\/ref\/refse104.html#x224-24800015.3\" target=\"_blank\">FreePascal Reference<\/a>).<\/p>\n<p>Je kunt vervolgens zelfs conversieregels maken voor meters * seconden, waarmee je een meter-per-seconde-type cre\u00ebert.<br \/>\nHier is een voorbeeld van hoe dat werkt in Delphi:<\/p>\n<pre><code class=\"language-pascal\" data-line=\"\">type\n  TMetersPerSecond = record\n  private\n    m: Extended;\n    s: Extended;\n \n    value: extended;\n \n    mset: Boolean;\n    sset: Boolean;\n \n    function Units: string;\n  public\n    function ToString: string;\n  end;\n \n  TMeters = record\n  private\n    value: Extended;\n \n    function Units: string;\n  public\n    class operator Implicit(Value: Extended): TMeters ;\n    class operator Explicit(Value: TMeters ): TMetersPerSecond ;\n    class operator Multiply(ms: TMetersPerSecond; m: TMeters ): TMetersPerSecond;\n \n    function ToString: string;\n  end;\n \n  TSeconds = record\n  private\n    value: Extended;\n \n    function Units: string;\n  public\n    class operator Implicit(Value: Extended): TSeconds;\n    class operator Explicit(Value: TSeconds): TMetersPerSecond;\n    class operator Multiply(ms: TMetersPerSecond; s: TSeconds): TMetersPerSecond;\n \n    function ToString: string;\n  end;\n \nimplementation\n \nuses\n  SysUtils;\n \nclass operator TMeters.Implicit(Value: Extended): TMeters;\nbegin\n  Result.value := Value;\nend;\n \nclass operator TSeconds.Implicit(Value: Extended): TSeconds;\nbegin\n  Result.value := Value;\nend;\n \nclass operator TMeters.Explicit(Value: TMeters): TMetersPerSecond;\nbegin\n  Result.m := Value.value;\n  Result.mset := True;\n  if Result.sset then\n    Result.value := Result.s * Result.m; \nend;\n \nclass operator TSeconds.Explicit(Value: TSeconds): TMetersPerSecond;\nbegin\n  Result.s := Value.value;\n  Result.sset := True;\n  if Result.mset then\n    Result.value := Result.s * Result.m; \nend;\n \nclass operator TSeconds.Multiply(ms: TMetersPerSecond; s: TSeconds): TMetersPerSecond;\nbegin\n  Result := ms;\n  Result.s := s.value;\n  Result.sset := True;\n  if Result.mset then\n    Result.value := Result.s * Result.m; \nend;\n \nclass operator TMeters.Multiply(ms: TMetersPerSecond; m: meters): TMetersPerSecond;\nbegin\n  Result := ms;\n  Result.m := m.value;\n  Result.mset := True;\n  if Result.sset then\n    Result.value := Result.s * Result.m; \nend;\n \nfunction TMetersPerSecond.Units: string;\nbegin\n  Result := &#039;m\/s&#039;;\nend;\n \nfunction TMetersPerSecond.ToString: string;\nbegin\n  Assert(mset and sset);\n \n  Result := Format(&#039;%f%s&#039;, [value, Units])\nend;\n \nfunction TMeters.Units: string;\nbegin\n  Result := &#039;m&#039;;\nend;\n \nfunction TMeters.ToString: string;\nbegin\n  Result := Format(&#039;%f%s&#039;, [value, Units]);\nend;\n \nfunction TSeconds.Units: string;\nbegin\n  Result := &#039;s&#039;;\nend;\n \nfunction TSeconds.ToString: string;\nbegin\n  Result := Format(&#039;%f%s&#039;, [value, Units]);\nend;\n \nvar\n  time: TSeconds;\n  distance: TMeters;\n  speed: TMetersPerSecond;\n  different_speed: TMetersPerSecond;\ninitialization\n  time := 10.0;\n  distance := 3;\n \n  \/\/ distance := time; \/\/ does not work, because seconds are not meters!\n \n  speed := TMetersPerSecond(time) * distance;\n \n  \/\/ or the other way around\n  speed := TMetersPerSecond(distance) * time;\n \n  WriteLn(&#039;speed -&gt; &#039; + time.ToString + &#039; * &#039; + distance.ToString + &#039; = &#039; + Speed.ToString);\n \n  \/\/ different_speed := distance; \/\/ this doesn&#039;t work without explicit conversion\n \n  WriteLn(&#039;different_speed -&gt; &#039; + different_speed.ToString);\nend.<\/code><\/pre>\n","protected":false},"featured_media":0,"parent":0,"template":"","class_list":["post-6607","knowledge","type-knowledge","status-publish","hentry","knowledge-category-delphi"],"acf":{"author":1545,"type_hero":"compact","hero_image":2063,"hero_image_position":"","hero_title":"\"Unit\" specific typing","hero_content":"","hero_link":null,"hero_show_h1":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Specific typing in Delphi - GDK Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Specific typing in Delphi\" \/>\n<meta property=\"og:description\" content=\"Primitieve types hebben standaard conversieregels; veel programmeertalen werken standaard zo. Dit zorgt ervoor dat je niet alles hoeft te casten en is puur voor het gemak. Je kunt bijvoorbeeld een Integer probleemloos aan een Extended toewijzen, zowel door een letterlijke 42 mee te geven als door een variabele van het type Integer toe te wijzen. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi\" \/>\n<meta property=\"og:site_name\" content=\"GDK Software\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-28T07:27:31+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/unit-specific-typing-in-delphi\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/unit-specific-typing-in-delphi\",\"name\":\"Specific typing in Delphi - GDK Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\"},\"datePublished\":\"2023-02-08T18:36:39+00:00\",\"dateModified\":\"2026-05-28T07:27:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/unit-specific-typing-in-delphi#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/unit-specific-typing-in-delphi\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/unit-specific-typing-in-delphi#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledgebase\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Delphi\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank-categorie\\\/delphi\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Specific typing in Delphi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\",\"name\":\"GDK Software\",\"description\":\"Zet de stip op je horizon\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gdksoftware.com\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Specific typing in Delphi - GDK Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi","og_locale":"nl_NL","og_type":"article","og_title":"Specific typing in Delphi","og_description":"Primitieve types hebben standaard conversieregels; veel programmeertalen werken standaard zo. Dit zorgt ervoor dat je niet alles hoeft te casten en is puur voor het gemak. Je kunt bijvoorbeeld een Integer probleemloos aan een Extended toewijzen, zowel door een letterlijke 42 mee te geven als door een variabele van het type Integer toe te wijzen. [&hellip;]","og_url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi","og_site_name":"GDK Software","article_modified_time":"2026-05-28T07:27:31+00:00","twitter_card":"summary_large_image","twitter_misc":{"Geschatte leestijd":"1 minuut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi","url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi","name":"Specific typing in Delphi - GDK Software","isPartOf":{"@id":"https:\/\/gdksoftware.com\/nl#website"},"datePublished":"2023-02-08T18:36:39+00:00","dateModified":"2026-05-28T07:27:31+00:00","breadcrumb":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/unit-specific-typing-in-delphi#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gdksoftware.com\/nl"},{"@type":"ListItem","position":2,"name":"Knowledgebase","item":"https:\/\/gdksoftware.com\/nl\/kennisbank"},{"@type":"ListItem","position":3,"name":"Delphi","item":"https:\/\/gdksoftware.com\/nl\/kennisbank-categorie\/delphi"},{"@type":"ListItem","position":4,"name":"Specific typing in Delphi"}]},{"@type":"WebSite","@id":"https:\/\/gdksoftware.com\/nl#website","url":"https:\/\/gdksoftware.com\/nl","name":"GDK Software","description":"Zet de stip op je horizon","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gdksoftware.com\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"}]}},"_links":{"self":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge\/6607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge"}],"about":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/types\/knowledge"}],"acf:post":[{"embeddable":true,"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/team\/1545"}],"wp:attachment":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/media?parent=6607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}