1. Pascal / Говнокод #4776

    +94

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    function WindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
    type
      Item = record
        szItemNr: array[0..8] of char;
        szItem: array[0..32] of char;
        szItemDescription: array[0..32] of char;
      end;
    var
      ListColumn: LV_COLUMN;
      ListItem: LV_ITEM;
    begin
      // In case of Msg ...
      case Msg of
        WM_CREATE: // Create?
        begin
          // Create list
          ListView := CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, '', WS_VISIBLE Or WS_CHILD Or LVS_REPORT Or LVS_SHOWSELALWAYS,
                                     10, 10, 524, 300, Wnd, 0, hInstance, nil);
          ListView_SetExtendedListViewStyle(ListView, LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES);
          // Filling list columns
          with ListColumn do begin
            mask := LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM;
            fmt := LVCFMT_LEFT;
    
            iSubItem := 0;
            cx := 200;
            pszText := 'File name';
            ListView_InsertColumn(ListView, 0, ListColumn);
    
            iSubItem := 1;
            cx := 250;
            pszText := 'Folder path';
            ListView_InsertColumn(ListView, 1, ListColumn);
    
            iSubItem := 2;
            cx := 70;
            pszText := 'File size';
            ListView_InsertColumn(ListView, 2, ListColumn);
          end;
    
          with ListItem do begin
            mask := LVIF_TEXT;
            iItem := 1;
            iSubItem := 1;
            pszText := PChar('test');
            cchTextMax := SizeOf(PChar('test')) + 1;
          end;
          ListView_InsertItem(ListView, ListItem);
          ListView_SetItemText(ListView, 1, 1, PChar('Hello world!'));
    
          // Create static text, progress bar and buttons
          StaticText := CreateWindowEx(0, 'Static', '', WS_CHILD Or WS_VISIBLE Or SS_CENTER,
                                       10, 310, 524, 16, Wnd, ID_StaticText, hInstance, 0);
          ProgressBar := CreateWindowEx(0, PROGRESS_CLASS, nil, WS_CHILD Or WS_VISIBLE Or PBS_SMOOTH,
                                        9, 326, 525, 17, Wnd, ID_ProgressBar, hInstance, nil);
          Button_Start := CreateWindowEx(WS_EX_STATICEDGE, 'Button', 'Start', BS_DEFPUSHBUTTON Or WS_VISIBLE Or WS_CHILD,
                                   150, 350, 70, 25, Wnd, ID_Button_Start, hInstance, nil );
          Button_Pause := CreateWindowEx(WS_EX_STATICEDGE, 'Button', 'Pause', WS_VISIBLE Or WS_CHILD Or WS_DISABLED,
                                   230, 350, 70, 25, Wnd, ID_Button_Pause, hInstance, nil );
          Button_Stop := CreateWindowEx(WS_EX_STATICEDGE, 'Button', 'Stop', WS_VISIBLE Or WS_CHILD Or WS_DISABLED,
                                   310, 350, 70, 25, Wnd, ID_Button_Stop, hInstance, nil );
        end;
    
        WM_DESTROY: // Closing?
        begin
          PostQuitMessage(0);
          Result := 0;
          Exit;  // Bye.
        end;
    
        WM_COMMAND: // Any command?
        case LoWord(wParam) of
            // ....................................
        end;
    end;

    Пристрелите меня кто-нибудь. Или объясните, как работает этот волшебный listview %)

    Запостил: iloveYou, 28 Ноября 2010

    Комментарии (30) RSS

    • Охуенно. Как только запостил в говнокод - разобрался.
      Ответить
      • Со мной тоже такое бывало: запостишь говнокод, а потом думаешь: "ошибся"))
        Ответить
      • но это не значит, что от этого код стал менее вонюч = )
        Ответить
        • Да-да, солидарен :-)
          Ответить
        • А чем он вонюч? Мой винапи-код намного хуже.
          Ответить
          • у Вас тоже 310, 350, 70, 25 вшито в коде?

            винапи вонюч 42мя параметрами у функции, 40 из которых чаще всего нулы.

            но это беда сей, а не апи)
            Ответить
            • Если окно не умеет менять размеры, то да, вшиваю тупо, но такие окна я использую редко, потому что нафига ограничивать размеры.
              Если умеет, то я в создании нули задаю, а двигаю в wm_Size с учётом клиентских размеров окна.
              Ответить
              • Такие чиселки не плохо бы вынести в отдельный модуль, задать их там, и потом делать GetWindowSize() какой нить. Что бы менять размеры переделкой всего одного модуля.

                Для тех, кто боица вызывать лишнюю функцию -- можно сделать константы в хедеровском файле, и их подключать (в дельфи же есть препроцессор?).

                И наконец все настройки можно вынести в конфигурационный файл, и читать их при старте программы.
                Ответить
            • vanished
              Ответить
    • винапи на дельфи. замечательнинько.
      Ответить
      • Кэп? Не узнал Вас.
        Употребление WinAPI в дельфи вместо VCL свидетельствует о квалификации программиста. Либо он писал ещё на Турбо-Паскале, либо знает Си или другие языки. А возможно, что он просто ООП боится.
        Ответить
        • Не думаю, что я как-то шибко квалифицирован :-) На дельфях писал-то всего пару раз в жизни ))) Ну и да, писал еще на трубо-паскале, и чуток знаю си и все остальное. ООП не боюсь - просто в данном конкретном говнокоде нужна скорость :-)
          Ответить
        • либо не хочет в багах VLC колупатся? или за библиотеки по каким-либо причинам платить?

          меня в свои времена (~8 лет назад), чисто потому что был спец по WinAPI, в Delphi воткнули потому что там без низкого уровня ни как. простые тривиальные вещи - не вопрос. а вот что посложнее - тот же динамический гуй - уже сосет и проще на WinAPI делать. тот же листвью из ComCtrl был через Ж сделан - наш народ долго воевал с ним, а потом просто свой контрол сделали.
          Ответить
          • VCL — ещё тот подарок. Недаром были попытки написания альтернатив (ACL, KOL). Так что зачастую проще и рациональнее через WinAPI.
            Ответить
            • пользовательские интерфейсы сделанные с помощью CreateWindowEx() просты и рациональны, ага
              KOL была сделана потому, что VCL тащит за собой кучу нужного только в дизайнере, быстрое гугление по Delphi+ACL показало, что префикс классов там "Lite" т.е. опять кого-то беспокоят размеры
              Ответить
        • вот и я говорю, зачем?
          Ответить
        • либо хочет что-то такое, что борланд еще не сделал
          Ответить
      • настоящий винапи должен быть на Си?
        не, круче было бы на яве, или ваще, на батниках через rundll32 = ))
        Ответить
        • я сразу подумал о ассемблере, но батники через рандлл - та еще жесть.
          Ответить
    • настоящие дельфинисты никогда не проверяют возвраты от API
      Ответить
      • А можно поподробнее?
        Ответить
      • Блин, опять час ночи и туплю. Кажется, догадался :-)
        Большое Спасибо! :-)
        Ответить
    • @
      PostQuitMessage(0);
      Result := 0;
      Exit;  // Bye.

      Апиблядство-то какое. Сразу видно, что сишник иль крестовик кодил.
      Ответить
    • Я анонимен.
      Ответить
    • Давайте в анус ебацца.
      Ответить
      • Пидар, залогинься.
        Ах да, ты же не можешь.
        Ответить

    Добавить комментарий