понедельник, 31 января 2011 г.

Delphi компонет StringGrid, событие onSelectCell

   Сегодня возник вопрос: Как узнать текущую выбранную строку в списке StringGrid. Это делается с помощью следующего кода:
StringGrid1.ARow 
   Теперь усложним задачу, у нас есть список StringGrid, в зависимости от выбранного элемента в StringGrid и соответственно значения в ячейке устанавливается соответствующий переключатель в RadioGroup. (Рис.1)
Рис.1 

 Решение: В компоненте StringGrid для события onSelectCell есть процедура обработки и установки переключателя в RadioGroup. Проблема в том что если кликать мышкой в списке StringGrid - все отлично работает и обрабатывается корректно. Если же перемещаться по списку с помощью курсора - событие onSelectCell наступает раньше, чем устанавливается значение в StringGrid1.ARow.
   Решение проблемы нашел на одном из зарубежных форумов. Для заметки привожу в своем блоге:
Устанавливаем свойство onRowSelect в false. Если вам нужно чтобы строка была выделенной - пишем на событие onDrawCell следующий код :
if gdFixed in State then Exit;
  if ARow=TStringGrid(Sender).Row then
  begin
    TStringGrid(Sender).canvas.Brush.color:=clBlue;
    TStringGrid(Sender).canvas.Font.Color:=clWhite;
    TStringGrid(Sender).canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,ARow])
  end
  else
  begin
    TStringGrid(Sender).canvas.Brush.color:=TStringGrid(Sender).Color;
    TStringGrid(Sender).canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,ARow])
end;
   Если нужно - можно изменить цвет отображения выделенной строки.
Теперь нам нужно дописать для компонента StringGrid на событие onSelectCell следующий код:
var
   SaveEvent:TSelectCellEvent;
begin
if ARow<>TStringGrid(Sender).Row then
begin
   SaveEvent:=TStringGrid(Sender).OnSelectCell;
   TStringGrid(Sender).OnSelectCell:=Nil;
   TStringGrid(Sender).Row:=ARow;
   CanSelect:=False;
   TStringGrid(Sender).Refresh;
   TStringGrid(Sender).OnSelectCell:=SaveEvent;
end;  

воскресенье, 30 января 2011 г.

Вирус Вконтакте Trojan-Downloader.HTML.Agent.si

   Проблема: Сегодня зашел Вконтакт и антивирус Касперского объявил мне что на сайте вирус, а именно:
http://vkontakte.ru/js/player.js?54 Opera Internet Browser Обнаружено: Trojan-Downloader.HTML.Agent.si.
Обнаружено: Trojan-Downloader.HTML.Agent.si Internet Explorer http://vkontakte.ru/js/player.js?53 
Анализируя описание - вирус скачивает всякую ерунду или другие вирусы с интернета.
Решение:
   На форумах пишут разное, от очистки кэша браузера до очистки папки Temp.
Но я скажу одно если при входе на сайт выскакивает сообщение что найден вирус - это значит что вирус на сервере, и если антивирус опознал его - значит он его блокировал. В данном случае решать трудно, поскольку антивирус начал выдавать сообщение только после обновления (ясно что добавлен какой то метод обработки вирусных скриптов или новые сигнатуры), старые версии ничего не показывали. Данное оповещение было при прослушивании музыки, с одной стороны все верно, я нажимаю кнопку чтобы прослушать музыка - песня загружается в кэш браузера, лишь только потом проигрывается в плеере. С другой стороны неясно что же они такого изменили в плеере или в обновлениях антивируса что антивирус начал распознавать код плеера как вирусный. Может все таки на сервер проник каким то боком вирус, в следствии чего мы и получили оповещение о вирусе, а может это просто ложная тревога. Так что остается только ждать, все решиться само собой, либо обновится антивирус и в обновление добавят исправления, либо обновят плеер в контакте.

вторник, 25 января 2011 г.

Delphi: Изменение цвета шрифта в StatusBar

   Сегодня возник вопрос по изменению цвета шрифта в StatusBar. Для решения данной проблемы нужно выполнить следующею последовательность действий:
  1. Переместить на форму StatusBar с закладки Win32
  2. Создать необходимое количество панелей (Кликаем правой кнопкой мыши на StatusBar-е и выбираем пункт меню Panels Editor...(Рис.1), после чего появится окно с помощью которого есть возможность управлять панелями, которые размещены на StatusBar (Рис.2)) 
Рис.1 

Рис. 2  
  1. Изменяем текст на панелях (Для этого выбираем в Panel Editor...(Рис. 2) из списка нужную панельку и изменяем свойство Text на нужный. Если нужно изменить цвет текста для панели - нужно установить свойство Style - psOwnerDraw (Рис. 3). Для примера я взял вторую панель с текстом  - "текст2") 
Рис. 3 
  1.  Переходим на StatusBar и в Object Inspector  создадим для него событие onDrawPanel.(Для создания события нужно кликнуть 2 раза напротив поля onDrawPanel)

Рис. 4
  1. Пишем код для события onDrawPanel:
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;const Rect: TRect);
begin
  if Panel = StatusBar.Panels[1] then
  begin
    StatusBar.Canvas.Font.Color := clRed;
    StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'тест 2')
  end
end;

Разберем код: Нумерация панелей начинается с "0", поскольку мы работаем с второй панелью - мы указываем StatusBar.Panels[1]. Если у нас нужная панель - изменяем цвет на красный (StatusBar.Canvas.Font.Color := clRed;) и выводим текст (StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'тест 2'))
 В результате мы получим StatusBar, в котором текст написан на второй панели окрашен в красный цвет. Результат можно просмотреть на Рис.5
  Рис.5

пятница, 21 января 2011 г.

Оболочка неожиданно завершила работу, и программа "explorer.exe" была перезапущена

    На ноутбуке установлена Windows Vista с последними обновлениями. После загрузки начал постоянно перезагружаться explorer . В журнале событий была запись следующего характера:
Оболочка неожиданно завершила работу, и программа "explorer.exe" была перезапущена
- System
- Provider
[ Name] Microsoft-Windows-Winlogon
[ Guid] {DBE9B383-7CF3-4331-91CC-A3CB16A3B538}
[ EventSourceName] Winlogon
- EventID 1002
[ Qualifiers] 16384
Version 0
Level 4
Task 0
Opcode 0
Keywords 0x80000000000000
- TimeCreated
[ SystemTime] 2010-12-18T08:51:05.000Z
EventRecordID 137080
Correlation
- Execution
[ ProcessID] 0
[ ThreadID] 0
Channel Application
Computer Nout
Security
- EventData
explorer.exe

   Немного поискав на форумах решение данной проблемы, решения как такового небыло, был стандартный набор решений типа: проверка на вирусы, откат системы..... Некоторые писали что у них такое случалось при установке новых драйверов на видеокарту (NVIDIA), если это так и вы устанавливали новые драйвера - нужно удалить (переименовать) файл с именем что то типа nvidea.cpl (имя может быть немного другое) который находится в [Диск:]\Windows\System32 
   Так и сделал. На некоторое время проблема ушла, но через неделю снова тоже самое. Начал экспериментировать выяснилось то что при разворачивании любого окна на весь экран explorer перестает перезагружаться. Решил что что то с темами рабочего стола (Windows Aero). Так и есть после того как зашел в "Свойства системы - Дополнительно - Параметры (Быстродействие) - Визуальные эффекты" выбрал пункт обеспечить наилучшее быстродействие (Рис.1 - снимок с Windows XP но практически суть та же) и нажал "Применить". После того как значения вступили в силу я снова выбрал эффекты которые мне надо и нажал кнопку "Применить". Проблема исчезает на недели две.
Рис. 1 

Application Error:Exception EZSQLException in module xxxxx.exe at 000D785E. SQL Error: Can't connect to MySQL server on 'localhost' (10061).

   Сегодня возникла проблема на другом компьютере (не на том что я разрабатывал программу). При запуске программы она должна считать настройки с файла, и осуществить подключение к базе данных (БД). Использую (Delphi7+ZEOS компоненты+MySQL). Все тривиально просто, но есть одно НО. При запуске на другом компьютере возникает следующая ошибка приложения: Исключение неизвестное программное исключение (0x0eedfade) в приложении по адресу 0x7c812aeb. (Рис.1)
Рис.1. 
   При нажатии "Отмена" - запускается отладчик, при нажатии "ОК" - появляется более конкретная ошибка (Application Error): Exception EZSQLException in module xxxxx.exe at 000D785E. SQL Error: Can't connect to MySQL server on 'localhost' (10061). (Рис.2.)
Рис. 2.
  РЕШЕНИЕ: Все дело в том что при тестировании программы я задал настройки для подключения к БД (для компонента ZConnection) и забыл их убрать. Ясно что у меня все работало, потому что подключалось к БД, которая стояла у меня на машине, а вот при запуске на других компьютерах появлялась ошибка когда программа делала попытку подключиться к несуществующему серверу и соответственно БД.