Задать вопрос
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Это проверка расставленной позиции? А чего уж тут ненормального может быть? Работает? Вот и хорошо! У меня вот за этот кусочек больше глаз зацепился:
    if not Flag then
      Begin
        frmMain.Hide;
        Form1.Show;
      End;

    Это что, какое-то сообщение об ошибке небось? А зачем основную форму скрывать?
    Впрочем это дело хозяйское.

    И ещё, это так задумано, что:
    - проверить вертикали-горизонтали,
    - если найдена ошибка, то что-то показать
    - была ошибка или нет, всё равно проверять диагонали <-- это точно так должно быть?
    - если найдена ошибка, то что-то показать
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, так она же в поиске решения есть проверка такая. Там где типа "если модуль разности строк равен модулю разности колонок то ферзи на одной диагонали". Как-то так примерно. Это если по массиву бежать и каждого уже установленного ферзя с интересующей точкой сравнивать.
    Или можно от интересующей точки пробежать по диагоналям в четыре стороны до границы доски и смотреть, попадётся ли ферзь. Если попался сразу останавливаться.
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, Ну начинааается! Я уж думал, народ таки перестал ssd экономить - а нет, новую тему нашли! Шучу! :)
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, всё в целом вроде правильно пишете, но вот это я совсем не понял:
    я например вынес темп папки рабочий стол и загрузки на другой ссд, файл подкачки тоже, 100 гиг винде вполне хватает, если задрот то и сохраненки тоже можно вынести

    В чём прикол переноса этих папок с одного ssd на другой? Ну если только вам комп/ноут достался именно в таком виде - пара мелких ssd, каждого по отдельности мало и нужно как-то между ними распределиться.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Да, пожалуй и там и там надо рисовать. Или при клике перерисовку всей доски вызывать, что понятное дело хуже. Быстрее попробовали бы! Примерно так надо:
    var
      frmMain: TfrmMain;
      ...
      Queens: array [0..MaxQueensCount-1, 0..MaxQueensCount-1] of boolean;
      img1, img2: TPicture;
    
    procedure TfrmMain.FormCreate(Sender: TObject);
    var
      i, j: Integer;
    begin
      ...
      for i := 0 to MaxQueensCount-1 do
        for j := 0 to MaxQueensCount-1 do
          Queens[i, j] := false;
      img1:= TPicture.Create;
      img1.LoadFromFile('E:\Ферзь 1.bmp');
      img2:= TPicture.Create;
      img2.LoadFromFile('E:\Ферзь 2.bmp');
    end;
    
    procedure TfrmMain.grdChessBoardClick(Sender: TObject);
    var
      CellColor: TColor;
    begin
      Queens[grdChessBoard.Col, grdChessBoard.Row] := not Queens[grdChessBoard.Col, grdChessBoard.Row];
      with grdChessBoard do
        if Queens[grdChessBoard.Col, grdChessBoard.Row] then
        begin
            if (Col + Row) mod 2 = 0 then
              Canvas.StretchDraw(CellRect(Col, Row), img1.Graphic)
            else
              Canvas.StretchDraw(CellRect(Col, Row), img2.Graphic);
        end
        else
        begin
          if ((Col + Row) mod 2) = 0 then
            CellColor := clWhite
          else
            CellColor := clGray;
          grdChessBoard.Canvas.Brush.Color := CellColor;
          grdChessBoard.Canvas.FillRect(CellRect(Col, Row));
        end;
    end;
    
    procedure TfrmMain.grdChessBoardDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      CellColor: TColor;
    begin
      with grdChessBoard do
        if Queens[ACol, ARow] then
        begin
          if (ACol + ARow) mod 2 = 0 then
            Canvas.StretchDraw(CellRect(ACol, ARow), img1.Graphic)
          else
            Canvas.StretchDraw(CellRect(ACol, ARow), img2.Graphic);
        end
        else
        begin
          if ((ACol + ARow) mod 2) = 0 then
            CellColor := clWhite
          else
            CellColor := clGray;
          Canvas.Brush.Color := CellColor;
          Canvas.FillRect(Rect);
        end;
    end;


    Клик по ячейке либо ставит либо убирает ферзя.
    По уму, код рисования ячейки, повторяющийся в двух местах, лучше организовать в отдельную процедурку, которую и вызывать из обоих обработчиков событий.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, вопрос не очень понял. Да, все вместе, в том смысле, что сколько нужно ферзей, столько и будет отображено. И да, поочерёдно, в том смысле, что отрисовка всей сетки состоит из последовательной отрисовки ячеек.
  • Как можно оптимизировать код?

    @kalapanga
    Да, я чего-то и внимания не обратил, что только одна картинка и рисуется.
    Попробуйте следующее:
    1) Нужна структура (массив какой-нибудь) хранящий информацию о клетках доски - есть в ней ферзь или нет. Типа массива в котором сейчас решение формируется или любом каком удобнее, неважно!
    2) В событии OnClick ничего не рисуем, а только определяем в какой ячейке нужно добавить/убрать ферзя и записываем эту информацию в структуре из п.1
    3) А рисуем ферзей в событии OnDrawCell. Там при отрисовке ячейки проверяем не только какого она цвета должна быть, а ещё и проверяем по нашему массиву не нужно ли отобразить в ячейке ферзя. Если нужно - рисуем.
    Вроде по теории так оно должно работать.
  • Как можно оптимизировать код?

    @kalapanga
    Это суметь надо! Процедура TfrmMain.grdChessBoardClick есть, а событию она не назначена.
    В Object Inspector у grdChessBoard вкладку Events глядим - а у OnClick и нету ничего. Куда делось?
    Бывает :) Выбери её тут из списка и всё заработает.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, А чего, у меня всё даже работает. Ни буквы не поменял кроме пути к файлам. Кликаю и либо одну, либо другую бмп-шку рисует. Я тупо из Paint-а два квадратика - синий и красный сохранил. Я было подумал, что может оно с OnDrawCell конфликтует. Но нет, проверил - рисует.
    Файлы-то точно по этому пути лежат?

    Ну и сразу же. Сами переменные img1, img2 и чтение картинок из файла нужно вынести из этой процедуры. Переменные или в саму форму или в глобальные накрайняк. Читать где-нибудь в TfrmMain.FormCreate. Зачем это каждый клик-то делать?
    И про абсолютные пути как раз в этом вопросе уже обсуждали.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, И кстати, если поменять тип у SolutionCount с integer на int64, то можно поставить и MaxQueensCount = 27. (Дальше значения этой последовательности в справочниках всё равно отсутствуют)
    И попробовать уморить компьютер :)
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, А зачем кнопки-то ещё городить? У самого TDrawGrid есть и OnClick, и OnDblClick. В них через свойства грида grdChessBoard.Col и grdChessBoard.Row определяем какую клетку ткнули. Или OnSelectCell использовать, там в параметрах события колонка и строка приходят.
    Пишу по памяти, не проверял, но что-то из этого точно подойдёт.
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    nidalee, Выше пишете всё совершенно верно, только не тому человеку ответили (цитируете не меня). :)
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    WbICHA,
    с каких пор установка фиксированного объёма файла подкачки является плохой идеей?
    Идея стала плохой в тот момент, когда в настройку полез ламер, возомнивший, что в механизмах распределения памяти он понимает больше чем сами разработчики ОС.
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    Кирилл Павлов,
    попробую 4 поставить
    Вот в этом и главная беда! Ничего устанавливать не надо. Только автоматически, по выбору операционной системы!
  • Какой набор нужен для начального измерителя температуры на Ardunio?

    @kalapanga
    fantazerno, Ну и конечно в хозяйстве нужно иметь принадлежности для пайки и хоть какой-то мультиметр. Иначе встанете в тупик при первом же "не заработало".
    В догонку. Если будете покупать ардуинки где-нибудь на алиэкспрессах/бангудах, не берите платы на которых написано WAVGAT. Они в формфакторе ардуино, но там другой микроконтроллер. Начинающему лучше с этим не заморачиваться.
  • Почему перегревается ноутбук?

    @kalapanga
    Да он видимо по жизни утюг. Интернет забит вопросами про перегрев у этой модели. Кто-то биос перепрошивает (вроде какое-то из обновлений и с перегревом боролось), кто-то решётки пилит, чистки и смазки всякие, вобщем кто во что горазд, но похоже, что без особых результатов в большинстве случаев
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Это да, в семёрке дженериков ещё не было. Сейчас же у них бесплатная версия - комьюнити эдишн есть. Для учебных целей самое оно!
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Отлично! Вот на всякий случай мой вариант: https://cloud.mail.ru/public/PioU/6Cxxwzsey
    Рекурсия из книжки, стек из вашего примера. Имена переменных особо не менял, сделал только их максимально похожими в обоих расчетах.
    По крайней мере для 10 оба расчета показывают как положено - 724. :)
    Может чего интересного для себя подглядите.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Попробуйте. На дельфевый стек там всё переписывается просто. Вместо самодельного стека в процедуре расчета будет
    procedure ...
    var
      Stack: TStack<integer>;
    begin
      Stack := TStack<integer>.Create;
      try
        //...
        // Тут весь расчёт
        // ...
      finally
        Stack.Free;
      end;
    end;

    Ну и где у него например push(Y); будет Stack.Push(Y); И соответственно pop; превратится в Stack.Pop;
    st_print у него печатает очередное решение, вместо этого будет ваша отрисовка доски.
    В ней достать значения из стека, чтобы их отобразить можно например в цикле через pop.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Ну тут надо почти весь Ваш алгоритм переписать. В этом примере решение действительно формируется в стеке. Но это потому, что для проверки позиции на доске оно не нужно, здесь используются три дополнительных массива, а не само решение. Так в книжке у Вирта эта задача решается, только там с рекурсией. Но определение можно поставить или нет именно такое.
    У Вас же для проверки того, можно или нет поставить ферзя используется сам массив который и будет решением. В этом случае стек как корове седло.
    Чтобы это задание красиво сделать, надо взять вашу оболочку с рисованием, рекурсивное решение из книжки Вирта и решение со стеком из консольного примера, в котором самодельный стек заменить на дельфёвый TStack.
    Справитесь?