|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
TreeView.AddObject
Народ, я уже с ума схожу с этим Эддобжектом... Я понимаю, в поинтере хранится 4 байта и тд, но вот этот код у меня срабатывает как надо:
Код:
var VarStr:string; VarPtr:pointer; begin VarStr:='Hello, World!'; VarPtr:=pointer(VarStr); ShowMessage(string(VarPtr)); end; Не знаю по какой причине. Хотя, наверное, не должен. вот такой код Код:
for ... begin TreeView1.items.AddChildObject(Node,OtherVarString,pointer(VarStr)); end; Код:
for ... begin VarInt:=VarStringList.add(VarStr); VarPtr:=pointer(VarInt); TreeView1.items.AddChildObject(Node,OtherVarString,VarPtr); end; Если я обхожусь без этой строки, то есть Код:
TreeView1.items.AddChildObject(Node,OtherVarString,pointer(VarInt)); |
#2
|
||||
|
||||
Чтобы не ходит вокруг и около, выложу скрин
http://www.delphisources.ru/forum/at...d=136245131 0 На скрине ход выполнения кода. Красная строка - остановка на брейкпоинте. Синие маленькие кружочки слева, это те, что обрабатываются компилятором (то есть пошагово идет перемещение от одного синего кружочка к следующим). Как видите, под красной строкой идет нужная мне строка, которая не обрабатывается, то есть в ходе выполнения компилятор просто проходит мимо нее. Вопрос: ПОЧЕМУ??? Делфи и комп перезапускал. |
#3
|
|||
|
|||
наверно надо помять под указатели выделять, или вместо указателей использовать объекты
>woweook< |
#4
|
||||
|
||||
Цитата:
А... Еще прикол! Если я удалю красную строчку, то та, что под ней, начинает компилироваться... правда толку от нее нет тогда, но все же... |
#5
|
||||
|
||||
Новые данные.
после того, как я AddChildObject заменил на AddChild и добавил строчку Node.Data := TmpPtr некомпилируемая строка начала компилироваться. Однако толку от этого нет, в Data ничего не пишется. При трасировке вижу, что переменной TmpInt2 присваивается значение, но после строки TmpPtr:=Pointer(TmpInt2); я больше не могу увидеть ее значение, а значение TmpPtr остается равным nil. При попытке вставить после этой строки ShowMessage(IntToStr(TmpInt2)); получаю Access violation. В общем бред какой то! |
#6
|
|||
|
|||
указатели и дин. массивы, без знания подробностей - верный способ получить Access violation.
так же как объекты создают и освобождают, так же и поступают с указателями я делал бы примерно так Код:
My = class mydata:string create(mydata_:string) ... AddChildObject(...,My.create('abcde')); >woweook< |
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
morebeauty (11.03.2013)
|
#7
|
||||
|
||||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TTreeViewData = class(TComponent) public i: Integer; s: String; end; TForm1 = class(TForm) TreeView1: TTreeView; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i: Integer; o: TTreeViewData; begin for i:=1 to 10 do begin o:=TTreeViewData.Create(Self); o.i:=i; o.s:=IntToStr(i*10); TreeView1.Items.AddObjectFirst(nil, IntToStr(i), o); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(TTreeViewData(TreeView1.Selected.Data).i)+'*10='+TTreeViewData(TreeView1.Selected.Data).s); end; end. Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
morebeauty (11.03.2013)
|
#8
|
|||
|
|||
В первом случае Вы присваиваете в поле Data указатель на константную строку, которая существует всё время работы программы. А в случае, когда Вы используете динамически сформированную строку, могут быть проблемы.
|