Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

TStringGrid OnDrawCell неверное размещение текста   Найти похожие ветки 

 
DeepProg   (2004-06-27 20:44) [0]

Обрабатываю событие OnDrawCell:
for i:=0 to 10 do
if StringGrid1.Cells[ACol,ARow]=FloatToStr(MyArray[i]) then begin
   StringGrid1.Canvas.Font.Color:=clRed;
   StringGrid1.Canvas.TextOut(Rect.Top, Rect.Left,StringGrid1.Cells[ACol,ARow]);
end;

Подходящие ячейки находятся верно: красным выделяются именно числа из массива, но сам этот текст пишется не там, где надо (часто все в одну ячейку). Ячейки не удовлетворяющие условию отображаются нормально. Когда условием являются Col и/или Row, т.е. ячейка определятся координатами - текст пишется там где он и должен быть.
Почему это не удается в случае поиска по значению? И как вообще связаны координаты текста с условием поиска ячейки?!
Maybe неправильно понятсмылс ACol и ARow?


 
KilkennyCat ©   (2004-06-27 21:07) [1]


> StringGrid1.Canvas.TextOut(Rect.Top, Rect.Left,StringGrid1.Cells[ACol,ARow]);


это зачем так?


 
begin...end ©   (2004-06-27 21:14) [2]

StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow])

?


> Maybe неправильно понятсмылс ACol и ARow?


ACol и ARow - номера ряда и колонки для ячейки, подлежащей прорисовке.


 
DeepProg   (2004-06-28 14:41) [3]

Если не писать
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]) и
1. Если идентифицировать ячейку по координатам, то
ничего я чейку не пишется
2. Если по значению - она не окрашивается...
Rect - это координаты прямоугольника обрисовывающего ячейку(Стандартное свойство).
Я, вполне, склонен придраться к этому парамету, но почему при определении ячейки по положению, а не по содержимому эта строчка работает правильно?

begin...end ©   (27.06.04 21:14) [2]

> ACol и ARow - номера ряда и колонки для ячейки, подлежащей
> прорисовке.

Иными словами, текущей - тогда, я думаю, смысл понят правильно.

Попробуйте сами сделать подобное. Может какие-нибудь продуктивные мысли появятся.


 
begin...end ©   (2004-06-28 14:47) [4]

Приведите весь код обработчика OnDrawCell.


 
DeepProg   (2004-06-28 21:18) [5]

см. Мой первый пост - это весь код, кроме разумеется стандартого заголовка процедуры.
Попробуйте это у себя, мне интересно как это получится у вас, Все участники ветки заинтересовались строкой процедуры TextOut, тогда правильно ли мое предположение, что вам удается сменить отображение содержиомго ячейки без нее?
Ничего принципиально не меняется если писать так(строчка из книжки):
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row])


 
KilkennyCat ©   (2004-06-29 00:59) [6]

Я заинтересовался, потому что не понял, зачем рисовать текст. Почему не изменить цвет уже того, который в ячейку введен нормальным образом?


 
wisekaa ©   (2004-06-29 01:46) [7]

Во первых не понимаю зачем тебе цикл? Ведь каждый раз при отрисовке он у тебя будет притормаживать.

2. Ошибка твоя с определением прямоугольника вывода текста.

Вот правильный код:

 StringGrid1.Canvas.Font.Color:=clRed;
 StringGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[Acol,Arow]);


 
KilkennyCat ©   (2004-06-29 01:56) [8]


> StringGrid1.Cells[ACol,ARow]=FloatToStr(MyArray[i])


может, так будет надежней? хотя уже и оффтоп :)


> StrToFloat(StringGrid1.Cells[ACol,ARow])=(MyArray[i])


это позволит сравнить 2,0 и 2,00


 
DeepProg   (2004-06-29 14:18) [9]

2 All : здесь кто-нибудь читает текст не выделенный как код
2 KilkennyCat ©   (29.06.04 00:59) [6] в частности
see DeepProg   (28.06.04 14:41) [3]
-----------
2 All
Пожалуй стоит обрисовать ситуацию поконкретнее и, может, даже сменить subj:
сортируем матрицу по неубыванию минимальных элементов строк.
Здесь обсуждается проблема визуализации результатов, конкретно - выделение этих самых минимумов, чтобы не приходилось их искать глазами.
Первоначально использовался вариант, когда MyArray был массивом Record с полями <минимум строки>; <колонка>: <строка до сортировки>; <строка после сортировки>.
Естественно, определены два StringGrid и идентификация, как вы догадались, велась по координатам ячейки. OnDrawCell обрабатывался все тем же поиском совпадения с массивом, только параметр Row для исходного StringGrid1 был MyArray[i].<строка до сортировки>, а для StringGrid2 - MyArray[i].<строка после сортировки>.
В результате в StringGrid1 все рисовалось правильно, а в StringGrid2 наблюдалась ошибка(не всегда - иногда было правильно) в определении новой строки для какого-нибудь одного минимума, т.е. сортировка-то проходила верно, но выделялась не та ячейка(я проверил код азначения новой строки не смог найти ошибку).
В общем, я спасовал и решил пойти более простым путем, над которым все тут и долбимся.
Все, что касается Canvas TStirngGrid, идентично в обоих случаях(значение/координаты).
И все указывает на то, что никому доподлинно не известна причина невероного расположения выделеннго текста при идентификации по значению. Возвращаться к координатам?
Это главное,
--------------------------
а теперь
wisekaa ©   (29.06.04 01:46) [7]
как насчет ТВОЕЙ головы в качестве гаранта правильности ТВОЕГО кода?
see carefully DeepProg   (27.06.04 20:44)

