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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
14-29003
Феликс
2003-01-27 00:20
2003.02.10
Бывают ли тайные общества?


7-29139
Чегермек
2002-11-30 20:55
2003.02.10
Время (высокоточное)


14-29052
sosv
2003-01-23 18:32
2003.02.10
Кто-нибудь знает для чего на клавиатуре клавиша


3-28688
Ihor Osov'yak
2003-01-24 03:03
2003.02.10
Сервис + созданный в рантайме TADOConnection -> проблема с


1-28841
UDS
2003-02-02 21:53
2003.02.10
Срочно!