Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

DrawGrid - одни мучения и часы проведенные в пустую   Найти похожие ветки 

 
Dr.Karter   (2003-01-21 10:29) [0]

Я хочу чтобы при чтении некого файла при обнаружении в какой-то строке слова (это всё понятно!) в DrawGrid который имеет три строки и много столбиков, допустим первый квадратик, при таком условии, стал красным, а поскольку таких слов в файле много, то добавляется новый закрашенный квадратик в первой строчке....


 
malkolinge   (2003-01-21 11:27) [1]

Исходники (Grids.pas), DrawCell и т.д. !


 
Dr.Karter   (2003-01-27 10:38) [2]

Я написал обработку DrawCell это все понятно.
Я знаю так же что можно делать по нажатию кнопки на мыше,
но я хочу узнать как сделать чтобы закрашивание квадратика происходило само по себе (предположим на FormCreate)
Я хочу сделать что-то на подобие графика ввиде закрашенных квадратиков разных цветов.
Подскажите подчеркнутую вещь. Спасибо


 
Бурундук   (2003-01-27 10:54) [3]

DrawGrid предназначена отображать внешние данные.
Соответственно, ты должен где-то хранить
информацию о найденных словах и использовать её
в OnDrawCell.

Т.о. для закрашивания квадратика ты должен изменить эту информацию и обновить грид с помощью DrawGrid.Invalidate
или InvalidateRect(...)


 
Dr.Karter   (2003-01-30 12:02) [4]

Какой командой (не MousetoCell() ), осуществлять закрашивание клеточки, а так, чтобы по событию FormCreate(...)
После того как мой массив заполнился map[j,i]=(допустим:1,1,1,0... )
А картинка DrawGrid1.с какой-то командой задания места закрашивания, имела вид: (красный,кр,кр, черный....)


 
Бурундук   (2003-01-30 12:36) [5]

Попробую объяснить ещё раз:
Закрашивать клеточки надо всегда в OnDrawCell:

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
const
Colors: array[0..1]of TColor = (clBlack, clRed);
begin
with (Sender as TDrawGrid).Canvas do
begin
if ACol = colColorMark then
//колонка, в которой ты рисуешь эти
//цветные метки
begin
Brush.Color := Colors[ m[ARow] ];
FillRect(Rect);
end else
begin
{...}
end;
end;
end;

А в OnCreate тебе нужно заполнить массив m - и всё,
даже перерисуется всё само.

Но если ты будешь обновлять этот массив в другом месте,
тебе нужно будет форсировать перерисовку DrawGrid:

procedure TForm1.Button1Click(Sender: TObject);
var R: TRect;
begin
m[17] := 1;

// Можно обновить конкретную ячейку, чтобы всё не мигало:
R := YourDrawGrid.CellRect(colColorMark, 17);
InvalidateRect(YourDrawGrid.Handle, @R, False);

//Или просто обновить всё:
//YourDrawGrid.Invalidate;
end;


 
pl_quad   (2003-01-30 12:58) [6]

Объявляешь свой массив как класс

TMyArray = class
private
function GetItem(x, y: integer): integer;
procedure SetItem(x, y: integer; const Value: integer);
function GetXSize: integer;
procedure SetXSize(const Value: integer);
function GetYSize: integer;
procedure SetYSize(const Value: integer);
protected
arr: array of array of integer;
FGrid: TCustomGrid;
public
constructor Create(Grid: tcustomgrid);
destructor Destroy; override;
public
procedure Changed;
property Items[x,y: integer]: integer read GetItem write SetItem;
property XSize: integer read GetXSize write SetXSize;
property YSize: integer read GetYSize write SetYSize;
end;

implementation

{ TMyArray }

procedure TMyArray.Changed;
begin
if FGrid <> nil then FGrid.Invalidate;
end;

constructor TMyArray.Create(Grid: tcustomgrid);
begin
inherited Create;
FGrid := Grid;
end;

destructor TMyArray.Destroy;
begin
XSize := 0;
inherited;
end;

function TMyArray.GetItem(x, y: integer): integer;
begin
Result := arr[x,y];
end;

function TMyArray.GetXSize: integer;
begin
Result := length(arr);
end;

function TMyArray.GetYSize: integer;
begin
if Length(arr)>0 then Result := length(arr[0]) else Result:= 0;
end;

procedure TMyArray.SetItem(x, y: integer; const Value: integer);
begin
arr[x,y] := Value;
Changed;
end;

procedure TMyArray.SetXSize(const Value: integer);
var
i, oldXSize: integer;
begin
oldXSize := GetXSize;
if Value > oldXSize then begin
SetLength(arr, Value);
for i := oldXSize to Value - 1 do
SetLength(arr[i], GetYSize);
end else
if Value > oldXSize then begin
for i := Value to oldXSize - 1 do
SetLength(arr[i], 0);
SetLength(arr, Value);
end;
Changed;
end;

procedure TMyArray.SetYSize(const Value: integer);
var
i: integer;
begin
for i := 0 to length(arr) - 1 do
SetLength(arr[i], Value);
Changed;
end;

извини, не проверял на работоспособность, но вроде все ОК.
обработаешь R/T ошибки и допишешь функциональность самостоятельно.



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

Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
14-29101
Anatoly Podgoretsky
2003-01-26 02:04
2003.02.10
Именинники 26 января


7-29105
NOE
2002-11-30 15:55
2003.02.10
Thread


3-28670
AALLEEXX
2003-01-22 15:51
2003.02.10
Картинке в сетке RXdbGrid


3-28638
GRR
2003-01-22 20:14
2003.02.10
проблемы с кирилицей при чтении через FieldByName().AsString;


1-28832
Макс1
2003-02-02 13:36
2003.02.10
showmessage





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский