Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 532

/ вопрос открыт /

Всех приветствую.
Вопрос возможно нубовский, но тем не менее
проблема состоит в том что я програмно создаю много кнопок на форме, попутно занося указатели на них в связный список. После этого я пытаюсь удалить первую созданную кнопку, в результате получаю ошибку обращения к памяти, почему не понимаю.
Если ктото знает как решить проблему отпишите пожалуста.

P.S. про dispose знаю, но это не помогает в моей проблеме, и потом еще думаю что если не уничтожить панель, то возможны утечки памяти.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. procedure FormClick(Sender: TObject);
  13. procedure Button1Click(Sender: TObject);
  14. procedure FormCreate(Sender: TObject);
  15.  
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21.  
  22. type MyFerst = record
  23. num: integer;
  24. next: Pointer;
  25. End;
  26.  
  27. type TMyElement = record
  28. prev: Pointer;
  29. button: TButton;
  30. next: Pointer;
  31. End;
  32.  
  33. type MyElementP = ^TMyElement;
  34.  
  35. var
  36. Form1: TForm1;
  37. MyButton: TButton;
  38. i:integer;
  39.  
  40.  
  41.  
  42.  
  43.  
  44. implementation
  45.  
  46. {$R *.dfm}
  47.  
  48.  
  49. procedure TForm1.FormClick(Sender: TObject);
  50. var
  51. ALeft, ATop, AWidth, AHeight: Integer;
  52. MyPoint: TPoint;
  53. p:pointer;
  54. Begin
  55. Windows.GetCursorPos(MyPoint);
  56. AWidth := 75;
  57. AHeight := 25;
  58. ALeft := MyPoint.X-Form1.Left-5;
  59. ATop := MyPoint.Y-Form1.Top-35;
  60.  
  61. i:=i+1;
  62.  
  63.  
  64. Ferst.num:=i;
  65.  
  66.  
  67. Begin
  68. Ferst.next:=Pointer(ElementP);
  69. Element:=ElementP^;
  70. Element.prev:=@Ferst;
  71. End
  72.  
  73. Begin
  74. Element.next:=Pointer(ElementP);
  75. p:=@Element;
  76. Element:=ElementP^;
  77. Element.prev:=p;
  78. End;
  79.  
  80.  
  81. Element.next:=nil;
  82.  
  83. MyButton:=Element.button;
  84. MyButton.Parent:=Form1;
  85. MyButton.Name:='ButtonN'+IntToStr(i);
  86.  
  87.  
  88. end;
  89.  
  90. procedure TForm1.Button1Click(Sender: TObject);
  91. begin
  92. ElementP:=MyElementP(Ferst.next);
  93. Element:=ElementP^;
  94. MyButton:=Element.button;
  95.  
  96. end;
  97.  
  98. procedure TForm1.FormCreate(Sender: TObject);
  99. begin
  100.  
  101. Ferst.next:=nil;
  102. end;
  103.  
  104. end.


SOA Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 24 августа 2010, 18:14
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, SOA!
Вообще то я рекомендовал бы взять TList и не заниматься изобретением велосипедов. Там просто.
вначале создам
list := TList.create;

добавляем
list.add(button);

удаляем по индексу
but := TButton(list[i]);
but.free;
list.delete(i);

удалим list в конце работы
list.free;
правда перед этим не забываем почистить оставшиеся элементы.


Если по коду, то тут есть базовое недопонимание. Оно в строках
Element:=ElementP^;
Element.prev:=@Ferst;

В первой строке объект копируется, это же запись.
и когда в следующей строке делается присваивание, то исходный объект, куда указывает ElementP^ не изменяется! И так как указатель указывает неведомо куда, получаем в лоб.
нужно первую строку выкинуть, а в второй писать так
ElementP^.prev:=@Ferst;

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 августа 2010, 18:39
Оценка за ответ: 5

Комментарий к оценке: Спасибо за разъяснения, если сделать так как вы написали, то все работает.

Мини-форум вопроса

Всего сообщений: 25; последнее сообщение — 13 октября 2014, 23:07; участников в обсуждении: 5.

Страницы: [« Предыдущая] [1] [2]

SOA

SOA (статус: Посетитель), 26 августа 2010, 17:45 [#21]:

Может быть, я глубоко C++ не изучал.
min@y™

min@y™ (статус: Доктор наук), 26 августа 2010, 21:34 [#22]:

Цитата (SOA):

Может быть, я глубоко C++ не изучал.

Указатели одинаково просты и сложны в любых языках программирования. Просто вся эта байда пишется по-разному, типа Pointer и void*, ^Integer и int*, а смысл один и тот же. Городить указатели, которые указывают на указатели (type buttonP = ^TButton;) - это мозговой моносексуализм.
Давай я тебе напишу TButtonList и будет тебе простое человеческое счастье. Я в отпуске, заняться нечем... И тебе помогу, и сам развлекусь.

2 Вадим К: еду к тебе на/в Украину 3-го числа. Давно на море не был.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 27 августа 2010, 20:56 [#23]:

min@y™
>Давай я тебе напишу TButtonList и будет тебе простое человеческое счастье. Я в отпуске, заняться нечем... И тебе >помогу, и сам развлекусь.

За предложение спасибо, но не нужно, мне вполне подходит мой вариант.
min@y™

min@y™ (статус: Доктор наук), 27 августа 2010, 21:21 [#24]:

Цитата (SOA):

За предложение спасибо, но не нужно, мне вполне подходит мой вариант.

Некто Ульянов (Ленин) тоже говорил: "Мы пойдём другим путём". Весь Мир знает, что из этого получилось...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
zvygin1964

zvygin1964 (статус: Посетитель), 13 октября 2014, 23:07 [#25]:

TButtonList и будет МНЕ простое человеческое счастье

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 21:07
Выполнено за 0.04 сек.