Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1087971630
BorisMor
2004-06-23 10:20
2004.07.11
XML парсер


1-1088524227
hgd
2004-06-29 19:50
2004.07.11
Как подсоединить Excel к Delphi


1-1088570993
Денис
2004-06-30 08:49
2004.07.11
Событие в чужом приложении


14-1087830429
RealRascal
2004-06-21 19:07
2004.07.11
Есть идея!


3-1087213459
Pul
2004-06-14 15:44
2004.07.11
Declared cursor already exist





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский