Главная страница
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.49 MB
Время: 0.013 c
4-29153
bobo
2002-12-23 13:58
2003.02.10
Размещение окон двух копий приложения сверху вниз и т.д


14-29019
lamokop
2003-01-23 22:01
2003.02.10
Delphi Translit :))


1-28806
OxOTHuK
2003-02-02 11:00
2003.02.10
Загрузка


1-28858
Fishka
2003-01-29 16:05
2003.02.10
PageControl и Image


1-28814
nikkie
2003-01-31 16:13
2003.02.10
Русские акселераторы