Форум: "Основная";
Текущий архив: 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.012 c