Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

if WordWrap then F := F or DT_WORDBREAK;

DrawText(Handle, P, –1, Rect, F);

 end;

end;

– Rick Roger

StringGrid без выделенной ячейки

Я пытаюсь показать StringGrid без выделенной ячейки. Первая нефиксированная ячейка всегда имеет состояние "инвертированного" цвета. Я не хочу позволить пользователю редактировать сетку, но эта выделенная

ячейка производит впечатление того, что сетка имеет возможность редактирования…

Вам необходимо создать обработчик события OnDrawCell. Это легче чем вы думаете. Вот образец кода, который сделает вас счастливым:

procedure TForm.sgrDrawCells(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var

 ACol: longint absolute Col;

 ARow: longint absolute Row;

 Buf: array[byte] of char;

begin

 if State = gdFixed then Exit;

 with sgrGrid do begin

Canvas.Font := Font;

Canvas.Font.Color := clWindowText;

Canvas.Brush.Color := clWindow;

Canvas.FillRect(Rect);

StrPCopy(Buf, Cells[ACol,ARow]);

DrawText(Canvas.Handle, Buf, -1, Rect, DT_SINGLELINE or DT_VCENTER or DT_NOCLIP or DT_LEFT);

 end;

end;

– Jeff Fisher 

Один щелчок на StringGrid вместо трех

Как сделать так, чтобы после ПЕРВОГО щелчка на ячейке возможно было бы начать редактировать ее содержимое?

Включите goAlwaysShowEditor в свойство TStringGrid Options.

– Rick Rogers

StringGrid как DBGrid

Delphi 1

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

table.first;

row := 0;

grid.rowcount := table.recordCount;

while not table.eof do begin

 for i := 0 to table.fieldCount-1 do

grid.cells[i,row] := table.fields[i].asString;

 inc(row);

 table.next;

end;

У меня тоже имееются свои причины использования TStringGrid. Вот мой код, который загружает данные из отфильтрованной таблицы. Он не очень изящен, т.к. реально является лишь черновиком. У меня это работает, а большего мне и не нужно. Работает очень быстро, даже в случае сотни загруженных колонок. Есть много ссылок на внешние переменные. Надеюсь что они не слишком заумные.

PROCEDURE TformLookupDB.FillCells;

VAR

 Row, i :INTEGER

 w :INTEGER

 grid :TStringGrid

BEGIN

 doGrid.RowCount := 0;

 IF NOT ASSIGNED(fDB) THEN EXIT;

 Row := 0;

 FOR i := LOW(fColWidths) TO HIGH(fColWidths) DO fColWidths[i] := 100

 //
Данный временный объект-сетка используется для предохранения от огромного

 // количества подразумеваемых событий Application.ProcessMessages,

 // инициируемых базой данных, и вызывающих противное моргание объекта

 // doGrid. Итак, мы загружаем данные в объект-сетку

 // и затем копируем их в стобцы, начиная с верхней части.

 grid := TStringGrid.Create(Self);

 grid.Visible := FALSE;

 WITH fDB DO TRY

grid.ColCount := fFields.Count;

DisableControls;

// Фильтр был установлен с помощью свойства Self.Filter

First;

WHILE NOT EOF DO TRY

grid.RowCount := Row+1;

FOR i := 0 TO grid.ColCount-1 DO BEGIN

grid.Cells[i,Row] :=FieldByName(fFields.Strings[i]).AsString

w := doGrid.Canvas.TEXTWIDTH(grid.Cells[i,Row]);

IF fColWidths[i]<w THEN fColWidths[i] := w;

END

INC(Row);

FINALLY

Next;

END

 FINALLY

doGrid.RowCount := grid.RowCount;

doGrid.ColCount := grid.ColCount;

FOR i := 0 TO grid.ColCount-1 DO BEGIN

doGrid.Cols[i] := grid.Cols[i];

doGrid.ColWidths[i] := fColWidths[i] + 4

END

grid.Free;

EnableControls

 END

END;
 

`Авторазмер` для StringGrid

…да, реально это утомляет, но эту проблему можно решить программным путем (это нужно делать после того, как вы загрузите данные, или же, если вы загружаете данные по столбцам, их загружать в самом цикле, приведенном ниже):

Поделиться с друзьями: