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]
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
…да, реально это утомляет, но эту проблему можно решить программным путем (это нужно делать после того, как вы загрузите данные, или же, если вы загружаете данные по столбцам, их загружать в самом цикле, приведенном ниже):
i, j, temp, max: integer;
for i := 0 to grid.colcount-1 do begin
max := 0;
for j := 0 to grid.rowcount-1 do begin
temp := grid.canvas.textWidth(grid.cells[i,j]);
if temp > max then max := temp;
end;
grid.colWidths[i] := max + grid.gridLineWidth +1;
end;
Вероятно, вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек.
Выравнивание колонок StringGrid III
Вот некоторый код, который делает то, что вы хотите:
procedure WriteText(ACanvas: TCanvas; const ARect: TRect; DX, DY: Integer; const Text: string; Format: Word);
var
S: array[0..255] of Char;
B, R: TRect;
begin
with ACanvas, ARect do begin