Пакет MASM64. Готовые наработки

Тема в разделе "WASM.X64", создана пользователем Mikl___, 22 мар 2026.

  1. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Она сырая еще. Сделал выхлоп в отдельное окно, имхо удобнее.

    2026-06-17_11-36-51.png
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Шрифт-то хотя бы можно где-то кроме исходника накрутить?
     
  3. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Пока нет, это самая первая и самая всратая версия без scintilla.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    И почему тогда этот пример только подтверждает изложенную мной "бредовую" концепцию? Зачем ты его привел?
     
  5. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Еще на scintill'e есть. Не знаю зачем привел, диалог поддержать.

    2026-06-17_11-42-52.png

    В этой да.
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Еще одно подтверждение бредовых концепций. Потому что вся ide буквально обертка на созданный другими компонент. Как тракторист, сидящий в тракторе.
     
  7. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Зато можно шрифт менять.
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Как сильно понизились ставки. То, что в одно лицо хотя бы выбор шрифта в программе можно реализовать - истина. Ты это только что убедительно доказал.
     
  9. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Можно и самому написать если руки не из задницы.
    Код (Pascal):
    1. program SimpleEditor;
    2.  
    3. uses
    4.   Windows, Messages, SysUtils;
    5.  
    6. const
    7.   MAX_LINES = 10000;
    8.   MAX_COLS = 1000;
    9.   CHAR_WIDTH = 8;
    10.   CHAR_HEIGHT = 16;
    11.   LINE_SPACING = 20;
    12.   LEFT_MARGIN = 50;
    13.   TOP_MARGIN = 10;
    14.   SCROLLBAR_WIDTH = 20;
    15.   LINE_NUMBER_WIDTH = 40;
    16.   CURRENT_LINE_COLOR = $E8E8E8;
    17.  
    18. type
    19.   TCell = record
    20.     Ch: Char;
    21.     Attr: Byte;
    22.   end;
    23.  
    24.   TEditorModel = record
    25.     Cells: array[0..MAX_LINES - 1, 0..MAX_COLS - 1] of TCell;
    26.     LineCount: Integer;
    27.     CurLine, CurCol: Integer;
    28.   end;
    29.  
    30.   TEditorView = record
    31.     Handle: HWND;
    32.     VScroll, HScroll: HWND;
    33.     ScrollLine, ScrollCol: Integer;
    34.     MaxScrollLine, MaxScrollCol: Integer;
    35.     Width, Height: Integer;
    36.   end;
    37.  
    38. var
    39.   Model: TEditorModel;
    40.   View: TEditorView;
    41.   Msg: TMsg;
    42.  
    43. // ==================== ВСПОМОГАТЕЛЬНЫЕ ====================
    44.  
    45. function GetLineLen(Line: Integer): Integer;
    46. begin
    47.   Result := 0;
    48.   while (Result < MAX_COLS) and (Model.Cells[Line, Result].Ch <> #0) do
    49.     Inc(Result);
    50. end;
    51.  
    52. function GetVisibleLines: Integer;
    53. var
    54.   ClientRect: TRect;
    55. begin
    56.   GetClientRect(View.Handle, ClientRect);
    57.   Result := (ClientRect.Bottom - ClientRect.Top - TOP_MARGIN) div LINE_SPACING;
    58.   if Result < 1 then Result := 1;
    59. end;
    60.  
    61. function GetVisibleCols: Integer;
    62. var
    63.   ClientRect: TRect;
    64. begin
    65.   GetClientRect(View.Handle, ClientRect);
    66.   Result := (ClientRect.Right - ClientRect.Left - LEFT_MARGIN - SCROLLBAR_WIDTH) div CHAR_WIDTH;
    67.   if Result < 1 then Result := 1;
    68. end;
    69.  
    70. procedure UpdateScrollRanges;
    71. var
    72.   i, MaxLineLen: Integer;
    73.   VisibleLines, VisibleCols: Integer;
    74.   si: TScrollInfo;
    75. begin
    76.   VisibleLines := GetVisibleLines;
    77.   VisibleCols := GetVisibleCols;
    78.  
    79.   MaxLineLen := 0;
    80.   for i := 0 to Model.LineCount - 1 do
    81.   begin
    82.     if GetLineLen(i) > MaxLineLen then
    83.       MaxLineLen := GetLineLen(i);
    84.   end;
    85.  
    86.   if Model.LineCount > VisibleLines then
    87.     View.MaxScrollLine := Model.LineCount - VisibleLines
    88.   else
    89.     View.MaxScrollLine := 0;
    90.  
    91.   if View.ScrollLine > View.MaxScrollLine then View.ScrollLine := View.MaxScrollLine;
    92.   if View.ScrollLine < 0 then View.ScrollLine := 0;
    93.  
    94.   si.cbSize := SizeOf(si);
    95.   si.fMask := SIF_RANGE or SIF_PAGE or SIF_POS;
    96.   si.nMin := 0;
    97.   si.nMax := Model.LineCount - 1;
    98.   si.nPage := VisibleLines;
    99.   si.nPos := View.ScrollLine;
    100.   SetScrollInfo(View.VScroll, SB_CTL, si, True);
    101.  
    102.   if MaxLineLen > VisibleCols then
    103.     View.MaxScrollCol := MaxLineLen - VisibleCols
    104.   else
    105.     View.MaxScrollCol := 0;
    106.  
    107.   if View.ScrollCol > View.MaxScrollCol then View.ScrollCol := View.MaxScrollCol;
    108.   if View.ScrollCol < 0 then View.ScrollCol := 0;
    109.  
    110.   si.fMask := SIF_RANGE or SIF_PAGE or SIF_POS;
    111.   si.nMin := 0;
    112.   si.nMax := MaxLineLen;
    113.   si.nPage := VisibleCols;
    114.   si.nPos := View.ScrollCol;
    115.   SetScrollInfo(View.HScroll, SB_CTL, si, True);
    116. end;
    117.  
    118. procedure UpdateCaret;
    119. begin
    120.   SetCaretPos(LEFT_MARGIN + (Model.CurCol - View.ScrollCol) * CHAR_WIDTH,
    121.               TOP_MARGIN + (Model.CurLine - View.ScrollLine) * LINE_SPACING);
    122. end;
    123.  
    124. procedure UpdateWindowTitle;
    125. var
    126.   Title: string;
    127. begin
    128.   Title := Format('Editor - Line: %d, Col: %d', [Model.CurLine + 1, Model.CurCol + 1]);
    129.   SetWindowText(View.Handle, PChar(Title));
    130. end;
    131.  
    132. procedure ScrollToCursor;
    133. var
    134.   VisibleLines, VisibleCols: Integer;
    135. begin
    136.   VisibleLines := GetVisibleLines;
    137.   VisibleCols := GetVisibleCols;
    138.  
    139.   if Model.CurLine < View.ScrollLine then
    140.     View.ScrollLine := Model.CurLine
    141.   else if Model.CurLine >= View.ScrollLine + VisibleLines then
    142.     View.ScrollLine := Model.CurLine - VisibleLines + 1;
    143.  
    144.   if Model.CurCol < View.ScrollCol then
    145.     View.ScrollCol := Model.CurCol
    146.   else if Model.CurCol >= View.ScrollCol + VisibleCols then
    147.     View.ScrollCol := Model.CurCol - VisibleCols + 1;
    148.  
    149.   UpdateScrollRanges;
    150.   InvalidateRect(View.Handle, nil, True);
    151.   UpdateWindowTitle;
    152. end;
    153.  
    154. // ==================== ОПЕРАЦИИ ====================
    155.  
    156. procedure InsertChar(ch: Char);
    157. var
    158.   i, Len: Integer;
    159. begin
    160.   Len := GetLineLen(Model.CurLine);
    161.   if Len >= MAX_COLS - 1 then Exit;
    162.  
    163.   for i := Len downto Model.CurCol + 1 do
    164.     Model.Cells[Model.CurLine, i] := Model.Cells[Model.CurLine, i - 1];
    165.  
    166.   Model.Cells[Model.CurLine, Model.CurCol].Ch := ch;
    167.   Inc(Model.CurCol);
    168.  
    169.   ScrollToCursor;
    170.   UpdateCaret;
    171.   InvalidateRect(View.Handle, nil, True);
    172. end;
    173.  
    174. procedure NewLine;
    175. var
    176.   i, j: Integer;
    177.   Len: Integer;
    178. begin
    179.   if Model.LineCount >= MAX_LINES then Exit;
    180.  
    181.   Len := GetLineLen(Model.CurLine);
    182.  
    183.   for i := Model.LineCount downto Model.CurLine + 2 do
    184.   begin
    185.     for j := 0 to MAX_COLS - 1 do
    186.       Model.Cells[i, j] := Model.Cells[i - 1, j];
    187.   end;
    188.  
    189.   for j := Model.CurCol to Len - 1 do
    190.     Model.Cells[Model.CurLine + 1, j - Model.CurCol] := Model.Cells[Model.CurLine, j];
    191.  
    192.   for j := Model.CurCol to Len - 1 do
    193.     Model.Cells[Model.CurLine, j].Ch := #0;
    194.  
    195.   Inc(Model.LineCount);
    196.   Inc(Model.CurLine);
    197.   Model.CurCol := 0;
    198.  
    199.   ScrollToCursor;
    200.   UpdateCaret;
    201.   InvalidateRect(View.Handle, nil, True);
    202. end;
    203.  
    204. procedure DeleteChar;
    205. var
    206.   i, j, Len: Integer;
    207. begin
    208.   if Model.CurCol > 0 then
    209.   begin
    210.     Len := GetLineLen(Model.CurLine);
    211.     for i := Model.CurCol to Len - 1 do
    212.       Model.Cells[Model.CurLine, i - 1] := Model.Cells[Model.CurLine, i];
    213.     Dec(Model.CurCol);
    214.     Model.Cells[Model.CurLine, Len - 1].Ch := #0;
    215.     InvalidateRect(View.Handle, nil, True);
    216.   end
    217.   else if Model.CurLine > 0 then
    218.   begin
    219.     Model.CurCol := GetLineLen(Model.CurLine - 1);
    220.    
    221.     for i := 0 to GetLineLen(Model.CurLine) - 1 do
    222.       Model.Cells[Model.CurLine - 1, Model.CurCol + i] := Model.Cells[Model.CurLine, i];
    223.    
    224.     for i := Model.CurLine to Model.LineCount - 2 do
    225.     begin
    226.       for j := 0 to MAX_COLS - 1 do
    227.         Model.Cells[i, j] := Model.Cells[i + 1, j];
    228.     end;
    229.     Dec(Model.LineCount);
    230.    
    231.     for i := 0 to MAX_COLS - 1 do
    232.       Model.Cells[Model.LineCount, i].Ch := #0;
    233.    
    234.     Dec(Model.CurLine);
    235.     ScrollToCursor;
    236.     InvalidateRect(View.Handle, nil, True);
    237.   end;
    238.  
    239.   UpdateCaret;
    240. end;
    241.  
    242. procedure DeleteCharRight;
    243. var
    244.   i, j, Len: Integer;
    245. begin
    246.   if Model.CurCol < GetLineLen(Model.CurLine) then
    247.   begin
    248.     Len := GetLineLen(Model.CurLine);
    249.     for i := Model.CurCol + 1 to Len - 1 do
    250.       Model.Cells[Model.CurLine, i - 1] := Model.Cells[Model.CurLine, i];
    251.     Model.Cells[Model.CurLine, Len - 1].Ch := #0;
    252.     InvalidateRect(View.Handle, nil, True);
    253.   end
    254.   else if Model.CurLine + 1 < Model.LineCount then
    255.   begin
    256.     Len := GetLineLen(Model.CurLine);
    257.     for i := 0 to GetLineLen(Model.CurLine + 1) - 1 do
    258.       Model.Cells[Model.CurLine, Len + i] := Model.Cells[Model.CurLine + 1, i];
    259.    
    260.     for i := Model.CurLine + 1 to Model.LineCount - 2 do
    261.     begin
    262.       for j := 0 to MAX_COLS - 1 do
    263.         Model.Cells[i, j] := Model.Cells[i + 1, j];
    264.     end;
    265.     Dec(Model.LineCount);
    266.    
    267.     for i := 0 to MAX_COLS - 1 do
    268.       Model.Cells[Model.LineCount, i].Ch := #0;
    269.    
    270.     InvalidateRect(View.Handle, nil, True);
    271.   end;
    272.  
    273.   UpdateCaret;
    274. end;
    275.  
    276. procedure InsertTab;
    277. var i: Integer;
    278. begin
    279.   for i := 1 to 4 do InsertChar(' ');
    280. end;
    281.  
    282. procedure MoveCursor(Line, Col: Integer);
    283. begin
    284.   if Line < 0 then Line := 0;
    285.   if Line >= Model.LineCount then Line := Model.LineCount - 1;
    286.   if Col < 0 then Col := 0;
    287.   if Col > GetLineLen(Line) then Col := GetLineLen(Line);
    288.  
    289.   Model.CurLine := Line;
    290.   Model.CurCol := Col;
    291.  
    292.   ScrollToCursor;
    293.   UpdateCaret;
    294.   UpdateWindowTitle;
    295. end;
    296.  
    297. // ==================== ОТРИСОВКА ====================
    298.  
    299. procedure HighlightCurrentLine(dc: HDC);
    300. var
    301.   Rect: TRect;
    302.   CurrentLineVisible: Integer;
    303. begin
    304.   if (Model.CurLine < View.ScrollLine) or
    305.      (Model.CurLine >= View.ScrollLine + GetVisibleLines) then
    306.     Exit;
    307.  
    308.   CurrentLineVisible := Model.CurLine - View.ScrollLine;
    309.  
    310.   Rect.Left := 0;
    311.   Rect.Top := TOP_MARGIN + CurrentLineVisible * LINE_SPACING;
    312.   Rect.Right := View.Width - SCROLLBAR_WIDTH;
    313.   Rect.Bottom := Rect.Top + CHAR_HEIGHT;
    314.  
    315.   SetBkColor(dc, CURRENT_LINE_COLOR);
    316.   ExtTextOut(dc, 0, 0, ETO_OPAQUE, @Rect, nil, 0, nil);
    317. end;
    318.  
    319. procedure DrawLineNumbers(dc: HDC);
    320. var
    321.   i, Y: Integer;
    322.   StartLine, EndLine: Integer;
    323.   VisibleLines: Integer;
    324.   NumberStr: string;
    325.   OldBkMode: Integer;
    326.   OldTextColor: COLORREF;
    327. begin
    328.   VisibleLines := GetVisibleLines;
    329.   StartLine := View.ScrollLine;
    330.   EndLine := StartLine + VisibleLines;
    331.   if EndLine > Model.LineCount then EndLine := Model.LineCount;
    332.  
    333.   OldBkMode := SetBkMode(dc, TRANSPARENT);
    334.   OldTextColor := SetTextColor(dc, RGB(100, 100, 100));
    335.  
    336.   Y := TOP_MARGIN;
    337.   for i := StartLine to EndLine - 1 do
    338.   begin
    339.     NumberStr := IntToStr(i + 1);
    340.     TextOut(dc, LEFT_MARGIN - LINE_NUMBER_WIDTH + 5, Y, PChar(NumberStr), Length(NumberStr));
    341.     Y := Y + LINE_SPACING;
    342.   end;
    343.  
    344.   SetBkMode(dc, OldBkMode);
    345.   SetTextColor(dc, OldTextColor);
    346. end;
    347.  
    348. procedure DrawText(dc: HDC);
    349. var
    350.   i, j, X, Y: Integer;
    351.   StartLine, EndLine: Integer;
    352.   VisibleCols: Integer;
    353. begin
    354.   StartLine := View.ScrollLine;
    355.   EndLine := StartLine + GetVisibleLines;
    356.   if EndLine > Model.LineCount then EndLine := Model.LineCount;
    357.  
    358.   VisibleCols := GetVisibleCols;
    359.  
    360.   Y := TOP_MARGIN;
    361.   for i := StartLine to EndLine - 1 do
    362.   begin
    363.     X := LEFT_MARGIN;
    364.    
    365.     for j := View.ScrollCol to View.ScrollCol + VisibleCols - 1 do
    366.     begin
    367.       if Model.Cells[i, j].Ch <> #0 then
    368.       begin
    369.         SetTextColor(dc, RGB(0, 0, 0));
    370.         SetBkColor(dc, RGB(255, 255, 255));
    371.         TextOut(dc, X, Y, @Model.Cells[i, j].Ch, 1);
    372.       end;
    373.      
    374.       Inc(X, CHAR_WIDTH);
    375.     end;
    376.    
    377.     Inc(Y, LINE_SPACING);
    378.   end;
    379. end;
    380.  
    381. procedure DrawAll(dc: HDC);
    382. begin
    383.   HighlightCurrentLine(dc);
    384.   DrawLineNumbers(dc);
    385.   DrawText(dc);
    386. end;
    387.  
    388. // ==================== ОБРАБОТЧИКИ ====================
    389.  
    390. procedure OnPaint;
    391. var
    392.   ps: TPaintStruct;
    393.   dc: HDC;
    394.   Font: HFONT;
    395.   OldFont: HFONT;
    396. begin
    397.   dc := BeginPaint(View.Handle, ps);
    398.  
    399.   Font := CreateFont(CHAR_HEIGHT, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    400.                      DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    401.                      CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    402.                      FIXED_PITCH or FF_MODERN, 'Courier New');
    403.   OldFont := SelectObject(dc, Font);
    404.  
    405.   DrawAll(dc);
    406.  
    407.   SelectObject(dc, OldFont);
    408.   DeleteObject(Font);
    409.   EndPaint(View.Handle, ps);
    410. end;
    411.  
    412. procedure OnVScroll(wParam: WPARAM);
    413. var
    414.   si: TScrollInfo;
    415.   NewPos: Integer;
    416. begin
    417.   si.cbSize := SizeOf(si);
    418.   si.fMask := SIF_ALL;
    419.   GetScrollInfo(View.VScroll, SB_CTL, si);
    420.  
    421.   case LoWord(wParam) of
    422.     SB_LINEUP:    NewPos := View.ScrollLine - 1;
    423.     SB_LINEDOWN:  NewPos := View.ScrollLine + 1;
    424.     SB_PAGEUP:    NewPos := View.ScrollLine - GetVisibleLines;
    425.     SB_PAGEDOWN:  NewPos := View.ScrollLine + GetVisibleLines;
    426.     SB_THUMBTRACK: NewPos := si.nTrackPos;
    427.   else
    428.     Exit;
    429.   end;
    430.  
    431.   if NewPos < 0 then NewPos := 0;
    432.   if NewPos > View.MaxScrollLine then NewPos := View.MaxScrollLine;
    433.  
    434.   if NewPos <> View.ScrollLine then
    435.   begin
    436.     View.ScrollLine := NewPos;
    437.     UpdateScrollRanges;
    438.     InvalidateRect(View.Handle, nil, True);
    439.     UpdateCaret;
    440.   end;
    441. end;
    442.  
    443. procedure OnHScroll(wParam: WPARAM);
    444. var
    445.   si: TScrollInfo;
    446.   NewPos: Integer;
    447. begin
    448.   si.cbSize := SizeOf(si);
    449.   si.fMask := SIF_ALL;
    450.   GetScrollInfo(View.HScroll, SB_CTL, si);
    451.  
    452.   case LoWord(wParam) of
    453.     SB_LINELEFT:  NewPos := View.ScrollCol - 1;
    454.     SB_LINERIGHT: NewPos := View.ScrollCol + 1;
    455.     SB_PAGELEFT:  NewPos := View.ScrollCol - GetVisibleCols;
    456.     SB_PAGERIGHT: NewPos := View.ScrollCol + GetVisibleCols;
    457.     SB_THUMBTRACK: NewPos := si.nTrackPos;
    458.   else
    459.     Exit;
    460.   end;
    461.  
    462.   if NewPos < 0 then NewPos := 0;
    463.   if NewPos > View.MaxScrollCol then NewPos := View.MaxScrollCol;
    464.  
    465.   if NewPos <> View.ScrollCol then
    466.   begin
    467.     View.ScrollCol := NewPos;
    468.     UpdateScrollRanges;
    469.     InvalidateRect(View.Handle, nil, True);
    470.     UpdateCaret;
    471.   end;
    472. end;
    473.  
    474. procedure OnMouseDown(X, Y: Integer);
    475. var
    476.   ClickedLine, ClickedCol: Integer;
    477. begin
    478.   SetFocus(View.Handle);
    479.  
    480.   if X < LEFT_MARGIN - LINE_NUMBER_WIDTH then
    481.   begin
    482.     ClickedLine := View.ScrollLine + (Y - TOP_MARGIN) div LINE_SPACING;
    483.     if ClickedLine < 0 then ClickedLine := 0;
    484.     if ClickedLine >= Model.LineCount then ClickedLine := Model.LineCount - 1;
    485.     MoveCursor(ClickedLine, 0);
    486.     Exit;
    487.   end;
    488.  
    489.   ClickedLine := View.ScrollLine + (Y - TOP_MARGIN) div LINE_SPACING;
    490.   if ClickedLine < 0 then ClickedLine := 0;
    491.   if ClickedLine >= Model.LineCount then ClickedLine := Model.LineCount - 1;
    492.  
    493.   ClickedCol := View.ScrollCol + (X - LEFT_MARGIN) div CHAR_WIDTH;
    494.   if ClickedCol < 0 then ClickedCol := 0;
    495.  
    496.   MoveCursor(ClickedLine, ClickedCol);
    497. end;
    498.  
    499. procedure OnChar(wParam: WPARAM);
    500. begin
    501.   case wParam of
    502.     8: DeleteChar;
    503.     13: NewLine;
    504.     9: InsertTab;
    505.   else
    506.     if wParam >= 32 then
    507.       InsertChar(Char(wParam));
    508.   end;
    509.   UpdateCaret;
    510. end;
    511.  
    512. procedure OnKeyDown(wParam: WPARAM);
    513. begin
    514.   case wParam of
    515.     VK_LEFT:   MoveCursor(Model.CurLine, Model.CurCol - 1);
    516.     VK_RIGHT:  MoveCursor(Model.CurLine, Model.CurCol + 1);
    517.     VK_UP:     MoveCursor(Model.CurLine - 1, Model.CurCol);
    518.     VK_DOWN:   MoveCursor(Model.CurLine + 1, Model.CurCol);
    519.     VK_HOME:   MoveCursor(Model.CurLine, 0);
    520.     VK_END:    MoveCursor(Model.CurLine, GetLineLen(Model.CurLine));
    521.     VK_DELETE: DeleteCharRight;
    522.   end;
    523.   UpdateCaret;
    524. end;
    525.  
    526. // ==================== ОКОННАЯ ПРОЦЕДУРА ====================
    527.  
    528. function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    529. var
    530.   i, j: Integer;
    531. begin
    532.   Result := 0;
    533.  
    534.   case Msg of
    535.     WM_CREATE:
    536.       begin
    537.         View.Handle := hWnd;
    538.         Model.LineCount := 1;
    539.         for i := 0 to MAX_LINES - 1 do
    540.           for j := 0 to MAX_COLS - 1 do
    541.             Model.Cells[i, j].Ch := #0;
    542.         Model.CurLine := 0;
    543.         Model.CurCol := 0;
    544.         View.ScrollLine := 0;
    545.         View.ScrollCol := 0;
    546.        
    547.         View.VScroll := CreateWindow('SCROLLBAR', nil,
    548.           WS_CHILD or WS_VISIBLE or SBS_VERT,
    549.           0, 0, SCROLLBAR_WIDTH, 0, hWnd, 0, HInstance, nil);
    550.        
    551.         View.HScroll := CreateWindow('SCROLLBAR', nil,
    552.           WS_CHILD or WS_VISIBLE or SBS_HORZ,
    553.           0, 0, 0, SCROLLBAR_WIDTH, hWnd, 0, HInstance, nil);
    554.        
    555.         UpdateScrollRanges;
    556.         UpdateWindowTitle;
    557.         Result := 0;
    558.       end;
    559.      
    560.     WM_SIZE:
    561.       begin
    562.         View.Width := LOWORD(lParam);
    563.         View.Height := HIWORD(lParam);
    564.        
    565.         MoveWindow(View.VScroll, View.Width - SCROLLBAR_WIDTH, 0,
    566.                    SCROLLBAR_WIDTH, View.Height - SCROLLBAR_WIDTH, True);
    567.         MoveWindow(View.HScroll, 0, View.Height - SCROLLBAR_WIDTH,
    568.                    View.Width - SCROLLBAR_WIDTH, SCROLLBAR_WIDTH, True);
    569.        
    570.         UpdateScrollRanges;
    571.         InvalidateRect(hWnd, nil, True);
    572.         Result := 0;
    573.       end;
    574.      
    575.     WM_VSCROLL:
    576.       OnVScroll(wParam);
    577.      
    578.     WM_HSCROLL:
    579.       OnHScroll(wParam);
    580.      
    581.     WM_PAINT:
    582.       OnPaint;
    583.      
    584.     WM_LBUTTONDOWN:
    585.       OnMouseDown(LOWORD(lParam), HIWORD(lParam));
    586.      
    587.     WM_SETFOCUS:
    588.       begin
    589.         CreateCaret(hWnd, 0, 2, CHAR_HEIGHT);
    590.         ShowCaret(hWnd);
    591.         UpdateCaret;
    592.         Result := 0;
    593.       end;
    594.      
    595.     WM_KILLFOCUS:
    596.       begin
    597.         HideCaret(hWnd);
    598.         DestroyCaret;
    599.         Result := 0;
    600.       end;
    601.      
    602.     WM_CHAR:
    603.       OnChar(wParam);
    604.      
    605.     WM_KEYDOWN:
    606.       OnKeyDown(wParam);
    607.      
    608.     WM_DESTROY:
    609.       begin
    610.         PostQuitMessage(0);
    611.         Result := 0;
    612.       end;
    613.   else
    614.     Result := DefWindowProc(hWnd, Msg, wParam, lParam);
    615.   end;
    616. end;
    617.  
    618. // ==================== ТОЧКА ВХОДА ====================
    619.  
    620. var
    621.   WC: TWndClass;
    622. begin
    623.   FillChar(WC, SizeOf(WC), 0);
    624.   WC.style := CS_HREDRAW or CS_VREDRAW;
    625.   WC.lpfnWndProc := @WndProc;
    626.   WC.hInstance := HInstance;
    627.   WC.hbrBackground := GetStockObject(WHITE_BRUSH);
    628.   WC.lpszClassName := 'SimpleEditor';
    629.   Windows.RegisterClass(WC);
    630.  
    631.   View.Handle := CreateWindow('SimpleEditor', 'Simple Editor',
    632.     WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN,
    633.     230, 100, 800, 600,
    634.     0, 0, HInstance, nil);
    635.  
    636.   if View.Handle = 0 then
    637.     Halt(1);
    638.  
    639.   ShowWindow(View.Handle, SW_SHOW);
    640.   UpdateWindow(View.Handle);
    641.  
    642.   while GetMessage(Msg, 0, 0, 0) do
    643.   begin
    644.     TranslateMessage(Msg);
    645.     DispatchMessage(Msg);
    646.   end;
    647. end.
     

    Вложения:

    • Editor.rar
      Размер файла:
      23,1 КБ
      Просмотров:
      6
  10. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Я напоминаю, что ты споришь с тезисом о том, что в одно лицо без заимствования чужого кода нельзя создать программу, не уступающую существующим аналогам. Судя по размеру исполняемого файла и тому, что он написан на дельфи - это что-то около хеловорлда.
     
  11. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    47
    Покажи пальцем, что в этом хеловролде заимствовано из чужого кода?
    Код (Pascal):
    1. type
    2.   TCell = record
    3.     Ch: Char;
    4.     Attr: Byte;
    5.   end;
    6.  
    7.   TEditorModel = record
    8.     Cells: array[0..MAX_LINES - 1, 0..MAX_COLS - 1] of TCell;
    9.     LineCount: Integer;
    10.     CurLine, CurCol: Integer;
    11.   end;
    12.  
    13.   TEditorView = record
    14.     Handle: HWND;
    15.     VScroll, HScroll: HWND;
    16.     ScrollLine, ScrollCol: Integer;
    17.     MaxScrollLine, MaxScrollCol: Integer;
    18.     Width, Height: Integer;
    19.   end;
    Эти структуры я сам придумывал.
     
  12. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Давай помогу с формальной логикой: здесь три критерия, объединенных конъюнкцией:
    A = B & C & D
    Я сделал предположение, что критерий D не выполняется. Указал на это.
     
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    674
    Анализ.

    Сам код:
    Становится ясно почему юный пациент не может использовать диз/отладчик, там непонятное :crazy:
     

    Вложения:

    • треш.pdf
      Размер файла:
      1,7 МБ
      Просмотров:
      12
    f13nd нравится это.
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.261
    Tech, бан на месяц
     
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Не знаю относится ли к глубоким знаниям апи то, что поля left и top здесь всегда будут нулю равны:
    Код (Text):
    1.   GetClientRect(View.Handle, ClientRect);
    2.   Result := (ClientRect.Right - ClientRect.Left - LEFT_MARGIN - SCROLLBAR_WIDTH) div CHAR_WIDTH;
    Никогда не устану удивляться крутизне этого компилера, он буквально вычитает сначала LEFT_MARGIN, затем SCROLLBAR_WIDTH:
    Код (Text):
    1. 00408452 E8 21C6FFFF call <JMP.&GetClientRect>
    2. 00408457 8B4424 08   mov eax,dword ptr ss:[esp+8]
    3. 0040845B 2B0424      sub eax,dword ptr ss:[esp]
    4. 0040845E 83E8 32     sub eax,32
    5. 00408461 83E8 14     sub eax,14
    RGB это вызов процедуры. Константа? Хреностанта! Работает лучший и самый скорострельный компилер современности, ему лучше знать:
    Код (Text):
    1.         SetBkColor(dc, RGB(255, 255, 255));
    Код (Text):
    1.  
    2. 00408DEC B1 FF       mov cl,FF
    3. 00408DEE B2 FF       mov dl,FF
    4. 00408DF0 B0 FF       mov al,FF
    5. 00408DF2 E8 1DBDFFFF call <main.sub_404B14>
    6. 00408DF7 50          push eax
    7. 00408DF8 55          push ebp
    8. 00408DF9 E8 1ABCFFFF call <JMP.&SetBkColor>
    Классика, два соседних паттерна. Даже лишний префикс в предыдущей инструкции не повод не пихнуть еще одну, обрубив старшие поля еще раз для надежности:
    Код (Text):
    1. 004078CD 8BD0          mov edx,eax
    2. 004078CF 66:81E2 FF03  and dx,3FF
    3. 004078D4 0FB7D2        movzx edx,dx
    4. 004078D7 8915 40B74000 mov dword ptr ds:[40B740],edx
    Тут просто немая сцена:
    Код (Text):
    1. 0040933B 33C0        xor eax,eax
    2. 0040933D A3 A0B74000 mov dword ptr ds:[40B7A0],eax
    3. 00409342 33C0        xor eax,eax
    4. 00409344 A3 A4B74000 mov dword ptr ds:[40B7A4],eax
    5. 00409349 33C0        xor eax,eax
    6. 0040934B A3 B4B74000 mov dword ptr ds:[40B7B4],eax
    7. 00409350 33C0        xor eax,eax
    8. 00409352 A3 B8B74000 mov dword ptr ds:[40B7B8],eax
    --- Сообщение объединено, 17 июн 2026 в 23:02 ---
    Точно помню, что студия еще в начале десятых видела константы например, закостыливая их всячески. Стык между паттернами конъюнкции и преобразования типов тоже отработала бы как надо. Так что нет, с нормальным компилером такого не надо делать.
     
    Ahimov нравится это.
  16. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    170
    Я предполагаю что это демка а не готовый проект в прод.
    Код (Pascal):
    1. array[0..MAX_LINES - 1, 0..MAX_COLS - 1]
    Такие вещи динамически создаются в той же scintill'e.
    Ты прав. В этой паскалевой демке даже выделения текста нет. И .asm файлы она не компилирует в отличии от vscode.
    Нормальные люди такие вещи на асме пишут(на том же фасме), чтобы не было такого вопиющего фуфла в инструкциях.

    P. S. лично мне понятно, что имел в виду автор улетевший в бан.
     
  17. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Точно помню, что студия еще в начале десятых нормально костылила константы, что в выражениях, что пропуская вызовы функций. И стык между паттернами конъюнкции и преобразования типа тоже отработала бы правильно. Так что нет, с нормальным компилятором такого не надо делать.
     
  18. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    674
    f13nd,

    Оптимизатора там нет совсем ?
     
  19. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    170
    Может какую нибудь демку сам напишешь? Чтобы быстрее свою мысль донести?
    Не нужен будет бред из булевой логики и портянки .асм листингов.
     
  20. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.214
    Судя по всему есть, но вот такой слабенький. Прямо мешанины из паттернов как у gcc там нету.
    Какую демку ты хочешь? Показать как вычитать одним приемом сумму из двух констант? Или как вызвать SetBkColor(dc, 0x00FFFFFF)?