Welcome Guest ( Log In | Register )

Help | Search | Members | Calendar

 
Вопрос по С# и .NET, Как это релаизовать
« Next Oldest | Next Newest » Track this topic | Email this topic | Print this topic
DZUK
Posted: Jan 6 2009, 18:55

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

В библиотеке .NET есть некий класс DataGridViewSelectedRowCollection, который реализует интерфейс IList. У интерфейса IList есть метод Add(object). НО, у DataGridViewSelectedRowCollection этого метода нету (вернее он private).

Вопрос номер один: как такое реализуется?

Вопрос номер два: класс DataGridView использует этот метод?

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



--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 6 2009, 21:34

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Я думаю так - этот DataGridView на самом деле представление некоего table в базе данных и именно поэтому у него нет метода Add. Чтоб добавить туда че-нить надо добавить в таблицу и оно там появится..

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Jan 6 2009, 22:33

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE
Я думаю так - этот DataGridView на самом деле представление некоего table в базе данных и именно поэтому у него нет метода Add. Чтоб добавить туда че-нить надо добавить в таблицу и оно там появится..


Я и не говорил что у DataGridView должен быть метод Add. А если никакой БД нету?



Походу у меня еще один вопрос:
Есть функция, которая написана на неуправляемом С++ и находится в неком DLL. Эта функция получает указатель на участок управляемой памяти и там шаманит немного. При запуске Debug версии никаких проблем не возникает, а при запуске Release версии CLR ругается, что хто-то в управляемой памяти пытается шаманить.

Собственно вопрос: Почему?

Функция из dll в управляемом коде я подключаю так:

CODE

[DllImport("Mixer.dll")]
private unsafe static extern void mixWithColor(int height, int width, byte* rp, byte* mask, и.т.д...);


П.С. В маршалинг я так и не врубился.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 6 2009, 22:58

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

для передачи указателей надо их зафиксировать, убей не помню как smile.gif) Насчет приватного метода все просто - можно понижать доступ повышать нельзя, например можно паблик функцию в интерфейсе обьявить у себя private, но protected в public - нельзя... или я путаю и так только в плюсах wink.gif))

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Jan 6 2009, 23:14

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE
...можно паблик функцию в интерфейсе обьявить у себя private...


Я так пробывал, тока компилер орет " virtual or abstract members cannot be private". Потом в шарп, че действительно френд функций нету?

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 6 2009, 23:20

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

А зачем они тебе?

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Jan 6 2009, 23:43

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

Ну я делаю компонент, где-то уже выкладывал его куски толи весь целиком, (долго же я его делаю), ну и там есть класс MActivePicture (аля DataGridView), которий есть ничто иное как PictureBox с добавлением моих свойств. На нем есть активые участки MActiveObject(аля DataGridViewRow), которые по клику должны выделяться(как строки в DataGridView). У MActivePicture есть свойство MActiveSelectedObjectsCollection (аля DataGridViewSelectedRowsCollection), который наследует от ArrayList, у которого в свою очередь есть метод Add. Но "простым смертным" нельзя менять содержимое MActiveSelectedObjectsCollection, единсвенный кто имеет на это право это MActivePicture. Вот это я и пытаюсь сделать. Справедливости ради стоит сказать, что DataGridViewSelectedRowsCollection не наследует от ArrayList, а реализует интерфейс IList, у которого все равно есть метод Add.

Вот, это опус на счет того, накой мне такие извраты с ООП. А на счет вызова "неуправляемой" функции: поскольку управляемый код оказался тормознутым, то пришлось писать закраску активных регионов писать на C++.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 7 2009, 00:53

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Они оба могут хранить ссылку на шарнутый обьект MActiveSelectedObjectsCollection который позволяет делать Add. Кто создает MActiveObject? Я так подозреваю что MActivePicture, тк что он может вполне безопасно передвать ссылку на этот обьект в конструкторе.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Jan 7 2009, 17:55

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

На данный момент пользыватель и создает МActiveObject, но это можно поменять. Но как тогда запретить кому-то кроме MActivePicture делать add? Хотя конечно как вериант можно коммент на этом методе написать: "Трониш, прирежу!".

CODE
...для передачи указателей надо их зафиксировать, убей не помню как..


А в какую сторону гуглить?

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 7 2009, 18:00

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Никому больше этого обьекта не давать, он же ВНУТРИ их обоих и снаружи не виден.
Гугли в сторону IntPtr и Marshal smile.gif

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
Dream_InspectoR
Posted: Jan 7 2009, 18:04

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Вот еще нарыл

GCHandle pinnedPacket = GCHandle.Alloc(packet, GCHandleType.Pinned);
...
...
pinnedPacket.Free();

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Jan 7 2009, 18:20

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE (In the immortal words of Dream_InspectoR, since Jan 7 2009, 19:00)
Никому больше этого обьекта не давать, он же ВНУТРИ их обоих и снаружи не виден.
Гугли в сторону IntPtr и Marshal smile.gif

Тогда его смысл теряется, если его никому не давать. Он нужен, чтобы выделенные обьекты получить.

Нагуглил чет на счет оператора fixed (если кому интерсно), правда он в моем случае не заработал. Но эта проблема решилась: я забыл поменять DLL в папке релиз версии(как нормально подключать DLL к проекту я не нашел)smile.gif Так что проблема небезопасных указателей решена, осталось понять как скрутить MActivePicture.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 7 2009, 18:37

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Сделай побольше глобальных переменных и все будет пучком wink.gif И главное один болзшой класс и много статических фукций smile.gif)

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
Master of Puppets
Posted: Jan 7 2009, 21:01

Eye of the Vision

Group: Moderator
Member No.: 2067

Joined: August 29, 2006

QUOTE (In the immortal words of DZUK, since Jan 7 2009, 18:20...)
Тогда его смысл теряется, если его никому не давать. Он нужен, чтобы выделенные обьекты получить.

Напиши обертку вокруг него, емае smile.gif Чтоб читать могли, а изменять не могли. Наружу высовывай эту обертку а у себя внутри шамань с самим объектом.
P.S.: Если я, конечно, правильно понял, в чем проблема smile.gif

--------------------
Master of Puppets, I'm pulling your strings, twisting your mind and smashing your dreams!
⠠⠵
 
       Top
DZUK
Posted: Jan 7 2009, 22:48

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE (In the immortal words of Dream_InspectoR, since Jan 7 2009, 19:37)
Сделай побольше глобальных переменных и все будет пучком wink.gif И главное один болзшой класс и много статических фукций smile.gif)

Угу, и назовем этот стиль ОФП.

Мастер, есть три класса. У одного есть метод Add(), причем этот метод наследуется от некого интерфейса и поэтому сделать его private или protected я не могу. Одному избранному классу можно и нужно его вызывать. Остальным нельзя. Как этого добиться без френд я не знаю. А хотелось бы знать.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Jan 8 2009, 12:02

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Мля я же сказал как, если кроме них никто не пользуется им то наружу кроме них не надо и давать. Все.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
Master of Puppets
Posted: Jan 8 2009, 13:55

Eye of the Vision

Group: Moderator
Member No.: 2067

Joined: August 29, 2006

QUOTE (In the immortal words of DZUK, since Jan 7 2009, 22:48)
Угу, и назовем этот стиль ОФП.

Мастер, есть три класса. У одного есть метод Add(), причем этот метод наследуется от некого интерфейса и поэтому сделать его private или protected я не могу. Одному избранному классу можно и нужно его вызывать. Остальным нельзя. Как этого добиться без френд я не знаю. А хотелось бы знать.

Подумаем так.
Пусть A это класс, у которого злополучный метод Add. Пусть B это класс, который должен содержать экземпляр класса A. Этот экземпляр в нем наглухо замурован, никто к нему не имеет доступа. Ты добавляешь класс-обертку C, который хранит ССЫЛКУ на объект класса A, замурованный в B, имеет набор методов, которые позволяют читать стейт объекта, но не изменять его. Соответственно, у B есть некоторый метод, который возвращает экземпляр класса-обертки клиенту, клиент может читать статус объекта, но изменять не может. А?

