Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.04.2014, 03:00
Demlan Demlan вне форума
Прохожий
 
Регистрация: 09.09.2011
Сообщения: 27
Репутация: 10
Сообщение БД и ГИС

Всем доброго времени суток, господа.
Может мой вопрос уже озвучивался где-то, но я не нашел ответ на него.... Если что приношу свои извинения...
Но переходу к делу: есть БД к которой находятся координаты зданий на карте (поля таблицы-Xmin, Xmax, Ymin, Ymax, Image, About).
Нужно при наведении мышки на определенное здание выводить фото и описание этого здания.
Код:
function TForm1.GetImageName(const X, Xmin, Xmax, Y, Ymin, Ymax: Integer): string;
begin

with ADOTable1 do
begin First;
while not EOF do begin
 if (X > Xmin) and (X < Xmax) and (Y > Ymin) and (Y < Ymax) then
    begin
    Result:= ADOTable1Foto.AsString ;
    end
  else
    Result:= '';
    next;
end;
end;

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var x2,y2: integer;
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);
//ПЕРЕБОРКА СТРОК ТАБЛИЦЫ


NewImageName:= GetImageName(X,StrToInt(ADOTable1Xmin.AsString),StrToInt(ADOTable1Xmax.AsString),
 Y,StrToInt(ADOTable1Ymin.AsString),StrToInt(ADOTable1Ymax.AsString));
  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;

Label3.Caption := NewImageName;

end;

Создал данный код, но работает некорректно. Реагирует только на перые координаты, а фото выводит последнее... Подскажите в чем ошибка.
Ответить с цитированием
  #2  
Старый 17.04.2014, 03:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Наверное правильней будет так условие по if подставлять
Код:
...
if (X in [Xmin..Xmax]) and (Y in [Ymin..Ymax]) then
...
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Demlan (17.04.2014)
  #3  
Старый 17.04.2014, 04:18
Demlan Demlan вне форума
Прохожий
 
Регистрация: 09.09.2011
Сообщения: 27
Репутация: 10
По умолчанию

Может и правильней, только вот результат все равно нулевой. Проблема в цикле по ходу. Не могу ее решить..

С этим
Код:
if (X > Xmin) and (X < Xmax) and (Y > Ymin) and (Y < Ymax)
хотя бы одно на одно здание реагировало.
А с этим
Код:
if (X in [Xmin..Xmax]) and (Y in [Ymin..Ymax]) then
перестало реагировать...

Изменил код функции на
Код:
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;
стало все норм. Однако идет мерцание картинки при перемещении мышки по зданию. Посоветуйте, как убрать этот неприятный эффект?

Все заработало как надо. Если кому пригодится, то вот:
Код:
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;
Отдельное спасибо Alegun.
Дорогу осилит идущий. Пойду дальше... Всем удачи.

Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 08:26.
Ответить с цитированием
  #4  
Старый 17.04.2014, 07:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
...перестало реагировать...
У вас условие что напр. X больше Xmin но меньше Xmax, так и я предложил тоже самое, просто в других выражениях, типа значение Х в диапазоне от Xmin до Xmax, проверил только что оба варианта - выполняются, но все же in надежнее


Смотрите что происходит в MouseMove - вероятно что-то тяжёлое повесили на перемещение, если высчитываете координаты или пытаетесь найти что-то в базе, то это слишком затратный процесс и его лучше выполнять на MouseDown, а на перемещении оставить только локацию (определение) возможного региона для обработки


З.Ы. Пока набирал текст - увидел последний пост, так оно и есть, на движухе всё самое тяжёлое висит, так могут быть глюки что не есть хорошо, пересмотрите вариант, будет ещё лучше
Ответить с цитированием
  #5  
Старый 17.04.2014, 15:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Alegun
Наверное правильней будет так условие по if подставлять
Код:
...
if (X in [Xmin..Xmax]) and (Y in [Ymin..Ymax]) then
...
Так к сожалению нельзя. Тип диапазон ограничен одним байтом.
Например вот такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := 1;
  b := 256;
  c := 300;
  if a in [b..c] then
    ShowMessageFmt('Число %d ВХОДИТ в диапазон %d..%d', [a, b, c])
  else
    ShowMessageFmt('Число %d НЕ ВХОДИТ в диапазон %d..%d', [a, b, c]);
end;
покажет сообщение "Число 1 ВХОДИТ в диапазон 256..300" хотя очевидно что это не так...
Ответить с цитированием
  #6  
Старый 17.04.2014, 17:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Точно, я просто на маленьком рисунке так края рамки отслеживаю чтоб её двигать, там работает (обидно, это ж теперь придётся код наново переписывать, а там его уже прилично накопилось), а здесь по всей видимости размеры рисунка намного больше чем 255, вот и глючит, виноват, у ТС прошу прощения, поленился и не проверил на "тяжёлых" режимах данное решение. Спасибо за науку bro poli-smen! ^)
Ответить с цитированием
  #7  
Старый 17.04.2014, 20:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Извините, я здесь допустил небольшую неточность.
У типа-диапазона конечно же нет никакого ограничения, например статический массив можно объявлять довольно больших размеров, а указанное ограничение имеется у типа-множества и оператор in работает именно с типом-множеством, хотя на вид кажется что это неограниченный тип-диапазон - вот такая пакость вшита в сам язык...
Я тоже выяснил это только через пару лет после того как начал изучать Delphi и потом лихорадочно пересматривал все свои проекты на наличие этого бага...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter