tag:blogger.com,1999:blog-4008907788073251960.post7039450527080529484..comments2023-05-26T02:37:13.909-07:00Comments on Delphicoding: Delphi + ActiveX или ничего не понимаю!Кузан Дмитрийhttp://www.blogger.com/profile/08411855893021280519noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-4008907788073251960.post-87835251992660044902011-01-10T21:57:45.962-08:002011-01-10T21:57:45.962-08:00Найдено решение проблемы
http://deeptown12.blogspo...Найдено решение проблемы<br />http://deeptown12.blogspot.com/2011/01/mapwingis-delphi-activex.htmlКузан Дмитрийhttps://www.blogger.com/profile/08411855893021280519noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-61550973465640813362010-11-25T22:31:39.384-08:002010-11-25T22:31:39.384-08:00Это то понятно, но увы даже демо-примеры не проход...Это то понятно, но увы даже демо-примеры не проходят. То есть простейший пример<br /><br />var<br />sf: MapWinGIS_TLB.Shapefile;<br /><br />begin<br />sf := CoShapefile.Create();<br />sf.Open('c:\dev\data\dan.shp', nil);<br />Map1.AddLayer(sf, true);<br /><br />выдает ошибку в AddLayer. И это только в Delphi, как я и писал в C++ С# и VB такой код выполняется без проблем<br /><br />Мало того если код переделать так<br /><br />var<br />sf: MapWinGIS_TLB.TShapefile;<br /><br />begin<br />sf := TShapefile.Create(self); // Испольуется класс. а не интерфейс<br />sf.Open('c:\dev\data\dan.shp', nil);<br /><br />то тоже самое, Класс TShapefile это класс созданный Delphi при импортировании ocx.<br /><br />Спасибо за помощьКузан Дмитрийhttps://www.blogger.com/profile/08411855893021280519noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-31896510111925025202010-11-25T06:58:07.317-08:002010-11-25T06:58:07.317-08:00К сожалению на своей XE проверить не могу.
Примеры...К сожалению на своей XE проверить не могу.<br />Примеры-то проходят? С ShapeFile? Ведь зачем-то они в обоих примерах используют именно ShapeFile...<br />Поэтому у меня чисто интуитивно складывается ощущение что тут тот самый азбучный принцип "никогда не смешивать модель объекта и модель интерфейса".Unknownhttps://www.blogger.com/profile/03127012793536830998noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-82076864799266808562010-11-25T01:54:24.925-08:002010-11-25T01:54:24.925-08:00Да нет, в таком случае она будет уничтожена при вы...Да нет, в таком случае она будет уничтожена при выходе из процедуры, а код до выхода не выполняется.<br /><br />даже если sh перенести в класс, чтобы гарантировать неудаление, ошибка все равно остается.<br /><br />type<br /> TForm2 = class(TForm)<br /> Map1: TMap;<br /> OpenDialog1: TOpenDialog;<br /> procedure FormCreate(Sender: TObject);<br /> private<br /> { Private declarations }<br /> public<br /> { Public declarations }<br /> Sh : IShapefile;<br /> end;<br /><br />var<br /> Form2: TForm2;<br /><br />implementation<br /><br />{$R *.dfm}<br /><br />procedure TForm2.FormCreate(Sender: TObject);<br />begin<br /> Sh := CoShapefile.Create;<br /> IF OpenDialog1.Execute then<br /> begin<br /> if not Sh.Open(OpenDialog1.FileName, nil) then<br /> ShowMessage('err!');<br /> try<br /> Map1.AddLayer(sh,true);<br /> Map1.ZoomToMaxExtents;<br /> except<br /> On E:Exception do<br /> ShowMessage(E.Message);<br /> end;<br /> end;<br />end;<br /><br />end.Кузан Дмитрийhttps://www.blogger.com/profile/08411855893021280519noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-52461226869386310562010-11-24T21:44:39.868-08:002010-11-24T21:44:39.868-08:00И все же обратите внимание на то, что в примерах, ...И все же обратите внимание на то, что в примерах, которые можно скачать на сайте, везде используется подход вроде<br /><br />var<br /> sf: MapWinGIS_TLB.Shapefile;<br /><br />begin<br /> sf := CoShapefile.Create();<br /> sf.Open('c:\dev\data\dan.shp', nil);<br /> Map1.AddLayer(sf, true);<br /><br />Как мне кажется, в вашем варианте после Sh.Open объект Sh будет автоматически уничтожен... Из-за автоматического подсчета ссылок.Unknownhttps://www.blogger.com/profile/03127012793536830998noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-57244507917908396312010-11-23T23:43:36.036-08:002010-11-23T23:43:36.036-08:00В том то и дело что Shapefile = IShapefile, то ест...В том то и дело что Shapefile = IShapefile, то есть в AddLayer передается интерфейс. Но почему то в Delphi выходит ошибка EZeroDivide а в других языках программирования ее и нет. И это для меня увы большая загадка. Ну и разочарование конечно, так как MapWinGis довольно мощный OpenSource компонент для поддержки картКузан Дмитрийhttps://www.blogger.com/profile/08411855893021280519noreply@blogger.comtag:blogger.com,1999:blog-4008907788073251960.post-33832877667774429282010-11-23T07:40:02.162-08:002010-11-23T07:40:02.162-08:00Судя по примеру Sh должно быть типа ShapefileСудя по примеру Sh должно быть типа ShapefileUnknownhttps://www.blogger.com/profile/03127012793536830998noreply@blogger.com