--------------------
Master of Puppets, I'm pulling your strings, twisting your mind and smashing your dreams!
⠠⠵
 
       Top
DZUK
Posted: Jan 8 2009, 17:16

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE (In the immortal words of Dream_InspectoR, since Jan 8 2009, 13:02)
Мля я же сказал как, если кроме них никто не пользуется им то наружу кроме них не надо и давать. Все.

на что я ответил
QUOTE
Тогда его смысл теряется, если его никому не давать.


Тоесть кроме этих двоих им должны пользываться все желающие.

QUOTE
Подумаем так.
Пусть A это класс, у которого злополучный метод Add. Пусть B это класс, который должен содержать экземпляр класса A. Этот экземпляр в нем наглухо замурован, никто к нему не имеет доступа. Ты добавляешь класс-обертку C, который хранит ССЫЛКУ на объект класса A, замурованный в B, имеет набор методов, которые позволяют читать стейт объекта, но не изменять его. Соответственно, у B есть некоторый метод, который возвращает экземпляр класса-обертки клиенту, клиент может читать статус объекта, но изменять не может. А?


Хмм.. Такой фокус сработал бы. Жаль что сам не догадался. Правда это не обьясняет как Майкрософт удалось наследовать от интерфейса IList, и при этом скрыть его метод Add() ph34r.gif


Всем спасибо за ответы. Вопросы исчерпаны. Проблема решена.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Master of Puppets
Posted: Jan 8 2009, 21:33

Eye of the Vision

Group: Moderator
Member No.: 2067

Joined: August 29, 2006

QUOTE (In the immortal words of DZUK, since Jan 8 2009, 17:16)
на что я ответил


Тоесть кроме этих двоих им должны пользываться все желающие.

QUOTE
Подумаем так.
Пусть A это класс, у которого злополучный метод Add. Пусть B это класс, который должен содержать экземпляр класса A. Этот экземпляр в нем наглухо замурован, никто к нему не имеет доступа. Ты добавляешь класс-обертку C, который хранит ССЫЛКУ на объект класса A, замурованный в B, имеет набор методов, которые позволяют читать стейт объекта, но не изменять его. Соответственно, у B есть некоторый метод, который возвращает экземпляр класса-обертки клиенту, клиент может читать статус объекта, но изменять не может. А?


Хмм.. Такой фокус сработал бы. Жаль что сам не догадался. Правда это не обьясняет как Майкрософт удалось наследовать от интерфейса IList, и при этом скрыть его метод Add() ph34r.gif


Всем спасибо за ответы. Вопросы исчерпаны. Проблема решена.

Незачто, вот тебе линки по теме
http://en.wikipedia.org/wiki/Adapter_pattern - про паттерн адаптер
http://www.dofactory.com/Patterns/PatternAdapter.aspx - про адаптеры на .NET

--------------------
Master of Puppets, I'm pulling your strings, twisting your mind and smashing your dreams!
⠠⠵
 
       Top
DZUK
Posted: Mar 29 2009, 14:19

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

QUOTE (In the immortal words of DZUK, since Jan 6 2009, 19:55...)
В библиотеке .NET есть некий класс DataGridViewSelectedRowCollection, который реализует интерфейс IList. У интерфейса IList есть метод Add(object). НО, у DataGridViewSelectedRowCollection этого метода нету (вернее он private).

Вопрос номер один: как такое реализуется?

......

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

Случайно нарыл ответы на эти вопросы, если кому надо то делается так:

CODE


   interface IBase
   {
       void f(object obj);
   }
   class Derived: IBase
   {        
       void IBase.f(object obj) { }
       public void f(Derived obj) { }
   }
   class Test
   {
       public void test()
       {
           Derived obj = new Derived();
           obj.f(new Derived());//вызывается функция потомока f(Derived obj), Виден снаружи
           //obj.f(new object());//низя, ибо снаружи не видно
           ((IBase)obj).f(new object());//а так можно "вызывается" функция интерфейса f(object obj)
       }
   }



--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
19 replies since Jan 6 2009, 18:55 Track this topic | Email this topic | Print this topic

<< Back to Windows programming

 




Arminco Global Telecommunications