> часто все в одну ячейку

по-моему тут два пикселя(или чего там) в пределах одной ячейки большого сдвига не дадут.
Еще инфорация для размышления лично тебе:

> Rect - это координаты прямоугольника обрисовывающего > ячейку(Стандартное свойство).

Так что там насчет твоей уверенности?
А вот если научишь обходиться без цикла и реально уменьшить и без того незаметное притормаживание буду благодарен.
------------------------------
оффтопик: KilkennyCat, а Podgoretsky здесь еще бывает? Это, конечно, грубо(всегда рискуешь быть битым :) ), но обычно конкретное, правильное решение.


 
DieHard   (2004-06-29 15:16) [10]

DeepProg, я так и не понял, ты исправлял свой код с
StringGrid1.Canvas.TextOut(Rect.Top, Rect.Left,StringGrid1.Cells[ACol,ARow]);
на
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top,StringGrid1.Cells[ACol,ARow]);
?


 
wisekaa ©   (2004-06-29 15:24) [11]

StringGrid1.Canvas.Font.Color:=clRed;
StringGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[Acol,Arow]);

И

StringGrid1.Canvas.Font.Color:=clRed;
StringGrid1.Canvas.TextOut(Rect.Top, Rect.Left,StringGrid1.Cells[ACol,ARow]);

Чуствуешь РАЗНИЦУ!!!
Насчет твоего поста, что ничего не изменяеться, поэтому и был приведен тебе правильный ответ.

Насчет цикла, если не можешь от него избавиться поставь хотябы BREAK после нахождения нужного значения!!!

Т.к. я понял, что в утебя идет вывод результатов в грид, значит твоя матрица более менее соответствует ввыводу в грид и можго оперировать индексами в матрице и ЯЧЕЙКАМИ в гриде, тогда не надо будет загонять текст в CELLS и делать проверку!

И наконец если тебе этого сказанного мало вот рабочий код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;

type
 TForm1 = class(TForm)
   sg: TStringGrid;
   procedure FormCreate(Sender: TObject);
   procedure sgDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
     State: TGridDrawState);
 private
   { Private declarations }
 public
   { Public declarations }
   myArray: array [0..4] of Single;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 myArray[0] := 2.5;
 myArray[1] := 1.3;
 myArray[2] := 4.7;
 myArray[3] := 8.9;
 myArray[4] := 12.5;
 sg.cells[1,0]:="dfgsdfgdfg";
 sg.cells[1,1]:="dfgsdfgdfg";
 sg.cells[1,2]:="dfgsdfgdfg";
 sg.cells[1,3]:="dfgsdfgdfg";
 sg.cells[1,4]:="dfgsdfgdfg";
end;

procedure TForm1.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
if ACol = 2 then begin
 sg.Canvas.Font.Color:=clRed;
 if (ARow >= Low(myArray)) and (ARow <= High(myArray)) then
 sg.Canvas.TextOut(Rect.Left+2, Rect.Top+2, FloatToStrF(myArray[ARow],ffNumber,99,2));
end;
end;

end.


 
DeepProg   (2004-06-29 22:11) [12]

wisekaa
М-да. Извини, что сорвался на тебя, подслеповат стал. %-\
Ну и ОБЪЯВЛЯЮ БЛАГОДАРНОСТЬ тов. wisekaa за способ избежания использования цикла! :)
А вообще бери пример с DieHard(отдельный Thanks за зоркость) и выделяй, пожалуйста, важные места в тексте, тем более, что никто незаметил, что я сам писал в принципе верную строчку see DeepProg   (28.06.04 21:18) [5], отличную от той, что привел в самом начале - спасибо, что ткнули носом.
> тогда не надо будет загонять текст в CELLS и делать
  > проверку!

не уверен, что правильно понял - ты это реализовал в приведенном коде или нет? Если да, то мы возвращаемся к идентификации по координатам...
Фактически в данной задаче требуется отсортировать массив, построенный из минимумов строк матрицы. Поэтому я во время сортировки массива минимумов просто переставляю и соответствующие строки матрицы, после чего заполняю StringGrid2.
Из твоего кода

> if ACol = 2 then begin

я делаю вывод, что придется как минимум запомнить столбец, в котором лежит перемещаемая ячейка.
Тогда согласен - это менее громоздко, сделать массив записей, чем проверять на соответствие значение текущей ячейки.



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.053 c
3-1087370937
Inkarik
2004-06-16 11:28
2004.07.11
Ошибка SQL Builder


3-1086899351
DIS
2004-06-11 00:29
2004.07.11
фильтр по двум колонкам


1-1088165114
Opryshok
2004-06-25 16:05
2004.07.11
Подскажите идею по создании терминального окна


1-1088445066
XeLax
2004-06-28 21:51
2004.07.11
Как узнать все параметры ключа реестра?


3-1087051839
Sectey
2004-06-12 18:50
2004.07.11
Подключение к MS SQL через ADO