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

    @kalapanga
    Alertoso, Нее, Label то тут как уж? Если это делается для фиксированного числа ферзей (8) то положить 8 штук TImage. Сделать их нужного размера. Через свойство Picture в дизайнтайме загрузить в них картинку. Красивее будет если картинка заранее в нужном размере нарисована. Если картинка большего размера, то поставить у TImage свойство Stretch = True. А дальше у них при необходимости менять Visible. Лучше сделать отдельную процедурку с параметром, которая будет делать видимым нужное количество фигурок. Параметр как для общей логики удобнее. Либо число видимых фигур, либо команда добавить/убавить фигурку.
  • Как можно оптимизировать код?

    @kalapanga
    Вспомнил, что ещё заметил. Как раз по теме этого вопроса! Как минимум в паре мест присутствует подобная конструкция:
    while (I <= QueensCount) do with grdChessBoard do
      begin
        Font.Size:=20+trunc(grdChessBoard.DefaultRowHeight/QueensCount)-1;
        Font.Style:=[fsBold];
        Font.Name:='Times New Roman';
        grdChessBoard.Canvas.Brush.Style:=bsClear;
        .....
      end;

    Такие вещи надо делать один раз ДО цикла. А в цикле оставляем только то, что действительно зависит от шага цикла.
  • Как можно оптимизировать код?

    @kalapanga
    С конца начну. Запрещать ставить ферзя надо там, где он собственно и ставится в OnClick.
    Знаем, по какой клетке кликнули.
    По массиву ферзей определяем пустая клетка или нет.
    Если не пустая, то хочет убрать. Это можно всегда. Убираем. Перерисовываем.
    Если пустая, то сначала проверять можно ли в это клетку ставить.
    Если можно, то ставим и рисуем, если нет, ругаемся.

    Про буквы я примерно знаю причину, но расписывать долго. Если кратко, Дельфи в разных случаях, в разных компонентах рисует текст разными механизмами. В нашем случае не включено сглаживание. Если время будет, я попробую реализовать включение.

    И ещё. Про избавление от абсолютных путей всё забываю написать. Кладёте Ферзь 1.bmp и Ферзь 2.bmp в одну папку с EightQueensPuzzle.exe. А в коде пишете так:
    img1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Ферзь 1.bmp');
    img2.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Ферзь 2.bmp');
    И они всегда и у всех будут находиться.
    Совсем хорошо их вообще в ресурсы засунуть, чтобы отдельных файлов не было. Но это уже другая история.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Давайте весь проект целиком (лучше и со всеми бмп-шками). В то, что последний раз выкладывали я этот код вставил - ну буквы как буквы. Ничего особенного не вижу.
    И не понял про какой фон речь - "с фоном четкие". Лучше и пару скриншотов к проекту киньте с хорошими и плохими буквами.
  • Как можно оптимизировать код?

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

    @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. Они в формфакторе ардуино, но там другой микроконтроллер. Начинающему лучше с этим не заморачиваться.