Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› У профессионалом по Дельфи прошу помощи, не хватает знаний
Посл.ответ Сообщение


Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 22 апреля 2006 15:41
· Личное сообщение · #1

Вот кусок кода, этот код у меня выполняется по нажатию на обычный батон на пустой форме. Он читает из XML-файла, название класса, все свойства объектов которые надо создать. В этом случае AClass3 и AControl3 - это динамически создаваемая форма, а AControl4 и AClass4 - это мой динамически создаваемый на этой форме TTreeView. Суть в том, что сам TreeView я добавил на форму, но не могу добавить в него 2 нода и во втором из них еещ один нод. Их мне надо добавить тоже не зная напрямую класса объекта, вытаскивать его можно только из XML-файла, т.е мне не надо делать так

TTreeView(AControl4).Items.Add(nil,'Привет');

помогите как же добавить элементы, проблема заключается в том, что свойству значение легко присвоить с помощью SetPropValue, а вот как с методом Add в Items работать я не знаю.

with xmlDesc.DocumentElement.ChildNodes[1] do
begin
AClass3:=GetClass(AttributeNodes[0].NodeValue);
if AClass3 <> nil then
begin
AControl3:= TControl(TControlClass(AClass3).Create(Self));
SetPropValue(TObject(AControl3),AttributeNodes[1].NodeName,AttributeNo des[1].NodeValue);
SetPropValue(TObject(AControl3),AttributeNodes[2].NodeName,AttributeNo des[2].NodeValue);
AControl3.Show;
end;
with ChildNodes['TreeView'] do
begin
AClass4:=GetClass(AttributeNodes[0].NodeValue);
if AClass4 <> nil then
begin
AControl4:= TControl(TControlClass(AClass4).Create(Self));
AControl4.Parent:=TWinControl(AControl3);
SetPropValue(TObject(AControl4),'Left',10);
SetPropValue(TObject(AControl4),'Top',10);
SetPropValue(TObject(AControl4),AttributeNodes[1].NodeName,AttributeNo des[1].NodeValue);
end;
end;
end;




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 22 апреля 2006 16:09
· Личное сообщение · #2

Профессионалы по Дельфи конечно и сюда заглядывают, но в Интернете есть места, где их больше




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 22 апреля 2006 16:43
· Личное сообщение · #3

tundra37

туда я тоже написал но пока все молчат там



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 22 апреля 2006 22:52
· Личное сообщение · #4

Black Neuromancer

По-моему ты перемудрил, даю пример из C++Builder1`а, на дельфях все функции такие же

вот так например я создавал динамически в цикле дерево (кусок кода)

TTreeView *pTreeView=new TTreeView(pTabSheet);
pTreeView->Parent=pTabSheet;
pTreeView->Name="TreeView"+IntToStr(i);
pTreeView->SetBounds(0,0,169,313);
pTreeView->MultiSelect=False;
pTreeView->ReadOnly=True;
pTreeView->RightClickSelect=True;
pTreeView->Visible=True;
pTreeView->Enabled=True;
pTreeView->OnClick=MainTreeClick;
pTreeView->PopupMenu=PopupMenu1;
pTreeView->OnContextPopup=MainTreeContextPopup;

обращатся к созданному объекту можно через FindComponent (имя компонента ты знаешь), пример
CurrentTree=(TTreeView *)PageControl1->Pages[PageControl1->ActivePageIndex]->FindComponent("T reeView"+IntToStr(PageControl1->ActivePageIndex));

а затем обращаясь к CurrentTree лепи все что хочешь




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 23 апреля 2006 06:57
· Личное сообщение · #5

Rush

хех ты совсем не понял нельзя упоминания класса создаваемого объекта в коде вообще, а у тебя это в первой строчке уже TTreeView *pTreeView=new TTreeView(pTabSheet); А я его создаю динамически выдирая имя класса из XML. Так что немного повнимательней читай пост, а так спасибо за хотя, что откликнулся



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 апреля 2006 08:37
· Личное сообщение · #6

Я не большой спец по Дельфи, но все же - почему нельзя создать TreeView для pObject.
Object является родителем всех и следовательно туда можно "всех класть" или я не прав ?!



Ранг: 45.9 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 апреля 2006 10:27
· Личное сообщение · #7

посмотри сорцы nativeXML (я на руборде брал) там есть тема за сохранение форм в хмл и создание их из него. то что доктор прописал




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 23 апреля 2006 11:17
· Личное сообщение · #8

tundra37

ну потому что в ТЗ написано что нельзя применять непосредственное создание класса напрямую через имя класса. TreeView то я создал, код же продемонстрировал здесь TTreeView это AControl4. Я добавить в него не знаю как

Scratch

спасибо



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 апреля 2006 11:32
· Личное сообщение · #9

Black Neuromancer пишет:
нельзя применять непосредственное создание класса напрямую через имя класса

Так основная проблема в том, что ты хочешь об'ект хранить в дереве. А Rush предлагает хранить указатели. А сами об'екты храни например в массиве, точнее в контейнере наверное.
Об'ект можно хранить и в дереве, но тогда придется его метод Create для Item переопределить -
тут я явную фигню пишу, но идея должна быть понятна.



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 23 апреля 2006 12:31 · Поправил: Rush
· Личное сообщение · #10

Black Neuromancer

Напиши небольшой интерпретатор (простейший if, или switch) по именам классов, ведь базовых классов раз-два и обчелся, и работай с методами как белый человек




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 23 апреля 2006 19:54
· Личное сообщение · #11

Rush

хм, ладно, не понял ты меня совсем

tundra37

я совсем не про указатели, это не важно как, главное что он указатель делает на TTreeView а этого слова вообще в коде не должно быть



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 23 апреля 2006 20:04 · Поправил: Rush
· Личное сообщение · #12

Black Neuromancer

Да нет, я прекрасно понял, что ты хочешь, но ты хочешь сделать максимально минимальный и универсальный код, я просто предлагал пойти менее изящно, но более понятно...

выложи в посте кусок XML, например с TreeView...



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 апреля 2006 20:10
· Личное сообщение · #13

Black Neuromancer пишет:
я совсем не про указатели, это не важно как, главное что он указатель делает на TTreeView а этого слова вообще в коде не должно быть

Ну Паскалевцы, ну вы_даёте! Создаёшь объекты в динамической куче,
а сохраняешь воидовские указатели. Итс онли

-----
Паскаль создан для динамического программирования, как рыба для полета




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 23 апреля 2006 20:12
· Личное сообщение · #14

kkcos

продемонстрировать можешь на моем примере? а то слов много, а пользы никакой




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 апреля 2006 21:44 · Поправил: =TS=
· Личное сообщение · #15

kkcos пишет:
Паскаль создан для динамического программирования, как рыба для полета


Но все-таки рыбы летают, и на паскале можно работать с динамическими списками, массивами и обьектами, хотя и смотрится это дико после С

kkcos:
Ну Паскалевцы, ну вы_даёте! Создаёшь объекты в динамической куче,
а сохраняешь воидовские указатели. Итс онли


тема абсолютно не раскрыта, продолжить не хо?

-----
DREAMS CALL US




Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 24 апреля 2006 00:51
· Личное сообщение · #16

Black Neuromancer

Насколько я понял, ты хочешь вытаскивать из XML файла объекты и динамически создавать, типа как айдишка Delphi или С++Builder`а вытаскивает их из *.DFM файлов, и тебе надо в процессе создания объекта помимо заполнения его свойств использовать еще его методы, типа на примере TreeView создать сразу ноды, тоже описанные в XML, если так, то как интересно не используя разбора классов ты сможешь В СТАТИЧЕСКОМ КОДЕ ПРОГРАММЫ использовать их различные методы, ну например возьмем TStringList и TTreeView - у них есть метод Add, но только возвращают они абсолютно разные значения не только по типу, но и по смыслу... это только начало, а как в дальнейшем в проге ты собираешься обращаться к методам этих объектов ?
ИМХО, как я уже выше писал, написать небольшой интерпретатор и забить в память имена объектов...




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 24 апреля 2006 07:43
· Личное сообщение · #17

Rush

наконец-то ты понял суть, ну смотри если дельфи может вытаскивать из DFM, значит и программист может, только как хз




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 24 апреля 2006 10:48
· Личное сообщение · #18

Black Neuromancer
значит и программист может, только как хз

Может, еще как может ... где-то у меня даже исходник был как сохранить форму своего приложения в *.dfm

-----
Don_t hate the cracker - hate the code.




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 24 апреля 2006 11:13
· Личное сообщение · #19

www.excode.ru/?mod=article&id=text&artid=652&action=showart&page=1&ex=59c9b74e16eed9e901846bdae2ce08ad
Это не то, что тебя надо, но я понял в чем ты запутался. TreeView - это всего показушка - она показывает "готовое дерево", точнее можно его строить - только зачем. А вот класс Tree предназначен
именно для твоих целей - там метод называется AddObject и может SetPopValue можно приспособить.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 24 апреля 2006 14:04
· Личное сообщение · #20

Black Neuromancer пишет:
нельзя упоминания класса создаваемого объекта в коде вообще, а у тебя это в первой строчке уже TTreeView *pTreeView=new TTreeView(pTabSheet);

Ну я и говорю - сделай
TTreeView *pTreeView=new TTreeView(pObject);
и клади туда любой об'ект, любого класса. Object он всем отец. Ноды, если я правильно понял, реально в об'екте Tree создаются, а TreeView - это просто их визуализация.



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 24 апреля 2006 19:25
· Личное сообщение · #21

tundra37 пишет:
А вот класс Tree предназначен
именно для твоих целей - там метод называется AddObject


Внимательнее посмотри пример на экзетулзах - там Tree это всего лишь переменная указатель на объект TreeView, а его метод AddObject позволяет помимо строкового значения нода присвоить ноду указатель на какой-либо объект, вот и все...



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 25 апреля 2006 11:58
· Личное сообщение · #22

Это пример из хелпа. Добавляется об'ект известного типа, но
ничто не мешает переделать на динамически создаваемый.
Для построения веток есть фукнция AddChildObject.
Если хочется добавить в качестве узла, не экземпляр об'екта, а сам класс,
то это слишком высший пилотаж - придется долго читать документацию.
Но цель совершенно непонятна ?!
===================================
The following code defines a record type of TMyRec and a record pointer type of PMyRec.

type
PMyRec = ^TMyRec;
TMyRec = record
FName: string;
LName: string;
end;

Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of the indicated node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.

procedure TForm1.Button1Click(Sender: TObject);

var
MyRecPtr: PMyRec;
TreeViewIndex: LongInt;
begin
New(MyRecPtr);
MyRecPtr^.FName := Edit1.Text;
MyRecPtr^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
if Items.Count = 0 then
Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then

Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
end;
end;




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 25 апреля 2006 14:46
· Личное сообщение · #23

tundra37

дык цели нет, это такое ТЗ на работу было, ну вроде и так примут, в четверг уже на собеседование, ща разбираюсь как работать в дельфи с SQL и типа всякие там хранимые процедуры



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 25 апреля 2006 15:16
· Личное сообщение · #24

Black Neuromancer
Так сразу бы сказал, что срочно и что это ТЗ. У меня Дельфи на соседнем компе, а он был выключен.
Я думал, что ты хочешь сам разобраться и все больше на теорию упирал.
По вопросу сразу было ясно, что метод Add не годится и надо искать другой.
Смотри с SQL также не промахнись - правда там больше готовой информации в Инете нарыть можно.
Но и по TTreeview + динамические я сразу нашел метод addObject, но поленился комп включить.
Короче мой опыт подсказывает, что когда срочно - проще правильно поискать, чем спрашивать.


 eXeL@B —› Программирование —› У профессионалом по Дельфи прошу помощи, не хватает знаний
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати