Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2017, 00:35   #1
Gambetto
 
Регистрация: 05.10.2017
Сообщений: 6
Вопрос OnPaint в ShellListView (Delphi)

Всем привет!
Делаю файловый менеджер с помощью ShellListView и столкнулся с отсутствием у этого компонента события OnPaint, когда понадобилось поставить на фон картинку.
Рисование на Canvas картинку ставит, но после Access Violation. Стоит изменить размер окна или развернуть - еще трое Access Violation и программа вешается. Да и фон надписей к иконкам остается белым, стоит провести над ними мышкой - остается белая полоса, картинка обратно не возвращается
Видел, вроде такое решают, создавая свой компонент, но я для этого слишком нуб.
Как сделать правильно? Прошу не отсылать к FileListView.
Gambetto вне форума Ответить с цитированием
Старый 08.10.2017, 14:20   #2
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Странно это. Код в студию.
dummy_user вне форума Ответить с цитированием
Старый 08.10.2017, 17:09   #3
Gambetto
 
Регистрация: 05.10.2017
Сообщений: 6
По умолчанию

Код:
type
  Tfrm_Main = class(TForm)
    Panel1: TPanel;
    TestButton: TButton;
    OpPicDlg: TOpenPictureDialog;
    Image: TImage;
    ShellListView: TShellListView;
    procedure SetPicture;
    procedure TestButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frm_Main: Tfrm_Main;
  BitPicture:TBitmap;

implementation

{$R *.dfm}

procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  BitPicture := TBitMap.Create;
end;

procedure Tfrm_Main.SetPicture;
var
  p:TGraphic;
  i:integer;
begin
  if OpPicDlg.Execute
  then
    begin
      Image.Picture.LoadFromFile(OpPicDlg.FileName);

      BitPicture := Image.Picture.Bitmap;
      ShellListView.Canvas.Draw(0, 0, BitPicture);
      BitPicture.Free;

      for i:=0 to ShellListView.Items.Count-1
      do ShellListView.Items[i].Selected:=true;
    end;

end;

procedure Tfrm_Main.TestButtonClick(Sender: TObject);
begin
  SetPicture;
end;
Gambetto вне форума Ответить с цитированием
Старый 09.10.2017, 16:30   #4
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Оборачивайте создание и уничтожение объектов в блок try/finally.

А не проще ли сразу выводить на канвас ShellListView битмап из Image.Picture.Bitmap?

Последний раз редактировалось Alex11223; 09.10.2017 в 16:33.
dummy_user вне форума Ответить с цитированием
Старый 09.10.2017, 23:05   #5
Gambetto
 
Регистрация: 05.10.2017
Сообщений: 6
По умолчанию

Насчет сразу на канвас - спасибо, так действительно должно быть проще, но я пробовал вешать перерисовку на OnPaint формы и панели - надеялся, что поможет. Вот для этих экспериментов BitPicture и сделана глобальной переменной. Увы, факир был пьян и фокус закончился новыми, свежими Access Violation...
Насчет try/finally - можно поподробнее для тех, кто нуб?

Последний раз редактировалось Gambetto; 09.10.2017 в 23:10.
Gambetto вне форума Ответить с цитированием
Старый 11.10.2017, 11:57   #6
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Использовать и удалять объекты желательно так в Delphi:

Код:
Object:= TObject.Create();
try
   // Что-то делаем с Object.
finally  
   Object.Free();
end;

Блин, где здесь кнопка "Тэг-код"?

Для чего переменная p: TGraphic?

______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 11.10.2017 в 12:02.
dummy_user вне форума Ответить с цитированием
Старый 11.10.2017, 12:07   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от dummy_user Посмотреть сообщение
Блин, где здесь кнопка "Тэг-код"?
читать FAQ

Последний раз редактировалось Alex11223; 11.10.2017 в 12:10.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли аналог события формы OnPaint для TImage ? Vova777 Общие вопросы Delphi 2 21.05.2012 20:09
Рисование в OnPaint fredwriter Помощь студентам 4 05.12.2011 23:39
OnPaint Juffin Общие вопросы Delphi 1 12.05.2009 15:44
добавление обработчика OnPaint в TPanel Mixasik Общие вопросы Delphi 2 23.07.2008 17:36
ShellListView sezam Компоненты Delphi 0 27.06.2008 06:58