Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› У профессионалом по Дельфи прошу помощи, не хватает знаний |
Посл.ответ | Сообщение |
|
Создано: 22 апреля 2006 15:41 · Личное сообщение · #1 Вот кусок кода, этот код у меня выполняется по нажатию на обычный батон на пустой форме. Он читает из XML-файла, название класса, все свойства объектов которые надо создать. В этом случае AClass3 и AControl3 - это динамически создаваемая форма, а AControl4 и AClass4 - это мой динамически создаваемый на этой форме TTreeView. Суть в том, что сам TreeView я добавил на форму, но не могу добавить в него 2 нода и во втором из них еещ один нод. Их мне надо добавить тоже не зная напрямую класса объекта, вытаскивать его можно только из XML-файла, т.е мне не надо делать так TTreeView(AControl4).Items.Add(nil,'Привет');
помогите как же добавить элементы, проблема заключается в том, что свойству значение легко присвоить с помощью SetPropValue, а вот как с методом Add в Items работать я не знаю.
|
|
Создано: 22 апреля 2006 16:09 · Личное сообщение · #2 |
|
Создано: 22 апреля 2006 16:43 · Личное сообщение · #3 |
|
Создано: 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 лепи все что хочешь |
|
Создано: 23 апреля 2006 06:57 · Личное сообщение · #5 Rush хех ты совсем не понял нельзя упоминания класса создаваемого объекта в коде вообще, а у тебя это в первой строчке уже TTreeView *pTreeView=new TTreeView(pTabSheet); А я его создаю динамически выдирая имя класса из XML. Так что немного повнимательней читай пост, а так спасибо за хотя, что откликнулся |
|
Создано: 23 апреля 2006 08:37 · Личное сообщение · #6 |
|
Создано: 23 апреля 2006 10:27 · Личное сообщение · #7 |
|
Создано: 23 апреля 2006 11:17 · Личное сообщение · #8 |
|
Создано: 23 апреля 2006 11:32 · Личное сообщение · #9 Black Neuromancer пишет: нельзя применять непосредственное создание класса напрямую через имя класса Так основная проблема в том, что ты хочешь об'ект хранить в дереве. А Rush предлагает хранить указатели. А сами об'екты храни например в массиве, точнее в контейнере наверное. Об'ект можно хранить и в дереве, но тогда придется его метод Create для Item переопределить - тут я явную фигню пишу, но идея должна быть понятна. |
|
Создано: 23 апреля 2006 12:31 · Поправил: Rush · Личное сообщение · #10 |
|
Создано: 23 апреля 2006 19:54 · Личное сообщение · #11 |
|
Создано: 23 апреля 2006 20:04 · Поправил: Rush · Личное сообщение · #12 |
|
Создано: 23 апреля 2006 20:10 · Личное сообщение · #13 Black Neuromancer пишет: я совсем не про указатели, это не важно как, главное что он указатель делает на TTreeView а этого слова вообще в коде не должно быть Ну Паскалевцы, ну вы_даёте! Создаёшь объекты в динамической куче, а сохраняешь воидовские указатели. Итс онли ----- Паскаль создан для динамического программирования, как рыба для полета |
|
Создано: 23 апреля 2006 20:12 · Личное сообщение · #14 |
|
Создано: 23 апреля 2006 21:44 · Поправил: =TS= · Личное сообщение · #15 kkcos пишет: Паскаль создан для динамического программирования, как рыба для полета Но все-таки рыбы летают, и на паскале можно работать с динамическими списками, массивами и обьектами, хотя и смотрится это дико после С kkcos: Ну Паскалевцы, ну вы_даёте! Создаёшь объекты в динамической куче, а сохраняешь воидовские указатели. Итс онли тема абсолютно не раскрыта, продолжить не хо? ----- DREAMS CALL US |
|
Создано: 24 апреля 2006 00:51 · Личное сообщение · #16 Black Neuromancer Насколько я понял, ты хочешь вытаскивать из XML файла объекты и динамически создавать, типа как айдишка Delphi или С++Builder`а вытаскивает их из *.DFM файлов, и тебе надо в процессе создания объекта помимо заполнения его свойств использовать еще его методы, типа на примере TreeView создать сразу ноды, тоже описанные в XML, если так, то как интересно не используя разбора классов ты сможешь В СТАТИЧЕСКОМ КОДЕ ПРОГРАММЫ использовать их различные методы, ну например возьмем TStringList и TTreeView - у них есть метод Add, но только возвращают они абсолютно разные значения не только по типу, но и по смыслу... это только начало, а как в дальнейшем в проге ты собираешься обращаться к методам этих объектов ? ИМХО, как я уже выше писал, написать небольшой интерпретатор и забить в память имена объектов... |
|
Создано: 24 апреля 2006 07:43 · Личное сообщение · #17 |
|
Создано: 24 апреля 2006 10:48 · Личное сообщение · #18 |
|
Создано: 24 апреля 2006 11:13 · Личное сообщение · #19 www.excode.ru/?mod=article&id=text&artid=652&action=showart&page=1&ex=59c9b74e16eed9e901846bdae2ce08ad Это не то, что тебя надо, но я понял в чем ты запутался. TreeView - это всего показушка - она показывает "готовое дерево", точнее можно его строить - только зачем. А вот класс Tree предназначен именно для твоих целей - там метод называется AddObject и может SetPopValue можно приспособить. |
|
Создано: 24 апреля 2006 14:04 · Личное сообщение · #20 Black Neuromancer пишет: нельзя упоминания класса создаваемого объекта в коде вообще, а у тебя это в первой строчке уже TTreeView *pTreeView=new TTreeView(pTabSheet); Ну я и говорю - сделай TTreeView *pTreeView=new TTreeView(pObject); и клади туда любой об'ект, любого класса. Object он всем отец. Ноды, если я правильно понял, реально в об'екте Tree создаются, а TreeView - это просто их визуализация. |
|
Создано: 24 апреля 2006 19:25 · Личное сообщение · #21 tundra37 пишет: А вот класс Tree предназначен именно для твоих целей - там метод называется AddObject Внимательнее посмотри пример на экзетулзах - там Tree это всего лишь переменная указатель на объект TreeView, а его метод AddObject позволяет помимо строкового значения нода присвоить ноду указатель на какой-либо объект, вот и все... |
|
Создано: 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; |
|
Создано: 25 апреля 2006 14:46 · Личное сообщение · #23 |
|
Создано: 25 апреля 2006 15:16 · Личное сообщение · #24 Black Neuromancer Так сразу бы сказал, что срочно и что это ТЗ. У меня Дельфи на соседнем компе, а он был выключен. Я думал, что ты хочешь сам разобраться и все больше на теорию упирал. По вопросу сразу было ясно, что метод Add не годится и надо искать другой. Смотри с SQL также не промахнись - правда там больше готовой информации в Инете нарыть можно. Но и по TTreeview + динамические я сразу нашел метод addObject, но поленился комп включить. Короче мой опыт подсказывает, что когда срочно - проще правильно поискать, чем спрашивать. |
eXeL@B —› Программирование —› У профессионалом по Дельфи прошу помощи, не хватает знаний |