Delphi World - Производная TOutline
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Производная TOutline

Автор: Craig Osterloh

Я пытаюсь создать компонент, производный от 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;
end;

А как работает функция 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;

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования