Советы по Delphi

         

Производная TOutline


Я пытаюсь создать компонент, производный от TOutline и хотел бы использовать несколько иконок для изображения папок, документов и т.п. Только не знаю как.

Если установлен стиль otOwnerDraw, вы можете сами отрисовывать компонент. В этом режиме вы можете вывести какие угодно изображения. Примечание: чтобы получить OwnerDraw для работы, вы должны установить свойство Scrollbar в vsVertical.

Затем обрабатывайте событие OnDrawItem для рисования каждой строчки OutLine.

Для получения правильного индекса узла используйте GetItem(Rect.Left, Rect.Top). Индекс в drawItem неверен.

Вот пример из моего приложения. Надеюсь это вам поможет.

    procedure TfrmMain.Outline2DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var Node: TOutlineNode; NodeIdx: Integer; Offset: Integer; NowBitmap: TBitmap; NowAstValue: String;

begin NodeIdx := Outline2.GetItem(Rect.Left, Rect.Top); Node := Outline2.Items[NodeIdx]; NowAstValue := PAstRec(Outline2.Items[NodeIdx].Data)^.AstValue; with Outline2.Canvas do begin Font.Name := 'MS Sans Serif'; Font.Size := 8; Offset := MulDiv(Font.Size, 150, 100); fillRect(Rect); Rect.Left := Rect.Left + ((Node.Level - 1) * Offset + 2); if Node.HasItems then begin if Node.Expanded then NowBitmap := Outline2.PictureMinus else NowBitmap := Outline2.PicturePlus; {рисуем иконку} BrushCopy(Rect, NowBitmap, Bounds(0,0, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top), NowBitmap.TransparentColor); end; Rect.Left := Rect.Left + Offset + 2; {выводим текст} TextOut(Rect.left, Rect.Top, Node.Text); {создаем суммирующую колонку с правым выравниванием} Rect.Left := Rect.Right - TextWidth(NowAstValue)- 2; TextOut(Rect.Left, Rect.Top, NowAstValue); end;

-Craig Osterloh

А как работает функция PAstRec() и как получить указатель на данные?

Вот код:

    function TfrmMain.LoadAssetNodes(fName: String; header: String): Double; var headerIdx: Integer; NowClientID: String; TotAssetValue: Double; AstRecPtr: PAstRec; sqlText: String; HeadPtr: PAstRec; begin with qryAssets do begin NowClientID := dtbClients.Fields[0].AsString; sqlText := 'Select * from ' + fName + ' where ClientID = ' + NowClientID; SQL.Clear; SQL.Add(sqlText); Open; First; TotAssetValue := 0; new(HeadPtr); headerIdx := outAssets.AddObject(0, header, HeadPtr); while not EOF do begin new(AstRecPtr); AstRecPtr^.AstValue := format('%8.0n', [FieldByName('AssetValue').AsFloat]); TotAssetValue := TotAssetValue + FieldByName('AssetValue').AsFloat; outAssets.AddChildObject(headerIdx, FieldByName('AssetName').AsString, AstRecPtr); Next; end; HeadPtr^.AstValue := format('%8.0n',[TotAssetValue]); Result := TotAssetValue; end; end;

-Craig Osterloh [000475]



Содержание раздела