Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1293354617
radiokarazinec
2010-12-26 12:10
2011.03.20
поиск максимальных элементов в массиве


8-1208898067
Музыкант
2008-04-23 01:01
2011.03.20
Циклическое проигрывание midi-файла без разрывов в звучании


2-1293098804
RUu
2010-12-23 13:06
2011.03.20
объединение наборов данных


1-1249200301
Ruzzz
2009-08-02 12:05
2011.03.20
Создание полупрозрачного компонента


15-1291757399
Юрий
2010-12-08 00:29
2011.03.20
С днем рождения ! 8 декабря 2010 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский