Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 175

/ вопрос открыт /

Уважаемые эксперты!

У меня возникло 2 вопроса по интерфейсу моей проги:
1. Как сделать так чтобы в TLIstview можно было таскать Items?
2. Как поместить одно изображение (ну скажем 48 на 48 px) в TImageList так чтобы оно не разбивалось там на части и т.п.?

Александр-446 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр-446 (статус: Посетитель)
Вопрос отправлен: 25 ноября 2006, 10:31
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Denisss

Здравствуйте, Александр!

1. См. пример в приложении
2. Установите свойства Height и Width = 48 (т.е. установите высоту и ширину Вашего изображения, тогда оно нарезаться не будет)

Удачи!

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. ListBox1: TListBox;
  12. procedure FormCreate(Sender: TObject);
  13. procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  14. Shift: TShiftState; X, Y: Integer);
  15. procedure ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  16. Y: Integer);
  17. procedure ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  18. Shift: TShiftState; X, Y: Integer);
  19. private
  20. { Private declarations }
  21. fTemp: Integer;
  22. public
  23. { Public declarations }
  24. end;
  25.  
  26. var
  27. Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32.  
  33. // From1.OnCreate
  34. procedure TForm1.FormCreate(Sender: TObject);
  35. begin
  36.  
  37. fTemp:= -1;
  38. end;
  39.  
  40. // ListBox1.OnMouseDown
  41. procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  42. Shift: TShiftState; X, Y: Integer);
  43.  
  44. begin
  45.  
  46. fTemp:= ListBox1.ItemAtPos(Point(X, Y), True);
  47. end;
  48.  
  49. // ListBox1.OnMouseMove
  50. procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  51. Y: Integer);
  52.  
  53. var
  54. fNewTemp: Integer;
  55. begin
  56.  
  57. if (fTemp = -1) then
  58. Exit;
  59.  
  60. fNewTemp:= ListBox1.ItemAtPos(Point(X, Y), True);
  61.  
  62.  
  63. if (fNewTemp = fTemp) then
  64. Exit;
  65. with ListBox1.Items do
  66.  
  67. Move(fTemp, fNewTemp);
  68.  
  69. fTemp:= fNewTemp;
  70. end;
  71.  
  72. // ListBox1.OnMouseUp
  73. procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  74. Shift: TShiftState; X, Y: Integer);
  75.  
  76. begin
  77. fTemp:= -1;
  78. end;
  79.  
  80. end.


Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 25 ноября 2006, 21:00
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Александр!
Добавлю только, что TImageList не предназначен для хранения изображений разного размера. Если у заполненного ImageList'а поменять свойства Height/Width, все ранее добавленные изображения потеряются.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 26 ноября 2006, 09:45
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 29 ноября 2006, 16:49; участников в обсуждении: 4.
Евгений Козаченко

Евгений Козаченко (статус: 2-ой класс), 25 ноября 2006, 11:05 [#1]:

Здравствуйте, Александр!
Для того, чтобы можно было добавлять картинки с бОльшим разрешением, чем по умолчанию, надо в свойствах компонента TImageList выставить свои значения Height и Width, соответствующие размерам картинки.
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 25 ноября 2006, 23:47 [#2]:

To Deniss: А не проще ли использовать события OnDragDrop и OnDragOver вместо ловли кликов по крысе
Denisss

Denisss (статус: 2-ой класс), 26 ноября 2006, 21:52 [#3]:

to Alex Van Glukhman:
Не проще, а немного сложнее, т.к. там также появляются дополнительные переменные (типа Accept в OnDragOver).
Кроме того, в вопросе присутствует вопрос о том, как можно таскать элементы. При использовании Drag'a изменяется вид курсора (этого в вопросе нет). Возможно, что кому-то это не понравится.

Вопрос: Вам не все ли равно проще или нет? Если считаете, что проще, то приводите свой пример.
Александр-446

Александр-446 (статус: Посетитель), 27 ноября 2006, 12:19 [#4]:

Спасибо за ответы!

Но проблема в следующем:
Мне нужно сделать что типа рабочего стола. Чтобы Item'ы в ListView (не ListBox) можно было таскать с одним лишь ограничением: нельзя накладывать их друг на друга. Не имеет значение какой при этом будет курсор. Вообще можно ли такое сделать на Delphi?

А вот скриншот того что на данный момент у меня сейчас:
http://savepic.ru/54669.jpg
Denisss

Denisss (статус: 2-ой класс), 28 ноября 2006, 00:49 [#5]:

Не смог дать ответ в форуме, потому выложил его тут:
http://ifolder.ru/517980
Александр-446

Александр-446 (статус: Посетитель), 29 ноября 2006, 16:49 [#6]:

Большое спасибо!
Уже что-то близкое к тому че я хотел. Правда мне не нужно какое-либо перемещение последующих Итемов. Нужно лишь сделать так чтобы когда пользователь хватал какой нибудь Итем мышей он мог переместить его куда-угодно. Только с условием того что он не будет его перемещать (не знаю как это лучще сказать) на другие Итемы и курсор менялся при этом на зачеркнутый круг (crNo). Если же он это сделал то никакого действия не должжно происходить.
А вообще это должно быть что-то типа Рабочего стола без "автоматического выравнивания значков".

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.02 сек.