[gme-users] Feedback: Removing/deleting model elements in BON1

Jane Lin liny at cis.uab.edu
Thu Mar 16 11:14:51 CST 2006


Hi Zoli,

It fixed the problem! Thank you very much for pointing out this.

Jane
---------------------------------------------------------------------------------
Yuehua (Jane) Lin
Department of Computer and Information Sciences
University of Alabama at Birmingham
liny at cis.uab.edu
http://www.cis.uab.edu/liny


----- Original Message ----- 
From: "Zoltan Molnar" <zolmol at isis.vanderbilt.edu>
To: "gme-users" <gme-users at list.isis.vanderbilt.edu>
Sent: Wednesday, March 15, 2006 10:39 AM
Subject: RE: [gme-users] Feedback: Removing/deleting model elements in BON1


> Jane,
>
> The reason is that the DeleteSelected methods in MySmartModel class use
> the RemoveModel or RemoveAtom calls, which remove objects only from the
> list called models, atoms,... but not from children.
>
> So in the DeletSelected please insert one additional removal task :
>
> POSITION pos = this->children->Find(childModel);
> if(pos) this->children->RemoveAt(pos);
>
> Br, Zoli
>
>> -----Original Message-----
>> From: gme-users-bounces at list.isis.vanderbilt.edu
>> [mailto:gme-users-bounces at list.isis.vanderbilt.edu] On Behalf
>> Of Jane Lin
>> Sent: Tuesday, March 14, 2006 9:09 AM
>> To: gme-users
>> Subject: [gme-users] Feedback: Removing/deleting model
>> elements in BON1
>>
>>
>> Hi Zoli,
>>
>> A couple of weeks ago, I implemented the deleting operations
>> (e.g., to delete an atom from a model and delete a submodel
>> from  a model) based on the sample codes you provided, the
>> only difference is my DeleteSelected methods are used to
>> delete a single atom or a single submodel, but yours are used
>> to delete a list. However, if I tried to find the the deleted
>> atom right after it was deleted, I still could find it!!!  Is
>> this a transaction boundary issue?
>>
>> The following is the code I used to test this:
>>
>> void CComponent::InvokeEx(CBuilder &builder,CBuilderObject *focus,
>> CBuilderObjectList &selected, long param)
>> {
>>   //work with focused model
>>  const CBuilderObjectList *children = ((CBuilderModel
>> *)focus)->GetChildren();  POSITION pos =
>> children->GetHeadPosition();  while(pos){
>>   CBuilderObject *child = children->GetNext(pos);
>>   CString childName;
>>   childName = child->GetName();
>>   if(childName == "S1") {
>>    AfxMessageBox("S1 found!");
>>    ((CMySmartModel *)focus)->DeleteSelected((CMySmartAtom *)child);
>>   }
>>  }
>>  //find S1 again, it should not be found!
>>  const CBuilderObjectList *children2 = ((CBuilderModel
>> *)focus)->GetChildren();  POSITION pos2 =
>> children2->GetHeadPosition();  while(pos2){
>>   CBuilderObject *child = children2->GetNext(pos2);
>>   CString childName;
>>   childName = child->GetName();
>>   if(childName == "S1") {
>>    AfxMessageBox("S1 found again!");
>>   }
>>  }
>>  return;
>> }
>> --------------------------------------------------------------
>> ---------
>> The sample codes I put in Component.h:
>> ---------------------------------------------------------------------
>> class CMySmartModel : public CBuilderModel
>> {
>> DECLARE_CUSTOMMODEL(CMySmartModel, CBuilderModel)
>> public:
>> void deleteMySelf();
>> void DeleteSelected(CMySmartAtom *childAtom);
>> void DeleteSelected( CMySmartModel *childModel);
>> virtual ~CMySmartModel() { }
>> };
>> class CMySmartAtom : public CBuilderAtom
>> {
>> DECLARE_CUSTOMATOM(CMySmartAtom, CBuilderAtomerence)
>> public:
>> virtual ~CMySmartAtom() { }
>> void deleteMySelf();
>> };
>> --------------------------------------------------------------
>> --------------
>> The codes I put in Component.cpp
>> --------------------------------------------------------------
>> --------------
>> void CMySmartModel::DeleteSelected( CMySmartAtom *childAtom)
>> {  ASSERT( childAtom );  this->RemoveAtom(
>> childAtom);//delete builder object which type is Atom
>> childAtom->deleteMySelf();//delete MGA object }
>>
>> void CMySmartModel::DeleteSelected( CMySmartModel
>> *childModel) {  ASSERT( childModel );  this->RemoveModel(
>> childModel );//delete builder object which type is Model
>> childModel->deleteMySelf();//delete MGA object }
>>
>> void CMySmartModel::deleteMySelf()
>> {
>>  CComPtr<IMgaFCO> my_mga_ptr = this->ciObject;
>> my_mga_ptr->DestroyObject(); }
>>
>> void CMySmartAtom::deleteMySelf()
>> {
>>  CComPtr<IMgaFCO> my_mga_ptr = this->ciObject;
>> my_mga_ptr->DestroyObject(); }
>>
>>
>> Jane
>> --------------------------------------------------------------
>> -------------------
>> Yuehua (Jane) Lin
>> Department of Computer and Information Sciences
>> University of Alabama at Birmingham
>> liny at cis.uab.edu
>> http://www.cis.uab.edu/liny
>>
>>
>> ----- Original Message ----- 
>> From: "Zoltan Molnar" <zolmol at isis.vanderbilt.edu>
>> To: "gme-users" <gme-users at list.isis.vanderbilt.edu>
>> Sent: Thursday, February 02, 2006 4:28 PM
>> Subject: RE: [gme-users] Removing/deleting model elements in BON1
>>
>>
>> > Hi,
>> >
>> > If case of BON1 interpreters: let me make clear what I
>> meant by ''used
>> > in destructors'': BON1 uses that method internally in its
>> destructors.
>> >
>> >> The protected RemoveAtom & co. methods release objects
>> only from the
>> >> Builder structure, [they are used mostly in destructors],
>> and they do
>> >> not provide the functionality you would like to have: to remove an
>> >> atom from the gme model.
>> >>
>> >
>> >
>> > As Akos suggested if you subclass the CBuilderObject then you may
>> > access some of its protected members. Here you can find a COM based
>> > Delete implemented, using subclassing, thus acquiring the
>> ciObject [a
>> > COM pointer] member of CBuilderObject and invoking the
>> DestroyObject
>> > COM method on it. This DestroyObject deletes the MGA object (the
>> > object sitting in GME's window). The C++ builder objects need to be
>> > deleted also, that is why RemoveReference( obj) is called in
>> > CMySmartModel::DeleteSelected.
>> >
>> > CMySmartObj is an object which I could delete, CMySmartModel is its
>> > parent model.
>> >
>> > Br, Zoli
>> >
>> > -----------------put these into
>> Component.h--------------------- class
>> > CMySmartObj; typedef CTypedPtrList<CPtrList, CMySmartObj*>
>> > CMySmartObjList;
>> >
>> > class CMySmartModel : public CBuilderModel
>> > {
>> > DECLARE_CUSTOMMODEL(CMySmartModel, CBuilderModel)
>> > public:
>> > virtual void Traverse(CMySmartObjList &list);
>> > void DeleteSelected( CMySmartObjList &list);
>> > virtual ~CMySmartModel() { }
>> > };
>> >
>> > class CMySmartObj : public CBuilderReference
>> > {
>> > DECLARE_CUSTOMREF(CMySmartObj, CBuilderReference)
>> > public:
>> > virtual ~CMySmartObj() { }
>> > void deleteMySelf();
>> > };
>> >
>> > ----------------------put these into component.cpp---------------
>> >
>> >
>> > IMPLEMENT_CUSTOMMODEL(CMySmartModel, CBuilderModel,
>> "configuration")
>> > IMPLEMENT_CUSTOMREF( CMySmartObj, CBuilderReference,
>> "interface_ref")
>> >
>> > void CMySmartModel::Traverse(CMySmartObjList &lst)
>> > {
>> > const CBuilderReferenceList *ref_list =
>> > GetReferences("interface_ref"); POSITION pos =
>> > ref_list->GetHeadPosition();
>> > while(pos)
>> > {
>> > CMySmartObj *obj = (CMySmartObj
>> > *)ref_list->GetNext(pos);
>> > ASSERT( obj);
>> > lst.AddTail( obj);
>> > }
>> > }
>> >
>> >
>> > void CMySmartModel::DeleteSelected(CMySmartObjList &smart_lst) {
>> > POSITION pos = smart_lst.GetHeadPosition();
>> > while(pos)
>> > {
>> > CMySmartObj *obj = (CMySmartObj
>> > *)smart_lst.GetNext(pos);
>> > ASSERT( obj);
>> > this->RemoveReference( obj);
>> > obj->deleteMySelf();
>> > }
>> >
>> > // test:
>> > // trying to acquire one more time
>> > const CBuilderReferenceList *ref_list =
>> > GetReferences("interface_ref"); pos = ref_list->GetHeadPosition();
>> > while(pos)
>> > {
>> > // it should not enter this loop
>> > CMySmartObj *obj = (CMySmartObj
>> > *)ref_list->GetNext(pos);
>> > ASSERT( obj);
>> > obj->deleteMySelf();
>> > }
>> > // end test
>> > }
>> >
>> > void CMySmartObj::deleteMySelf()
>> > {
>> > CComPtr<IMgaFCO> my_mga_ptr = this->ciObject;
>> > my_mga_ptr->DestroyObject(); }
>> >
>> >
>> > // traverses models inside topfolders and deletes all
>> occurences of a
>> > certain reference kind void test2(CBuilder &builder,CBuilderObject
>> > *focus, CBuilderObjectList &selected, long param)
>> > {
>> > CBuilderFolder *rf = builder.GetRootFolder();
>> >
>> > CBuilderFolder *lastFolder = 0;
>> > const CBuilderFolderList * flds = rf->GetSubFolders();
>> POSITION pos =
>> > flds->GetHeadPosition(); while( pos)
>> > {
>> > CBuilderFolder *fld = flds->GetNext( pos);
>> > lastFolder = fld;
>> >
>> > const CBuilderObjectList *lst =
>> > lastFolder->GetRootObjects();
>> > POSITION pos = lst->GetHeadPosition();
>> > while( pos)
>> > {
>> > CBuilderObject *obj = lst->GetNext( pos);
>> > if(obj->IsKindOf(RUNTIME_CLASS(CMySmartModel)))
>> > {
>> > CMySmartObjList list;
>> > // fill the list with MySmartObjs
>> > CMySmartModel *smodel = (CMySmartModel
>> > *) obj;
>> > smodel->Traverse(list);
>> >
>> > // now delete them
>> > smodel->DeleteSelected( list);
>> > }
>> > }
>> > }
>> > }
>> >
>> > void CComponent::InvokeEx(CBuilder &builder,CBuilderObject *focus,
>> > CBuilderObjectList &selected, long param) {
>> > test2( builder, focus, selected, param);
>> > }
>> > _______________________________________________
>> > gme-users mailing list
>> > gme-users at list.isis.vanderbilt.edu
>> > http://list.isis.vanderbilt.edu/mailman/listinfo/gme-users
>>
>> _______________________________________________
>> gme-users mailing list
>> gme-users at list.isis.vanderbilt.edu
>> http://list.isis.vanderbilt.edu/mailman/listinfo/gme-users
>>
> _______________________________________________
> gme-users mailing list
> gme-users at list.isis.vanderbilt.edu
> http://list.isis.vanderbilt.edu/mailman/listinfo/gme-users 



More information about the gme-users mailing list