Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
fori := 0 togrid.colcount-1 do begin
max := 0;
forj := 0 togrid.rowcount-1 do begin
temp := grid.canvas.textWidth(grid.cells[i,j]);
iftemp > max thenmax := temp;
end;
grid.colWidths[i] := max + grid.gridLineWidth +1;
end;
Вероятно, вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек.
Выравнивание колонок StringGrid III
Вот некоторый код, который делает то, что вы хотите:
procedureWriteText(ACanvas: TCanvas; constARect: TRect; DX, DY: Integer; constText: string; Format: Word);
var
S: array[0..255] ofChar;
B, R: TRect;
begin
withACanvas, ARect do begin
caseFormat of
DT_LEFT:
ExtTextOut(Handle, Left + DX, Top + DY, ETO_OPAQUE orETO_CLIPPED,@ARect, StrPCopy(S, Text), Length(Text), nil);
DT_RIGHT:
ExtTextOut(Handle, Right - TextWidth(Text) - 3, Top + DY,ETO_OPAQUE orETO_CLIPPED, @ARect, StrPCopy(S, Text),Length(Text), nil);
DT_CENTER:
ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div2, Top + DY, ETO_OPAQUE orETO_CLIPPED, @ARect,StrPCopy(S, Text), Length(Text), nil);
end;
end;
end;
procedureTBEFStringGrid.DrawCell(Col, Row: Longint; Rect: TRect; State: TGridDrawState);
var
procedureDisplay( constS: string; Alignment: TAlignment);
constFormats: array[TAlignment] ofWord = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
WriteText(Canvas, Rect, 2, 2, S, Formats[Alignment]);
end;
begin
{ здесь задаем аргументы Col и Row, и форматируем как угодно ячейки }
caseRow of
0: { Центрирование заголовков колонок }
if(Col < ColCount) thenDisplay(Cells[Col,Row], taCenter)
else
{ Все другие данные имеют правое центрирование }
Display(Cells[Col,Row], taRight);
end;
end;
Выравнивание колонок StringGrid IV
Delphi 1
Создайте ваш собственный метод drawcell на примере того, что приведен ниже:
procedureTsearchfrm.Grid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
varl_oldalign : word;
begin
if (row=0) or(col<2) thengrid1.canvas.font.style:= grid1.canvas.font.style+[fsbold]; {устанавливаем заголовок в жирном начертании}
ifcol<>1 then begin
l_oldalign:=settextalign(grid1.canvas.handle, ta_right);
{NB использует для рисования правую сторону квадрата}
grid1.canvas.textrect(rect,rect.right-2, Rect.top+2,grid1.cells[col,row]);
settextalign(grid1.canvas.handle,l_oldalign);
end else begin
grid1.canvas.textrect(rect, rect.left+2, rect.top+2, grid1.cells[col,row]);
end;
grid1.canvas.font.style:= grid1.canvas.font.style-[fsbold];
end;
Покрашенный StringGrid I
Delphi 1
…вы можете попробовать использовать StringGrid. У него имеется свойство Objects, через которое вы можете назначать объекты. Создайте объект, содержащий переменную типа TColor, и назначьте это Objects[col,row], что позволит иметь к нему доступ в любое время. Назначьте событие OnDrawCell StringGrid, позволяющее рисовать текст ячейки правильного цвета. Чтобы убедиться, что ячейка выбрана, воспользуйтесь свойством Selection, содержащим то, что выбрал пользователь. Все это должно выглядеть приблизительно так:
typeTStrColor = class(TObject)
public
Color : TColor; {вы могли бы также определить частные и публичные методы доступа}
end;
…
procedureTForm1.FormCreate(Sender:TObject)
vari,j : Integer;
begin
WithStringList1 do
fori := 0 toColCount-1
forj := 0 toRowCount-1 Objects[i,j] := TStrColor.Create;
end;
…
procedureTForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
varOldColor : TColor;
begin
withStringGrid1.Canvas do begin
OldColor := Font.Color;
Font.Color := (StringGrid1.Objects[col,row] asTStrColor).Color;
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[Col,Row]);
Font.Color := OldColor;
end;
end;
…
procedureTForm1.ProcessSelection(Sender: TObject);
vari, j : Integer;
begin
WithStringGrid1.Selection do
For i := left toright do
for j := top tobottom do
MessageDlg(IntToStr(i) + ',' + IntToStr(j) + '-' + IntToStr((StringGrid1.Objects[i,j] aststrcolor).color), mtInformation, [mbOk], 0);
end;
Этот компонент не позволяет делать многочисленный выбор….
Покрашенный StringGrid II
Delphi 1
В данном модуле демонстрируется техника изменения цвета у выводимого в StringGrid текста.
unitStrgr;
interface
usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, DB;
typeTForm1 = class(TForm)
StringGrid1: TStringGrid;
procedureStringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
procedureTForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
constCharOffset = 3;
begin
withStringGrid1.canvas do begin
font.color := clMaroon;
textout(rect.left + CharOffset, rect.top + CharOffset, 'L');
font.color := clNavy;
textout(rect.left + CharOffset + TextWidth('L'), rect.top + CharOffset, 'loyd');
end;
end;
end.
Редактирование в StringGrid
Delphi 1
…правда, я этого не пробовал, но в голову пришли две идеи:
1. Нажмите на втором поле редактировании, переведите фокус на другое поле (например, x.focus, где x не сетка), сбросьте goEditing и selectRow и затем верните фокус назад сетке. (Эта техника работала у меня в нескольких местах, например, в градах и мемах.)
2. Нажмите на втором поле редактирования, и после сброса goEditing и selectRow, попробуйте создать tGridRect, подсвечивающий нужную вам строку, после чего делайте grid.Selection := gridRect;
Tabbednotebook
Tabbednotebook и куча ресурсов
Тема: Как избежать использования кучи ресурсов (Resource Heap) при работе с TabbedNotebook
Данный документ расскажет о том, как с помощью Object Pascal можно управлять числом активных handlesWindows (оконных дескрипторов), в особенности кучей ресурсов пользователя (User Resource heap), а также следить за этими показателями. О чем этот документ? Попробую коротко и доходчиво: Windows следит за каждым элементом, имеющим фокус, через его дескриптор (Handle). Исходя из этого, Windows не может одновременно поддерживать несколько оконных дескрипторов (4-байтных указателей), и в этом совете мы приведем простой пример кода, позволяющего «легко» загружать ресурсы и обходить эти ограничения, встающие перед разработчиками Delphi.
Читать дальшеИнтервал:
Закладка: