Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.03.2013, 05:55
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию TreeView.AddObject

Народ, я уже с ума схожу с этим Эддобжектом... Я понимаю, в поинтере хранится 4 байта и тд, но вот этот код у меня срабатывает как надо:
Код:
var
VarStr:string;
VarPtr:pointer;
begin
VarStr:='Hello, World!';
VarPtr:=pointer(VarStr);
ShowMessage(string(VarPtr));
end;
Выводит 'Hello, World!'

Не знаю по какой причине. Хотя, наверное, не должен.

вот такой код
Код:
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;
и вуаля!.... Строка VarPtr:=pointer(VarInt); не КОМПИЛИРУЕТСЯ!!! То есть когда я пошагово перебираю код (при выполнении), компилятор просто проскакивает МИМО этой строки. Если я ставлю на ней БрейкПоинт, то ничего не происходит.

Если я обхожусь без этой строки, то есть
Код:
TreeView1.items.AddChildObject(Node,OtherVarString,pointer(VarInt));
то в дату нода вообще ничего не добавляется, хотя переменная VarInt существует и имеет вполне конкретное значение (ну это и из кода видно).
Ответить с цитированием
  #2  
Старый 05.03.2013, 06:45
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Чтобы не ходит вокруг и около, выложу скрин
http://www.delphisources.ru/forum/at...d=136245131 0
На скрине ход выполнения кода. Красная строка - остановка на брейкпоинте. Синие маленькие кружочки слева, это те, что обрабатываются компилятором (то есть пошагово идет перемещение от одного синего кружочка к следующим). Как видите, под красной строкой идет нужная мне строка, которая не обрабатывается, то есть в ходе выполнения компилятор просто проходит мимо нее. Вопрос: ПОЧЕМУ???

Делфи и комп перезапускал.
Изображения
Тип файла: png delphi.PNG (16.8 Кбайт, 13 просмотров)
Ответить с цитированием
  #3  
Старый 05.03.2013, 07:48
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

наверно надо помять под указатели выделять, или вместо указателей использовать объекты
__________________
>woweook<
Ответить с цитированием
  #4  
Старый 05.03.2013, 07:50
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

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

А... Еще прикол! Если я удалю красную строчку, то та, что под ней, начинает компилироваться... правда толку от нее нет тогда, но все же...
Ответить с цитированием
  #5  
Старый 05.03.2013, 08:39
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Новые данные.

после того, как я AddChildObject заменил на AddChild и добавил строчку
Node.Data := TmpPtr
некомпилируемая строка начала компилироваться. Однако толку от этого нет, в Data ничего не пишется. При трасировке вижу, что переменной TmpInt2 присваивается значение, но после строки
TmpPtr:=Pointer(TmpInt2);
я больше не могу увидеть ее значение, а значение TmpPtr остается равным nil.
При попытке вставить после этой строки
ShowMessage(IntToStr(TmpInt2));
получаю Access violation.
В общем бред какой то!
Ответить с цитированием
  #6  
Старый 05.03.2013, 09:16
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

указатели и дин. массивы, без знания подробностей - верный способ получить Access violation.
так же как объекты создают и освобождают, так же и поступают с указателями
я делал бы примерно так
Код:
My = class
  mydata:string
  create(mydata_:string)
...
AddChildObject(...,My.create('abcde'));
__________________
>woweook<
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
morebeauty (11.03.2013)
  #7  
Старый 05.03.2013, 09:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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.
Вложения
Тип файла: rar TreeView.rar (1.6 Кбайт, 40 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
morebeauty (11.03.2013)
  #8  
Старый 05.03.2013, 09:30
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

В первом случае Вы присваиваете в поле Data указатель на константную строку, которая существует всё время работы программы. А в случае, когда Вы используете динамически сформированную строку, могут быть проблемы.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter