![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятка с копонентом [D7]
nza © (2010-12-23 18:28:00)Пытаюсь написать компонент, Striggrid c кнопками
Кнопки это динамич. массив. (FBtns). Кнопки удаляються при нажатии на них (OnBtClick).
проблема возникает когда я пытаюсь удалить последнюю кнопку масива
Вот так удаляю:
procedure TButtonGrid.OnBtClick(Sender: TObject);
begin
if sender = TSpeedButton(sender) then BtnDelete;
end;
procedure TButtonGrid.BtnDelete;
var ln:integer;
begin
Ln:=Length(FBtns)-1 ;
FBtns[ln].Free;
SetLength(FBtns,ln);
end;
Пожалйсята помогите разобраться
nza (2010-12-23 21:10:00) [1]Сделал получилось :)
nza (2010-12-23 20:22:00) [2]Огромное спасибо буду пробовать
_Юрий (2010-12-23 20:17:00) [3]uses
Windows, Messages;
const
UM_DELETE_BTN = WM_USER + 1
type
TButtonGrid = class(...)
private
procedure DoDeleteBtn(var M: TMessage); message UM_DELETE_BTN;
procedure TButtonGrid.DoDeleteBtn(var M: TMessage);
begin
TButton(M.LParam).Free;
end;
Удаление:
var
Btn: TButton;
PostMessage(Handle, UM_DELETE_BTN, 0, LParam(Btn));
nza (2010-12-23 20:11:00) [4]
> Код надо приводить?
А какой модуль нужно подключить для postmessage?
Можете помочь с кодом?
_Юрий (2010-12-23 19:57:00) [5]В данном случае формы нет, поэтому отправлять надо на собственный Handle
_Юрий (2010-12-23 19:56:00) [6]Это неустойчивая ошибка, может возникать а может не возникать
по поводу PostMessage: отправляем кастом сообщение (например, WM_USER + 1) на хендл формы вместо того, чтобы вызывать Btn.Free.
например в LParam сообщения передаем ссылку на кнопку.
А разрушаем ее уже в обработчике сообщения.
То есть получается нечто типа отложенного разрущения - текущий обработчик завершается, окно начинает обрабатывать сообщения дальше, получает ваше, и разрушает кнопку
Код надо приводить?
ЗЫ. В данном случае проблема кстати может быть и не только в этом, больно уж кривой код
nza (2010-12-23 19:39:00) [7]
> Не надо удалять компонент из его собственного обработчика.
> Используйте механизм PostMessage
Но почему возникает ошибка только при удалении послед. кнопке?
А какие параметры следует указать для PostMessge в моем примере?
_Юрий (2010-12-23 19:32:00) [8]Не надо удалять компонент из его собственного обработчика.
Используйте механизм PostMessage
nza (2010-12-23 19:12:00) [9]
> индекс самой первой кнопки чему равен?
procedure TButtonGrid.AddButton;
var ln:integer;
begin
ln:= Length(Fbtns);
SetLength(FBtns,ln+1);
FBtns[ln]:=TSpeedbutton.Create(self);
Индекс первой кнопки = 0
> а ты этим чего сказать хотел?
procedure TButtonGrid.OnBtClick(Sender: TObject);
begin
BtnDelete;
end;
Palladin (2010-12-23 19:06:00) [10]угу
function IsValueTrue(value: Boolean): Boolean;
begin
if value = true then
result := true
else if value = false then
result := false
else
raise Exception.Create('Ошибка определения значения');
end;
KilkennyCat (2010-12-23 19:03:00) [11]
> Palladin © (23.12.10 19:02) [5]
что именно его, а не чья-то чужая кнопка :)
KilkennyCat (2010-12-23 19:02:00) [12]индекс самой первой кнопки чему равен?
Palladin (2010-12-23 19:02:00) [13]
> if sender = TSpeedButton(sender)
а ты этим чего сказать хотел?
nza (2010-12-23 18:59:00) [14]FGrid это Tstringgrid
nza (2010-12-23 18:57:00) [15]Массив кнопок
procedure TButtonGrid.AddButton;
var ln:integer;
begin
ln:= Length(Fbtns);
SetLength(FBtns,ln+1);
FBtns[ln]:=TSpeedbutton.Create(self);
FBtns[ln].Parent:=self;
FBtns[ln].Height:=FGrid.DefaultRowHeight;
FBtns[ln].Width :=50;
FBtns[ln].Flat:=true;
FBtns[ln].Caption:=inttostr(ln);
FBtns[ln].Tag:=ln;
FBtns[ln].OnClick:=OnBtClick;
ButtonPosition (ln,Fbtns[ln]);
end;
положение кнопок
procedure TButtonGrid.ButtonPosition(index:integer; button:TSpeedButton);
var h:integer;
begin
h:=FGrid.GridLineWidth+FGrid.DefaultRowHeight;
button.Top:=h*index+FGrid.Top+1 ;
button.Left:=Fgrid.Width+5;
end;
KilkennyCat (2010-12-23 18:46:00) [16]код создания массива кнопок?
nza (2010-12-23 18:29:00) [17]При попытке удалить послед кнопку возникает ошибка памяти