Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: август 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Производная 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;
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS