|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Нужна срочно помощь с ListView
Здравствуйте. Срочно ! надо помочь с таким вопросом:
есть компонент ListView, у него есть итемы, строки которые можно редактировать после запуска приложения. Так вот, когда я редактирую один из caption - ов одного из итемов, то после нажатия на enter мне надо изменить введенный мной текст на другой. Для этого я создаю компонент, наследованный от ListView, и в нем мне надо чего то и как то переопределить, что бы пользуясь этим компонентом у меня текст, который вводит в caption пользователь по нажатию Enter переписывался на мой, а не на то что он ввел. Вопрос в том что и как мне надо переопределить в моем компоненте? |
#2
|
||||
|
||||
Это вопрос к телепатам? Нет! Тогда покажи, что ты написал…
|
#3
|
|||
|
|||
А что показывать ?
у меня есть компонент мой, наследуется он от ListView. У меня есть тестовое приложение, которое его использует как ListView. Разница доложна быть только в том, что когда пользователь в тестовом приложении редактирует caption и вводит туда какой то текст, то по нажатию Enter его текст должен меняться на мой. То есть в моем компоненте мне надо что то переопределить, то есть сделать так что бы замена вводимого как бы бы ла по умолчанию. Вот я и не могу найти что мне надо переопределить и как. Есть мысль написать в моем компоненте конструктор в нем инхерит а потом OnEdited := moiaprocedura; что типо того . |
#4
|
||||
|
||||
В таком случае, как мне кажется, писать свой компонент не имеет смысла… В общем случае это можно сделать так
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure ListView1Click(Sender: TObject); procedure ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Cap: string; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i: integer; li: TListItem; begin for i := 1 to 9 do begin li := ListView1.Items.Add; li.Caption := IntToStr( i ); end; end; procedure TForm1.ListView1Click(Sender: TObject); begin if ListView1.SelCount > 0 then Cap := ListView1.Selected.Caption; end; procedure TForm1.ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then if ListView1.Selected.Caption <> Cap then ListView1.Selected.Caption := 'Мой текст'; end; end. Если все же нужен свой компонент, то сделай в нем все аналогично этому примеру. Последний раз редактировалось Decoding, 04.06.2007 в 00:34. |
#5
|
|||
|
|||
Большое спасибо. Нужен конечно свой компонент. Буду делать его.
|
#6
|
|||
|
|||
Делаю компонент это вот так:
unit MyListView; interface uses SysUtils, Classes, Controls, ComCtrls, Windows, Messages, Variants, Graphics, Forms, Dialogs; type MyListView = class(TListView) ListView1: MyListView; procedure ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent);override; published { Published declarations } end; procedure Register; implementation procedure MyListView.ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then ListView1.Selected.Caption := 'Ìîé òåêñò'; end; procedure Register; begin RegisterComponents('Win32', [MyListView]); end; Constructor MyListView.Create(aOwner: TComponent); begin inherited; OnKeyUp := ListView1KeyUp; end; end. Инсталлю его. Кидаю на форму в тестовом приложении. Создаю там руками пару итемов и caption к ним. Потоп запускаю и хочу редактировать. Редактируется, но когда нажимаю enter, то выскакивает Eacces Violation. Скажите пожалуйста в чем ошибка ? Поправьте пожалуйста. Последний раз редактировалось Игнат, 04.06.2007 в 04:15. |
#7
|
||||
|
||||
Непонятно, зачем ты внутри класса создаешь экземпляр этого же класса? А проблема в том, что экземпляр класс ты объявил (ListView1: MyListView), но не создал его (ListView1 := MyListView.Create). Вот и вылетает ошибка…
А вообще, я бы обошелся без этого… Вот так: Код:
unit MyListView; interface uses SysUtils, Classes, Controls, ComCtrls, Windows, Messages, Variants, Graphics, Forms, Dialogs; type TMyListView = class(TListView) procedure ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } end; procedure Register; implementation procedure TMyListView.ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; if Key = VK_RETURN then if Self.SelCount = 1 then Self.Selected.Caption := 'Мой текст'; end; procedure Register; begin RegisterComponents('Test', [TMyListView]); end; constructor TMyListView.Create(aOwner: TComponent); begin inherited; OnKeyUp := ListView1KeyUp; end; end. |
#8
|
|||
|
|||
Да, видно все-таки нельзя ничего делать поздно ночью .... Decoding спасибо ! я понял в чем ошибка.
|