<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414918&amp;view=findpost&amp;p=3800521</guid>
        <pubDate>Fri, 31 May 2019 11:46:34 +0000</pubDate>
        <title>Перерисовка ячейки DBGrid при клике на неё</title>
        <link>https://forum.sources.ru/index.php?showtopic=414918&amp;view=findpost&amp;p=3800521</link>
        <description><![CDATA[seska86: Удалось решить проблемы:<br>
<br>
С чекбоксами - за счет того, что убрал из базы соответствующее поле и держу ID&#39;ники выбранных записей в памяти. Все прорисовывается отлично.<br>
С другими записями - с помощью использования закладок:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TFrameTemplatePage.RefreshBrowse;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lMoveByIndex : integer;</div><div class="code_line">&nbsp;&nbsp;lBookMark : TBookmark;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FQueryBrowse.UpdateCursorPos;</div><div class="code_line">&nbsp;&nbsp;lBookMark := FQueryBrowse.GetBookmark;</div><div class="code_line">&nbsp;&nbsp;FQueryBrowse.DisableControls;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;lMoveByIndex := TMyDataSet(FQueryBrowse).FCurrentRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FQueryBrowse.SQL.Text := FTableBrowse.GetSelectQuery;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FQueryBrowse.Active := TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FQueryBrowse.MoveBy(lMoveByIndex - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if FQueryBrowse.BookmarkValid(lBookMark)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then FQueryBrowse.GotoBookmark(lBookMark);</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;FQueryBrowse.EnableControls;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FQueryBrowse.FreeBookmark(lBookMark);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>seska86</author>
        <category>Delphi: Базы данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414918&amp;view=findpost&amp;p=3800352</guid>
        <pubDate>Wed, 29 May 2019 18:52:20 +0000</pubDate>
        <title>Перерисовка ячейки DBGrid при клике на неё</title>
        <link>https://forum.sources.ru/index.php?showtopic=414918&amp;view=findpost&amp;p=3800352</link>
        <description><![CDATA[seska86: Доброго времени суток, уважаемые форумчане. Прошу вашего совета в возникшем вопросе.<br>
<br>
<strong class='tag-b'>Исходные данные:</strong> DBGrid, ZQuery. В ZQuery содержится запрос, в котором выполняется SELECT из нескольких таблиц (использую JOIN&#39;ы). Таблицу прорисовываю вручную (DBGrid.DefaultDrawing := False), т.к. в ней содержится очень много графики (содержимое ячеек подменяются различными картинками).<br>
<br>
<strong class='tag-b'>Задача:</strong> при клике на ячейку таблицы изменять значение этой ячейки (например, банальный чекбокс) и перерисовывать картинку, в зависимости от измененного содержимого. <br>
<br>
<strong class='tag-b'>Попытка №1. Изменение значения в поле напрямую</strong><br>
Пробовал в DBGridCellClick()  изменять значение поля напрямую через TField.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TFrameTemplatePage.DBGridCellClick(Column: TColumn);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lField : TField;</div><div class="code_line">&nbsp;&nbsp;lRect &nbsp;: TRect;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lField := DBGrid.Fields[FGridCoord.X]; //FGridCoord : TGridCoord - номер активной ячейки DBGrid</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DBGrid.DataSource.DataSet.Edit;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;if lField.AsInteger = 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;then lField.Value := 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;else lField.Value := 0;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;lRect := DBGrid.CellRect(FGridCoord.X, FGridCoord.Y);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DBGridDrawDataCell(Self, lRect, lField, [gdSelected, gdFocused]); //Перерисовываю содержимое этой ячейки</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFrameTemplatePage.DBGridDrawDataCell(Sender: TObject; const Rect: TRect;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Field: TField; State: TGridDrawState);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lChecked : integer;</div><div class="code_line">&nbsp;&nbsp;lStartPoint : TPoint;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//Для удобства убрал все лишнее, оставив только необходимый код</div><div class="code_line">&nbsp;&nbsp;if Field.FieldName &#60;&#62; FCheckFieldTitle</div><div class="code_line">&nbsp;&nbsp; &nbsp;then Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;lChecked := Field.AsInteger;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if lChecked = 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;then ImageIndex := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;else ImageIndex := 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;lStartPoint := GetCenteredLeftTop(Rect, ImageListCheckBoxes.Width, ImageListCheckBoxes.Height); //самописные функции для отрисовки</div><div class="code_line">&nbsp;&nbsp;X := StartPoint.X;</div><div class="code_line">&nbsp;&nbsp;Y := StartPoint.Y;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ImageListCheckBoxes.Draw(DBGrid.Canvas, X, Y, ImageIndex);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Все работает ровно до того момента пока не кликну потом на другую какую-нибудь ячейку. Выходит сообщение: Cannot update a complex query with more then one table :( Похоже из-за того что у меня в запросе не одна таблица, такой вариант не прокатывает.<br>
<br>
<strong class='tag-b'>Попытка №2. Изменение значения поле через стороннюю ORM, обновление ZQuery и позиционирование к нужной записи ZQuery.Locate</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">TFrameTemplatePage.DBGridCellClick(Column: TColumn);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lField : TField;</div><div class="code_line">&nbsp;&nbsp;FieldValue : integer;</div><div class="code_line">&nbsp;&nbsp;PKValue : integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FieldValue := FQueryBrowse.FieldByName(FCheckFieldTitle).AsInteger;</div><div class="code_line">&nbsp;&nbsp;PKValue &nbsp; &nbsp;:= FQueryBrowse.FieldByName(FPKFieldName).AsInteger;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;FTableRecord.QueryConstructor.ClearConditions;</div><div class="code_line">&nbsp;&nbsp;if FieldValue = 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;then FTableRecord.UpdateRecord(PKValue, FCheckFieldName, 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;else FTableRecord.UpdateRecord(PKValue, FCheckFieldName, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;RefreshBrowse;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFrameTemplatePage.RefreshBrowse;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lStr : string;</div><div class="code_line">&nbsp;&nbsp;lCurrentRecordID : integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lCurrentRecordID := GetCurrentRecordId;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;lStr := FTableBrowse.GetSelectQuery;</div><div class="code_line">&nbsp;&nbsp;FQueryBrowse.SQL.Text := lStr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;FQueryBrowse.Active := TRUE;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;FQueryBrowse.Locate(PKFieldName, lCurrentRecordID);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
И этот вариант тоже работает, но происходит обновление всей таблицы, а Locate возвращает курсор DBgrid таким образом, что выбранная строка становится первой сверху. Т.е. позиционирование сбивается и дизориентирует пользователя (заметно, когда в таблице количество записей на 2 экрана и больше).<br>
<br>
Прошу помочь советом.]]></description>
        <author>seska86</author>
        <category>Delphi: Базы данных</category>
      </item>
	
      </channel>
      </rss>
	