![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Народ, я уже с ума схожу с этим Эддобжектом... Я понимаю, в поинтере хранится 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
|
|||
|
|||
|
наверно надо помять под указатели выделять, или вместо указателей использовать объекты
|
|
#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')); |
| Этот пользователь сказал Спасибо 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)
| ||