Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2014, 09:09   #1
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
По умолчанию Image ГИС

Всем привет. Надо сделать план местности. Кинул на форму ScrollBox. В него поместил Image. В него поместил большую картинку, чтобы края были за пределами. На картинке есть дома. Мне надо чтобы при наведении на определенный дом во втором Image выводилась фото этого дома. Решаю данную проблему через опу... кидаю на изображение на место дома другой Image и при наведении на него срабатывает событие... Но домов много и как мне кажется это не выход... Подскажите другой способ решения данной проблы пожалуйста.
demlan вне форума Ответить с цитированием
Старый 14.04.2014, 09:17   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Возможно, эта тема Вам что-нибудь подскажет: Создание электронного справочника ГИС.
Streletz вне форума Ответить с цитированием
Старый 15.04.2014, 09:16   #3
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
По умолчанию

Безымянный.jpg вот вид программы.
Код:
if (x>918) and (X<990) then
  begin
  if (y>2456) and (y<2512) then
    begin
    If LoadImage<>'Штаб тыла' then
       begin
       Image5.Picture.LoadFromFile('..\Foto\Тыл.jpg');
       LoadImage:='Штаб тыла';
       end else
         begin
         panel2.Visible:=FALSE;
         Image5.Picture.Create;
         Image5.Picture:= nil;;
         LoadImage:='';
         end;
      end;
    end;
написал это-вроде следит, но глючно очень.
понял саму концепцию-надо создать БД с координатами зданий и по перемещению курсора сверять с БД и при совпадении выводить картинку. но как это сделать ума не приложу....
demlan вне форума Ответить с цитированием
Старый 15.04.2014, 09:18   #4
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
По умолчанию

код на событии Image1MouseMove
demlan вне форума Ответить с цитированием
Старый 15.04.2014, 11:27   #5
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Вопрос

Цитата:
но как это сделать ума не приложу....
Что именно? БД?
Streletz вне форума Ответить с цитированием
Старый 15.04.2014, 11:58   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Координаты должны быть относительными, а не абсолютными, ибо стоит пользователю изменить размеры окна или двинуть и ползунки, все ваши абсолютные координаты посыпятся.

Выходомбудет не только БД но и вычисление координат объектов. А ещё лучше рисовать карту самостоятельно.
Человек_Борща вне форума Ответить с цитированием
Старый 17.04.2014, 05:22   #7
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
Вопрос

Написал этот код-
Код:
function TForm1.GetImageName(const X, Xmin, Xmax, Y, Ymin, Ymax: Integer): string;
begin
if (X in [Xmin..Xmax]) and (Y in [Ymin..Ymax]) then
    begin
    Result:= ADOTable1Foto.AsString ;
    end
  else
    Result:= '';
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
NewImageName: string;
begin
if ssleft in shift then // если нажата левая кнопка мыши, то...
begin
x1:=x; //запоминаем конечные координаты
y1:=y; //запоминаем конечные координаты
Scrollbox1.VertScrollBar.Position := Scrollbox1.VertScrollBar.Position + y0-y1;
Scrollbox1.HorzScrollBar.Position := Scrollbox1.HorzScrollBar.Position +x0-x1;
 end;
Label1.Caption := IntToStr(x);
Label2.Caption := IntToStr(y);
//ПЕРЕБОРКА СТРОК ТАБЛИЦЫ

with ADOTable1 do
begin First;
while not EOF do begin
NewImageName:= GetImageName(X,StrToInt(ADOTable1Xmin.Text),StrToInt(ADOTable1Xmax.Text),
 Y,StrToInt(ADOTable1Ymin.Text),StrToInt(ADOTable1Ymax.Text));
  if NewImageName = '' then
    begin
   Image5.Visible:= False;
   LoadImage:='';
    end
  else
    if NewImageName <> LoadImage then
      begin
        Image5.Visible:= True;
        Image5.Picture.LoadFromFile(NewImageName);
        LoadImage:= NewImageName;

 end; next;
 end;



end;

Label3.Caption := NewImageName;

end;
вот только по БД неправильно ищет. Только одно здание находит, которое первое в таблице. Подскажите как правильно цикл поставить..
demlan вне форума Ответить с цитированием
Старый 17.04.2014, 06:03   #8
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
По умолчанию

Изменил код функции на
Код:
function TForm1.GetImageName(const X, Xmin, Xmax, Y, Ymin, Ymax: Integer): string;
begin

if Result = '' then
if (X > Xmin) and (X < Xmax) and (Y > Ymin) and (Y < Ymax)
  then  begin
    Result:= ADOTable1Foto.AsString;
  end
  else
    Result:= '';
end;
стало все норм. Однако идет мерцание картинки при перемещении мышки по зданию. Посоветуйте, как убрать этот неприятный эффект?
demlan вне форума Ответить с цитированием
Старый 17.04.2014, 07:42   #9
demlan
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 15
По умолчанию

Все заработало как надо. Если кому пригодится, то вот:
Код:
function TForm1.GetImageName(const X, Xmin, Xmax, Y, Ymin, Ymax: Integer): string;
begin
if Result = '' then
if (X > Xmin) and (X < Xmax) and (Y > Ymin) and (Y < Ymax)
  then  begin
    Result:= ADOTable1Foto.AsString;
  end
  else
    Result:= '';
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
NewImageName: string;
begin
if ssleft in shift then // если нажата левая кнопка мыши, то...
  begin
   x1:=x; //запоминаем конечные координаты
   y1:=y; //запоминаем конечные координаты
   Scrollbox1.VertScrollBar.Position := Scrollbox1.VertScrollBar.Position + y0-y1;
   Scrollbox1.HorzScrollBar.Position := Scrollbox1.HorzScrollBar.Position +x0-x1;
  end;
Label1.Caption := IntToStr(x);
Label2.Caption := IntToStr(y);
//ПЕРЕБОРКА СТРОК ТАБЛИЦЫ
with ADOTable1 do
begin First;
while not EOF do begin
NewImageName:= GetImageName(X,StrToInt(ADOTable1Xmin.Text),StrToInt(ADOTable1Xmax.Text),
  Y,StrToInt(ADOTable1Ymin.Text),StrToInt(ADOTable1Ymax.Text));
  if Label3.Caption=NewImageName then
  begin
   if NewImageName = '' then
     begin
      Image5.Visible:= False;
      LoadImage:='';
     end
   else
     if NewImageName <> LoadImage then
       begin
         Image5.Visible:= True;
         Image5.Picture.LoadFromFile(NewImageName);
         LoadImage:= NewImageName;
       end;
     end;
next;
end;
end;
Label3.Caption := NewImageName;
end;
Дорогу осилит идущий. Пойду дальше... Всем удачи.
demlan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Базы данных ГИС nik 1191 БД в Delphi 2 29.03.2013 12:44
Модуль к ГИС ИнГЕО Lokomatoz Помощь студентам 0 25.05.2010 20:43
MapObject (ГИС-вьюер) olexa Общие вопросы Delphi 0 01.05.2009 20:13