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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2009, 18:53   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Предотвращение отрицательной позиции.

Пишу программу с полной записью истории (позиция курсора каждую секунду + позиция формы на экране н/сек + много еще чего...) Проблема в том, что для удобства последующего считывания при записи в файл истории использую следующий код:
Код:
With FRMMain do
   Begin

    If   Left<10                   Then SX:='000'+IntToStr(Left);
    If ((Left<100)  And (Left>9))  Then SX:='00'+ IntToStr(Left);
    If ((Left<1000) And (Left>99)) Then SX:='0'+  IntToStr(Left);
    If   Left>999                  Then SX:=      IntToStr(Left);
    If   Top<10                    Then SY:='000'+IntToStr(Top);
    If ((Top<100)   And (Top>9))   Then SY:='00'+ IntToStr(Top);
    If ((Top<1000)  And (Top>99))  Then SY:='0'+  IntToStr(Top);
    If   Top>999                   Then SY:=      IntToStr(Top);
   End;
  If FileExists(CDir+'\A-HST\'+DateToStr(Date)+'\Position.aps') Then
    Begin
     AssignFile(F,CDir+'\A-HST\'+DateToStr(Date)+'\Position.aps');
     Append(F);
     Writeln(F,TimeToStr(Time)+' '+SX+' '+SY);
     CloseFile(F);
   End
  Else
   Begin
    AssignFile(F,CDir+'\A-HST\'+DateToStr(Date)+'\Position.aps');
    Rewrite(F);
    Writeln(F,TimeToStr(Time)+' '+SX+' '+SY);
    CloseFile(F);
   End;
Код прекрасно работает все бы ничего, но обнаружил один баг:
При нормальной позиции формы, т.е. когда координаты положительные записывается строго в столбик:
Код:
18:43:50 0192 0110
18:43:51 0570 0435
18:43:52 0596 0446
18:43:53 0503 0385
18:43:54 0344 0292
18:43:55 0585 0302
18:43:56 0662 0327
18:43:57 0662 0327
18:43:58 0662 0327
18:43:59 0662 0327
18:44:00 0662 0327
18:44:01 0465 0324
18:44:02 0215 0441
18:44:03 0153 0294
18:44:04 0143 0272
18:44:05 0138 0257
А при отрицательных координатах формы все сбивается и пишет откровенный бред:
Код:
18:44:06 000-34 000-225
Можно блокировать перетаскивание формы за пределы экрана? Или лучше будет усовершенствовать код?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.07.2009, 20:34   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Ну почему же бред? Как говориться: "чего написали, то и получили".
Если посмотреть внимательно строчку If Left<10 Then SX := '000' + IntToStr(Left);, то именно она и формирует строку: "000-34" (так же как и другая - if Top < 10 ...)

Код:
  SX := IntToStr(Abs(Left));
  if Left < 0 then
    SX := '-' + StringOfChar('0', 4-Length(SX)) + SX
  else
    SX := StringOfChar('0', 4-Length(SX)) + SX;
А вот этот код сформирует строку вида "0023" или "-0023". Если применить такой же код для свойства формы Top, то этого будет достаточно для записи любой позиции формы. И можно освободиться от остальных "if".

Последний раз редактировалось Karabash; 26.07.2009 в 20:57.
Karabash вне форума Ответить с цитированием
Старый 26.07.2009, 21:02   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Довольно-таки странно, что когда форма почти полностью была за пределами экрана он записал:
Код:
20:55:54 0000 0148
(И это с новым кодом) Может все-таки будет проще не пускать форму в минус? Хотя я себе это плохо представляю: если поставить таймер с интервалом 1 (то бишь 55 мс) он может не успеть прежде чем запишется координата с "-".



Все, это была моя ошибка - вместо SX написал S...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 26.07.2009 в 21:05.
Alex Cones вне форума Ответить с цитированием
Старый 27.07.2009, 11:17   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Alex Cones
Я бы такие записи разделял полями, например для удобства я использую формат CSV где каждое значение разделяю ";"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2009, 13:43   #5
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

А еще можно записывать базу
Zeraim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предотвращение ошибки Vladya Помощь студентам 5 02.06.2009 19:23
Вывод строки с опред. позиции Rekky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 13.05.2009 10:29
Перезапись файла в текущей позиции Андрей= Общие вопросы Delphi 2 08.05.2008 17:19
Показать элемент по указанной позиции. Fuckin_Princess Помощь студентам 8 07.12.2007 12:07
Вычисления номера позиции Stelix Паскаль, Turbo Pascal, PascalABC.NET 3 03.12.2007 03:05