DrawText(Canvas.Handle, Buf, -1, Rect, DT_SINGLELINE or
end
end
– Jeff Fisher
Один щелчок на StringGrid вместо трех
Как сделать так, чтобы после ПЕРВОГО щелчка на ячейке возможно было бы начать редактировать ее содержимое?
Включите goAlwaysShowEditor в свойство TStringGrid Options.
– Rick Rogers
StringGrid как DBGrid
Delphi 1
Ну это может выглядеть приблизительно так (возможно нужна некоторая доработка, написал от руки, не проверяя):
table.first;
row := 0;
grid.rowcount := table.recordCount;
while not
for i := 0 to
grid.cells[i,row] := table.fields[i].asString;
inc(row);
table.next;
end
У меня тоже имееются свои причины использования TStringGrid. Вот мой код, который загружает данные из отфильтрованной таблицы. Он не очень изящен, т.к. реально является лишь черновиком. У меня это работает, а большего мне и не нужно. Работает очень быстро, даже в случае сотни загруженных колонок. Есть много ссылок на внешние переменные. Надеюсь что они не слишком заумные.
PROCEDURE
VAR
Row, i :INTEGER
w :INTEGER
grid :TStringGrid
BEGIN
doGrid.RowCount := 0;
IF NOT
Row := 0;
FOR
// Данный временный объект-сетка используется для предохранения от огромного
// количества подразумеваемых событий Application.ProcessMessages,
// инициируемых базой данных, и вызывающих противное моргание объекта
// doGrid. Итак, мы загружаем данные в объект-сетку
// и затем копируем их в стобцы, начиная с верхней части.
grid := TStringGrid.Create(Self);
grid.Visible := FALSE;
WITH
grid.ColCount := fFields.Count;
DisableControls;
// Фильтр был установлен с помощью свойства Self.Filter
First;
WHILE NOT
grid.RowCount := Row+1;
FOR
grid.Cells[i,Row] :=FieldByName(fFields.Strings[i]).AsString
w := doGrid.Canvas.TEXTWIDTH(grid.Cells[i,Row]);
IF
END
INC(Row);
FINALLY
Next;
END
FINALLY
doGrid.RowCount := grid.RowCount;
doGrid.ColCount := grid.ColCount;
FOR
doGrid.Cols[i] := grid.Cols[i];
doGrid.ColWidths[i] := fColWidths[i] + 4
END
grid.Free;
EnableControls
END
END;
`Авторазмер` для StringGrid
…да, реально это утомляет, но эту проблему можно решить программным путем (это нужно делать после того, как вы загрузите данные, или же, если вы загружаете данные по столбцам, их загружать в самом цикле, приведенном ниже):
i, j, temp, max: integer;
for
max := 0;
for
temp := grid.canvas.textWidth(grid.cells[i,j]);
if
end
grid.colWidths[i] := max + grid.gridLineWidth +1;
end
Вероятно, вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек.
Выравнивание колонок StringGrid III
Вот некоторый код, который делает то, что вы хотите:
procedure
var
S: array
B, R: TRect;
begin
with
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT