Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];
ВнизНепонятка с копонентом Найти похожие ветки
← →
nza (2010-12-23 18:28) [0]Пытаюсь написать компонент, 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 18:29) [1]При попытке удалить послед кнопку возникает ошибка памяти
← →
KilkennyCat © (2010-12-23 18:46) [2]код создания массива кнопок?
← →
nza (2010-12-23 18:57) [3]Массив кнопок
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;
← →
nza (2010-12-23 18:59) [4]FGrid это Tstringgrid
← →
Palladin © (2010-12-23 19:02) [5]
> if sender = TSpeedButton(sender)
а ты этим чего сказать хотел?
← →
KilkennyCat © (2010-12-23 19:02) [6]индекс самой первой кнопки чему равен?
← →
KilkennyCat © (2010-12-23 19:03) [7]
> Palladin © (23.12.10 19:02) [5]
что именно его, а не чья-то чужая кнопка :)
← →
Palladin © (2010-12-23 19:06) [8]угу
function IsValueTrue(value: Boolean): Boolean;
begin
if value = true then
result := true
else if value = false then
result := false
else
raise Exception.Create("Ошибка определения значения");
end;
← →
nza (2010-12-23 19:12) [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;
← →
_Юрий (2010-12-23 19:32) [10]Не надо удалять компонент из его собственного обработчика.
Используйте механизм PostMessage
← →
nza (2010-12-23 19:39) [11]
> Не надо удалять компонент из его собственного обработчика.
> Используйте механизм PostMessage
Но почему возникает ошибка только при удалении послед. кнопке?
А какие параметры следует указать для PostMessge в моем примере?
← →
_Юрий (2010-12-23 19:56) [12]Это неустойчивая ошибка, может возникать а может не возникать
по поводу PostMessage: отправляем кастом сообщение (например, WM_USER + 1) на хендл формы вместо того, чтобы вызывать Btn.Free.
например в LParam сообщения передаем ссылку на кнопку.
А разрушаем ее уже в обработчике сообщения.
То есть получается нечто типа отложенного разрущения - текущий обработчик завершается, окно начинает обрабатывать сообщения дальше, получает ваше, и разрушает кнопку
Код надо приводить?
ЗЫ. В данном случае проблема кстати может быть и не только в этом, больно уж кривой код
← →
_Юрий (2010-12-23 19:57) [13]В данном случае формы нет, поэтому отправлять надо на собственный Handle
← →
nza (2010-12-23 20:11) [14]
> Код надо приводить?
А какой модуль нужно подключить для postmessage?
Можете помочь с кодом?
← →
_Юрий (2010-12-23 20:17) [15]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:22) [16]Огромное спасибо буду пробовать
← →
nza (2010-12-23 21:10) [17]Сделал получилось :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c