![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте. Срочно ! надо помочь с таким вопросом:
есть компонент 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 спасибо ! я понял в чем ошибка.
|