|
Вопрос # 4 532/ вопрос открыт / |
|
Всех приветствую.
Вопрос возможно нубовский, но тем не менее
проблема состоит в том что я програмно создаю много кнопок на форме, попутно занося указатели на них в связный список. После этого я пытаюсь удалить первую созданную кнопку, в результате получаю ошибку обращения к памяти, почему не понимаю.
Если ктото знает как решить проблему отпишите пожалуста.
P.S. про dispose знаю, но это не помогает в моей проблеме, и потом еще думаю что если не уничтожить панель, то возможны утечки памяти.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure FormClick(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
-
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- type MyFerst = record
- num: integer;
- next: Pointer;
- End;
-
- type TMyElement = record
- prev: Pointer;
- button: TButton;
- next: Pointer;
- End;
-
- type MyElementP = ^TMyElement;
-
- var
- Form1: TForm1;
- MyButton: TButton;
- i:integer;
-
-
-
-
-
- implementation
-
- {$R *.dfm}
-
-
- procedure TForm1.FormClick(Sender: TObject);
- var
- ALeft, ATop, AWidth, AHeight: Integer;
- MyPoint: TPoint;
- p:pointer;
- Begin
- Windows.GetCursorPos(MyPoint);
- AWidth := 75;
- AHeight := 25;
- ALeft := MyPoint.X-Form1.Left-5;
- ATop := MyPoint.Y-Form1.Top-35;
-
- i:=i+1;
-
-
- Ferst.num:=i;
-
-
- Begin
- Ferst.next:=Pointer(ElementP);
- Element:=ElementP^;
- Element.prev:=@Ferst;
- End
-
- Begin
- Element.next:=Pointer(ElementP);
- p:=@Element;
- Element:=ElementP^;
- Element.prev:=p;
- End;
-
-
- Element.next:=nil;
-
- MyButton:=Element.button;
- MyButton.Parent:=Form1;
- MyButton.Name:='ButtonN'+IntToStr(i);
-
-
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- ElementP:=MyElementP(Ferst.next);
- Element:=ElementP^;
- MyButton:=Element.button;
-
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
-
- Ferst.next:=nil;
- end;
-
- end.
 |
Вопрос задал: 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 (статус: Посетитель), 26 августа 2010, 17:45 [#21]:
Может быть, я глубоко C++ не изучал.
|
|
min@y™ (статус: Доктор наук), 26 августа 2010, 21:34 [#22]:
Цитата (SOA):
Может быть, я глубоко C++ не изучал.
Указатели одинаково просты и сложны в любых языках программирования. Просто вся эта байда пишется по-разному, типа Pointer и void*, ^Integer и int*, а смысл один и тот же. Городить указатели, которые указывают на указатели (type buttonP = ^TButton - это мозговой моносексуализм.
Давай я тебе напишу TButtonList и будет тебе простое человеческое счастье. Я в отпуске, заняться нечем... И тебе помогу, и сам развлекусь.
2 Вадим К: еду к тебе на/в Украину 3-го числа. Давно на море не был.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 27 августа 2010, 20:56 [#23]:
min@y™
>Давай я тебе напишу TButtonList и будет тебе простое человеческое счастье. Я в отпуске, заняться нечем... И тебе >помогу, и сам развлекусь.
За предложение спасибо, но не нужно, мне вполне подходит мой вариант.
|
|
min@y™ (статус: Доктор наук), 27 августа 2010, 21:21 [#24]:
Цитата (SOA):
За предложение спасибо, но не нужно, мне вполне подходит мой вариант.
Некто Ульянов (Ленин) тоже говорил: "Мы пойдём другим путём". Весь Мир знает, что из этого получилось...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zvygin1964 (статус: Посетитель), 13 октября 2014, 23:07 [#25]:
TButtonList и будет МНЕ простое человеческое счастье
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|