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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 6 052

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

Здравствуйте, эксперты! Проблема в следующем. Я динамически создаю объекты и записываю их в массив. При этом адрес создаваемых объектов передаю в дерево. При попытке их удалить вылазиет ошибка доступа к памяти. Если удаляю последний записанный элемент в дерево то всё норм. С остальными так не прокатывает. При поптыке отследить пошагово обнаруживаю что адрес пустой. Кто подскажет в чм проблема или может быть как лучше организовать удаление объектов.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, Menus, jpeg, ExtDlgs, Drawobjects1,Drawobjects2;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Panel1: TPanel;
  12. Label1: TLabel;
  13. TreeView1: TTreeView;
  14. MainMenu1: TMainMenu;
  15. N1: TMenuItem;
  16. N2: TMenuItem;
  17. N3: TMenuItem;
  18. N4: TMenuItem;
  19. N5: TMenuItem;
  20. N6: TMenuItem;
  21. N7: TMenuItem;
  22. N8: TMenuItem;
  23. N10: TMenuItem;
  24. Panel2: TPanel;
  25. SpeedButton1: TSpeedButton;
  26. SpeedButton2: TSpeedButton;
  27. PopupMenu1: TPopupMenu;
  28. PopupMenu2: TPopupMenu;
  29. N11: TMenuItem;
  30. N12: TMenuItem;
  31. N13: TMenuItem;
  32. N14: TMenuItem;
  33. TrackBar1: TTrackBar;
  34. Label2: TLabel;
  35. OpenPictureDialog1: TOpenPictureDialog;
  36. BitBtn1: TBitBtn;
  37. ScrollBox1: TScrollBox;
  38. Image1: TImage;
  39. Button1: TButton;
  40. procedure TrackBar1Change(Sender: TObject);
  41. procedure N10Click(Sender: TObject);
  42. procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
  43. procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer;
  44. State: TDragState; var Accept: Boolean);
  45. procedure newobject(Sender, Source: TObject; X, Y: Integer);
  46. procedure Button1Click(Sender: TObject);
  47. private
  48. { Private declarations }
  49. public
  50. { Public declarations }
  51. end;
  52.  
  53. var
  54. Form1: TForm1;
  55. widthimage,heightimage:integer;
  56. objecti:array of TDrawobject;
  57. implementation
  58.  
  59. {$R *.dfm}
  60. procedure Tform1.newobject(Sender, Source: TObject; X, Y: Integer);
  61. var
  62. b:integer;
  63. begin
  64. setlength(objecti,length(objecti)+1);
  65. objecti[length(objecti)-1]:=tpic.Create(Image1);
  66. (objecti[length(objecti)-1] as tpic).Parent:=Scrollbox1;
  67. (objecti[length(objecti)-1] as tpic).LoadPicFromFile('f:\1.bmp');
  68. (objecti[length(objecti)-1] as tpic).Width:=40;
  69. (objecti[length(objecti)-1] as tpic).Height:=40;
  70. (objecti[length(objecti)-1] as tpic).Stretch:=true;
  71. b:=scrollbox1.HorzScrollBar.ScrollPos;
  72. scrollbox1.HorzScrollBar.Position:=0;
  73. (objecti[length(objecti)-1] as tpic).Left:=x;
  74. scrollbox1.HorzScrollBar.Position:=b;
  75. b:=scrollbox1.vertScrollBar.scrollPos;
  76. scrollbox1.vertScrollBar.Position:=0;
  77. (objecti[length(objecti)-1] as tpic).Top:=y;
  78. scrollbox1.vertScrollBar.Position:=b;
  79. treeview1.Items.AddChild(treeview1.Items.Item[0],'phly1');
  80. end;
  81.  
  82. procedure TForm1.TrackBar1Change(Sender: TObject);
  83. begin
  84. Image1.autosize:=false;
  85. image1.Stretch:=true;
  86. image1.Width:=round(widthimage*trackbar1.position/100);
  87. image1.height:=round(heightimage*trackbar1.position/100);
  88. end;
  89.  
  90. procedure TForm1.N10Click(Sender: TObject);
  91. begin
  92. if openpicturedialog1.Execute then
  93. begin
  94. image1.Picture.LoadFromFile(openpicturedialog1.FileName);
  95. widthimage:=image1.Width;
  96. heightimage:=image1.Height;
  97. image1.AutoSize:=true;
  98. image1.Stretch:=false;
  99. image1.Left:=1;
  100. image1.Top:=1;
  101. treeview1.Items.AddObjectFirst(treeview1.Items.GetFirstNode,'Êàðòà',@image1);
  102. end;
  103. end;
  104.  
  105. procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
  106. begin
  107. form1.newobject(Sender,Source,x,y);
  108. end;
  109.  
  110. procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
  111. State: TDragState; var Accept: Boolean);
  112. begin
  113. if source is tbitbtn then accept:=true;
  114. end;
  115.  
  116. procedure TForm1.Button1Click(Sender: TObject);
  117. var
  118. p:pointer;
  119. begin
  120. p:=TreeView1.Selected.Data;
  121. freeandnil(p^);
  122. TreeView1.Selected.Delete;
  123. end;
  124.  
  125. end.


Примечание #1 (7 апреля 2012, 03:45):
В прилагаемом файле находится библиотека для создаваемых объектов.

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

Вопрос задал: Artemka2208 (статус: Посетитель)
Вопрос отправлен: 7 апреля 2012, 03:42
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 6; последнее сообщение — 8 апреля 2012, 16:15; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2012, 09:29 [#1]:

objecti:array of TDrawobject;
Нахрена такой геморрой? Есть же TObjectList, который решит все проблемы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Artemka2208

Artemka2208 (статус: Посетитель), 7 апреля 2012, 13:40 [#2]:

Знаю есть, но токо у меня какая то фигня с дельфями, пишет что данный класс отсутсвует, точнее он не может найти его ни в одном модуле. Переустанавливать лень вот и гемороюсь. А так не в курсе: при добавлении объекта в массив что его адрес каждый раз переписывается??
Artemka2208

Artemka2208 (статус: Посетитель), 7 апреля 2012, 13:44 [#3]:

Да и ещё Contnrs дописать в подключаемые модули не предлагать, не хочет он его там искать.
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2012, 13:59 [#4]:

Цитата (Artemka2208):

Да и ещё Contnrs дописать в подключаемые модули не предлагать, не хочет он его там искать.

Да неужели? Во прям так и не хочет? Может плохо просишь? Пиши Contnrs в uses раздела interface того модуля, где будешь заводить переменную этого класса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2012, 14:02 [#5]:

Цитата (Artemka2208):

А так не в курсе: при добавлении объекта в массив что его адрес каждый раз переписывается??

Ясен пень, размер когда увеличиваешь, происходит перераспределение памяти и копирование со старого места на новое.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Artemka2208

Artemka2208 (статус: Посетитель), 8 апреля 2012, 16:15 [#6]:

Не хочет и не хотел. Как модули подключать я знаю. Не поленился переустановил теперь всё как по маслу)))) всё видит прекрасно)))

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.02 сек.