|
Вопрос # 6 052/ вопрос открыт / |
|
Здравствуйте, эксперты! Проблема в следующем. Я динамически создаю объекты и записываю их в массив. При этом адрес создаваемых объектов передаю в дерево. При попытке их удалить вылазиет ошибка доступа к памяти. Если удаляю последний записанный элемент в дерево то всё норм. С остальными так не прокатывает. При поптыке отследить пошагово обнаруживаю что адрес пустой. Кто подскажет в чм проблема или может быть как лучше организовать удаление объектов.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, Menus, jpeg, ExtDlgs, Drawobjects1,Drawobjects2;
-
- type
- TForm1 = class(TForm)
- Panel1: TPanel;
- Label1: TLabel;
- TreeView1: TTreeView;
- MainMenu1: TMainMenu;
- N1: TMenuItem;
- N2: TMenuItem;
- N3: TMenuItem;
- N4: TMenuItem;
- N5: TMenuItem;
- N6: TMenuItem;
- N7: TMenuItem;
- N8: TMenuItem;
- N10: TMenuItem;
- Panel2: TPanel;
- SpeedButton1: TSpeedButton;
- SpeedButton2: TSpeedButton;
- PopupMenu1: TPopupMenu;
- PopupMenu2: TPopupMenu;
- N11: TMenuItem;
- N12: TMenuItem;
- N13: TMenuItem;
- N14: TMenuItem;
- TrackBar1: TTrackBar;
- Label2: TLabel;
- OpenPictureDialog1: TOpenPictureDialog;
- BitBtn1: TBitBtn;
- ScrollBox1: TScrollBox;
- Image1: TImage;
- Button1: TButton;
- procedure TrackBar1Change(Sender: TObject);
- procedure N10Click(Sender: TObject);
- procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
- procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- procedure newobject(Sender, Source: TObject; X, Y: Integer);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- widthimage,heightimage:integer;
- objecti:array of TDrawobject;
- implementation
-
- {$R *.dfm}
- procedure Tform1.newobject(Sender, Source: TObject; X, Y: Integer);
- var
- b:integer;
- begin
- setlength(objecti,length(objecti)+1);
- objecti[length(objecti)-1]:=tpic.Create(Image1);
- (objecti[length(objecti)-1] as tpic).Parent:=Scrollbox1;
- (objecti[length(objecti)-1] as tpic).LoadPicFromFile('f:\1.bmp');
- (objecti[length(objecti)-1] as tpic).Width:=40;
- (objecti[length(objecti)-1] as tpic).Height:=40;
- (objecti[length(objecti)-1] as tpic).Stretch:=true;
- b:=scrollbox1.HorzScrollBar.ScrollPos;
- scrollbox1.HorzScrollBar.Position:=0;
- (objecti[length(objecti)-1] as tpic).Left:=x;
- scrollbox1.HorzScrollBar.Position:=b;
- b:=scrollbox1.vertScrollBar.scrollPos;
- scrollbox1.vertScrollBar.Position:=0;
- (objecti[length(objecti)-1] as tpic).Top:=y;
- scrollbox1.vertScrollBar.Position:=b;
- treeview1.Items.AddChild(treeview1.Items.Item[0],'phly1');
- end;
-
- procedure TForm1.TrackBar1Change(Sender: TObject);
- begin
- Image1.autosize:=false;
- image1.Stretch:=true;
- image1.Width:=round(widthimage*trackbar1.position/100);
- image1.height:=round(heightimage*trackbar1.position/100);
- end;
-
- procedure TForm1.N10Click(Sender: TObject);
- begin
- if openpicturedialog1.Execute then
- begin
- image1.Picture.LoadFromFile(openpicturedialog1.FileName);
- widthimage:=image1.Width;
- heightimage:=image1.Height;
- image1.AutoSize:=true;
- image1.Stretch:=false;
- image1.Left:=1;
- image1.Top:=1;
-
treeview1.Items.AddObjectFirst(treeview1.Items.GetFirstNode,'Êàðòà',@image1);
- end;
- end;
-
- procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
- begin
- form1.newobject(Sender,Source,x,y);
- end;
-
- procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- begin
- if source is tbitbtn then accept:=true;
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- p:pointer;
- begin
- p:=TreeView1.Selected.Data;
- freeandnil(p^);
- TreeView1.Selected.Delete;
- end;
-
- end.
Примечание #1 (7 апреля 2012, 03:45): В прилагаемом файле находится библиотека для создаваемых объектов.
 |
Вопрос задал: Artemka2208 (статус: Посетитель)
Вопрос отправлен: 7 апреля 2012, 03:42
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 8 апреля 2012, 16:15; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 7 апреля 2012, 09:29 [#1]:
objecti:array of TDrawobject;
Нахрена такой геморрой? Есть же TObjectList, который решит все проблемы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Artemka2208 (статус: Посетитель), 7 апреля 2012, 13:40 [#2]:
Знаю есть, но токо у меня какая то фигня с дельфями, пишет что данный класс отсутсвует, точнее он не может найти его ни в одном модуле. Переустанавливать лень вот и гемороюсь. А так не в курсе: при добавлении объекта в массив что его адрес каждый раз переписывается??
|
|
Artemka2208 (статус: Посетитель), 7 апреля 2012, 13:44 [#3]:
Да и ещё Contnrs дописать в подключаемые модули не предлагать, не хочет он его там искать.
|
|
min@y™ (статус: Доктор наук), 7 апреля 2012, 13:59 [#4]:
Цитата (Artemka2208):
Да и ещё Contnrs дописать в подключаемые модули не предлагать, не хочет он его там искать.
Да неужели? Во прям так и не хочет? Может плохо просишь? Пиши Contnrs в uses раздела interface того модуля, где будешь заводить переменную этого класса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 7 апреля 2012, 14:02 [#5]:
Цитата (Artemka2208):
А так не в курсе: при добавлении объекта в массив что его адрес каждый раз переписывается??
Ясен пень, размер когда увеличиваешь, происходит перераспределение памяти и копирование со старого места на новое.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Artemka2208 (статус: Посетитель), 8 апреля 2012, 16:15 [#6]:
Не хочет и не хотел. Как модули подключать я знаю. Не поленился переустановил теперь всё как по маслу)))) всё видит прекрасно)))
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|