Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c