{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Математик среди биологов: заметки с тегом дельфи",
    "_rss_description": "Я немного умею складывать, но от вычитания у меня всегда кружится голова",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/antonlyakh.ru\/blog\/tags\/delphi\/",
    "feed_url": "https:\/\/antonlyakh.ru\/blog\/tags\/delphi\/json\/",
    "icon": false,
    "author": {
        "name": "Антон Лях",
        "url": "https:\/\/antonlyakh.ru\/blog\/",
        "avatar": false
    },
    "items": [
        {
            "id": "451",
            "url": "https:\/\/antonlyakh.ru\/blog\/all\/associativny-massiv-v-staryh-versiyah-delfi\/",
            "title": "Ассоциативный массив в старых версиях Дельфи",
            "content_html": "<p>В Королевстве Дельфи много лет назад Дмитрий Рябов предложил <a href=\"http:\/\/www.delphikingdom.com\/asp\/viewitem.asp?catalogid=868\">реализацию ассоциативных массивов<\/a>.<\/p>\n<blockquote>\n<blockquote>\n<p>«На практике часто возникает потребность сохранять и обрабатывать данные в массивах, осуществляя доступ к элементам не по индексу, а по ключу. Для этого используются ассоциативные массивы, которые есть, например, во многих скриптовых языках. В <abbr>Delphi<\/abbr> на уровне языка такая структура отсутствует. В качестве замены часто используются контейнерные классы <abbr>TStringList<\/abbr>, <abbr>TParams<\/abbr> и т. п., но они весьма неудобны в использовании и недостаточно функциональны. К тому же появляется необходимость заботиться об уничтожении экземпляра класса, что зачастую порождает лишние <abbr>try..finally..end<\/abbr>.»<\/p>\n<\/blockquote>\n<\/blockquote>\n<p>В чем фишка реализации.<\/p>\n<blockquote>\n<blockquote>\n<p>«Удобное использование, неплохая производительность, отсутствие небходимости принудительного уничтожения, нескольно представлений одного массива, использование ключей разных типов, наличие функций итератора, удобное использование многомерных массивов.»»<\/p>\n<\/blockquote>\n<\/blockquote>\n<p>Я иногда ее использую в своих проектах и всегда опасаюсь, что текст с примерами будет окончательно потерян. Потому решил воспроизвести его здесь.<\/p>\n<hr \/>\n<pre class=\"e2-text-code\"><code class=\"\">program Example;\r\n{$APPTYPE CONSOLE}\r\nuses\r\n  Arrays;\r\n\r\nprocedure Main;\r\nvar\r\n  I: IIntArray;\r\n  S: IStrArray;\r\n  V: IVarArray;\r\n  M: IMltArray;\r\n\r\nbegin\r\n  \/\/ создаём массив и получаем представление в целых числах\r\n  I := CreateArray;\r\n\r\n  \/\/ заполняем\r\n  I['a'] := 5;\r\n  I['b'] := 1;\r\n  I['c'] := 4;\r\n  I['d'] := 2;\r\n  I['e'] := 3;\r\n\r\n  \/\/ выводим\r\n  WriteLn('Original array');\r\n  I.First;\r\n  while not I.Eof do\r\n  begin\r\n    WriteLn('[', I.CurrentKey, '] = ', I.CurrentValue);\r\n    I.Next;\r\n  end;\r\n\r\n  \/\/ сортируем\r\n  I.Sort;\r\n\r\n  \/\/ наблюдаем результат\r\n  WriteLn('Sorted array');\r\n  I.First;\r\n  while not I.Eof do\r\n  begin\r\n    WriteLn('[', I.CurrentKey, '] = ', I.CurrentValue);\r\n    I.Next;\r\n  end;\r\n\r\n  \/\/ создаём строковое представление\r\n  S := I.Instance;\r\n\r\n  \/\/ наблюдаем результат\r\n  WriteLn('Two views of one array');\r\n  S.First;\r\n  while not S.Eof do\r\n  begin\r\n    WriteLn('[', S.CurrentKey, '] + ''10'' = ', S.CurrentValue + '10');\r\n    WriteLn('[', I.CurrentKey, '] + 10 = ', I.CurrentValue + 10);\r\n    S.Next;\r\n  end;\r\n\r\n  \/\/ создаём вариантное представление\r\n  V := S.Instance;\r\n  V.Clear;\r\n  V['integer'] := 10;\r\n  V['string'] := '10';\r\n\r\n  \/\/ наблюдаем результат\r\n  WriteLn('Variant type conversion');\r\n  V.First;\r\n  while not V.Eof do\r\n  begin\r\n    WriteLn('[', V.CurrentKey, '] + 10 = ', V.CurrentValue + 10);\r\n    WriteLn('[', V.CurrentKey, '] + ''10'' = ', V.CurrentValue + '10');\r\n    V.Next;\r\n  end;\r\n\r\n  \/\/ используем ключи разных типов, но одного значения\r\n  S.Clear;\r\n  S[False] := 'boolean';\r\n  S[0] := 'integer';\r\n  S[0.0] := 'float';\r\n  S['0'] := 'string';\r\n\r\n  \/\/ наблюдаем результат\r\n  WriteLn('Variant type keys ;)');\r\n  S.First;\r\n  while not S.Eof do\r\n  begin\r\n    WriteLn('[', S.CurrentKey, '] = ', S.CurrentValue);\r\n    S.Next;\r\n  end;\r\n\r\n  \/\/ создаём ещё одно представление, на этот раз - многомерное\r\n  M := V.Instance;\r\n  M.Clear;\r\n\r\n  \/\/ заполняем матрицу\r\n  M['A']['a'].AsInteger := 1;\r\n  M['A']['b'].AsInteger := 2;\r\n  M['A']['c'].AsInteger := 3;\r\n  M['B']['a'].AsInteger := 4;\r\n  M['B']['b'].AsInteger := 5;\r\n  M['B']['c'].AsInteger := 6;\r\n  M['C']['a'].AsInteger := 7;\r\n  M['C']['b'].AsInteger := 8;\r\n  M['C']['c'].AsInteger := 9;\r\n\r\n  \/\/ выводим матрицу\r\n  WriteLn('Multidimensional array');\r\n  M.First;\r\n  while not M.Eof do\r\n  begin\r\n    M.CurrentValue.First;\r\n    while not M.CurrentValue.Eof do\r\n    begin\r\n      WriteLn('[', M.CurrentKey, ',', M.CurrentValue.CurrentKey, '] = ',\r\n        M.CurrentValue.CurrentValue.AsInteger);\r\n      M.CurrentValue.Next;\r\n    end;\r\n    M.Next;\r\n  end;\r\n\r\n  \/\/ перед возвратом все созданные массивы автоматически удаляются\r\n  WriteLn('Arrays is free');\r\nend;\r\n\r\nvar\r\n  L: Integer;\r\nbegin\r\n  L := AllocMemSize;\r\n  Main;\r\n  \/\/ проверка утечки памяти\r\n  WriteLn('Memory leak: ', AllocMemSize - L, ' bytes');\r\n  ReadLn;\r\nend.<\/code><\/pre><hr \/>\n<p><b><a href=\"http:\/\/www.delphikingdom.com\/zip\/arrays.zip\">Скачать исходники из Королевства<\/a><\/b><\/p>\n<p><b><a href=\"https:\/\/stackoverflow.com\/a\/51830939\/1615266\">Посмотреть рекомендацию оссоциативного массива<\/a><\/b> на Стакэксчендже .<\/p>\n",
            "date_published": "2022-04-19T11:08:05+03:00",
            "date_modified": "2022-04-19T11:52:43+03:00",
            "_date_published_rfc2822": "Tue, 19 Apr 2022 11:08:05 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "451",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "211",
            "url": "https:\/\/antonlyakh.ru\/blog\/all\/direktiva-reintroduce-v-delfi\/",
            "title": "Директива reintroduce в Дельфи",
            "content_html": "<p>Узнал, что в Дельфи есть директива <b>reintroduce<\/b>. Она говорит компиляторуо том, что не надо возмущаться, когда в родственных классах определены функции с одинаковыми именами, но разным набором параметров.<\/p>\n<p>Здесь компилятор напомнит, что в коде непорядок:<\/p>\n<pre class=\"e2-text-code\"><code class=\"delphi\">\r\ntype TFish = class\r\n  procedure swim(); virtual;\r\nend;\r\n\r\ntype TBoneFish = class(TFish)\r\n  procedure swim(direction : TVector); overload; \/\/ Method 'swim' hides virtual method of base type TFish.\r\nend;\r\n<\/code>\n<\/pre>\n<p>А здесь все стало правильно:<\/p>\n<pre class=\"e2-text-code\"><code class=\"delphi\">\r\ntype TFish = class\r\n  procedure swim(); virtual;;\r\nend;\r\n\r\ntype TBoneFish = class(TFish)\r\n  procedure swim(direction : TVector); reintroduce; overload;\r\nend;\r\n<\/code>\n<\/pre>\n<p>В основном коде можно вызывать оба метода.<\/p>\n<pre class=\"e2-text-code\"><code class=\"pascal\">\r\n  bone_fish.swim(); \/\/ куда-то плывем\r\n  bone_fish.swim( to_nutritious_crustacean ); \/\/ плывем за питательным рачком\r\n<\/code>\n<\/pre>\n",
            "date_published": "2018-08-13T15:32:10+03:00",
            "date_modified": "2018-08-13T15:18:31+03:00",
            "_date_published_rfc2822": "Mon, 13 Aug 2018 15:32:10 +0300",
            "_rss_guid_is_permalink": "true",
            "_rss_guid": "https:\/\/antonlyakh.ru\/blog\/all\/direktiva-reintroduce-v-delfi\/",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3559,
    "_e2_ua_string": "E2 (v3559; Aegea)"
}