пятница, 9 сентября 2011 г.

Ошибка: The number of items cannot be greater than 64, if the EditValueFormat is cvfInteger

Инструментарий: Delphi XEDevExpress
Ошибка: The number of items cannot be greater than 64, if the EditValueFormat is cvfInteger
Использую компоненты DevExpress в частности TcxCheckListBox. Данные для заполнения CheckListBox беру с базы данных. При заполнении выскакивает ошибка
The number of items cannot be greater than 64, if the EditValueFormat is cvfInteger
   Данная проблема появляется и в TcxGrid при кастомизации колонок. Если количество колонок превышает 64. И в рантайме при отключении/включении некоторых колонок - путем нажатия на кнопку ColumnQuickCustomization, тоже выскакивает сообщение:
The number of items cannot be greater than 64, if the EditValueFormat is cvfInteger. 
 

четверг, 8 сентября 2011 г.

ASP Часть 1: Установка IIS на Windows XP Pro

   Поскольку появилась необходимость учить ASP, для полной идиллии взялся устанавливать IIS, и параллельно решил описать все действия в блоге в виде небольших заметок
   Для установки IIS на Microsoft Windows XP Pro нам нужно выполнить следующие шаги:

  1. По умолчанию IIS есть в стандартном наборе компонент в Windows XP Pro (на счет других версий не знаю), но его нужно включить в "установке компонент". Для того чтобы включить IIS нужно перейти "Пуск" - "Панель управления" - "Установка и удаление программ"-"Установка компонентов Windows". После чего откроется "мастер компонентов Windows".
  2. Дальше в списке должна быть запись "Internet Information Service (IIS)", напротив нее ставим галочку, для того чтобы активировать данный элемент. В случае если Вам необходимо включить дополнительные компоненты, которые могут использоваться с IIS - можете нажать кнопку "Состав..." и отключить или включить нужные наборы компонент.
  3. После отметки нужных компонент нажимаем кнопку "Далее".
  4. Ставим диск с Windows и ждем завершения установки. После завершения нажимаем "Готово"
  5. Можно попробовать перейти в браузере по адресу http://localhost для проверки работоспособности IIS
  6. Web директория по умолчанию располагается в "C:\Inetpub\wwroot", но если вы не хотите переписать (или удалять) IIS документацию, которая находится в данной директории, Вы можете создать виртуальную директорию, в которой будет размещаться Ваш сайт. Это и многое другое будет описано в последующих статьях.


Автор:

вторник, 6 сентября 2011 г.

Как удалить Денвер (Denver)

  Вот недавно появилась необходимость удалить Денвер. Зашел в установку и удаление программ - ничего не обнаружил. Оказывается данный комплекс полностью автономен и потому его нужно удалить вручную. Поэтому для того чтобы удалить Денвер достаточно выполнить следующую последовательность действий:

  1. Остановить Денвер запустив соответствующий ярлык на рабочем столе.
  2. Если при установке Денвера был создан виртуальный диск, его можно отключиться следующим образом: "Пуск" - "Выполнить..." (Или комбинация клавиш Win+R) и указать команду для выполнения: subst [Диск]: /D, где [Диск] - имя созданного Денвером виртуального диска (по умолчанию Z:) 
  3. Удаляем папку, в которую устанавливали Денвер (По умолчанию єто C:\WebServers)
  4. Удаляем ярлыки Денвера с автозагрузки "Пуск" - "Все программы" - "Автозагрузка"
  5. И наконец удаляем ярлыки Денвера с рабочего стола

PS: Если перед удалением Денвера не завершили корректно его работу (перезагрузившись или с помощью ярлыка остановки), то, скорее всего, Вам нужно будет вручную откорректировать файл в котором сохранены имена хостов С:\WINDOWS\system32\drivers\etc\hosts (в Windows NT/2000/XP/2003) или C:\WINDOWS\hosts (в WIndows 9x или Me)удалив их, чтобы адреса test1.ru и test2.ru перестали ссылаться на локальную машину, а ссылались в Интернет. 

Автор:

пятница, 19 августа 2011 г.

FastReport пропал Object Inspector (Инспектор F11), как восстановить Object Inspector

Инструментарий: FastReport
Описание: Сегодня закрыл инспектор объектов в FastReport, а восстановить никак не удавалось, ни через меню "Вид - Панель инструментов - Инспектор" ни при нажатии кнопки F11
Решение: В FastReport есть полезная функция - восстановление настроек по умолчанию. Для этого нужно зайти в меню "Вид - Настройки..." и нажать в нижнем левом углу - "Восстановить настройки"
Автор:

вторник, 9 августа 2011 г.

FastReport: Class TfrxBarCodeView not found

Инструментарий: FastReport, Embarcadero Rad Studio XE
Описание: Есть шаблон отчета, в котом уже сформировано некоторое количество колонок (шаблон рабочий). Возникла необходимость добавить в шаблон штрих-код. В дизайнере шаблонаов FastReport добавил BarCode, после чего необходимым образом настроил его. Шаблон сохранился без проблем. Но, после того как запустил программу и нажал кнопку отображения отчета появилось сообщение об ошибке со следующим содержимым:
 Class TfrxBarCodeView not found
Решение: Решений есть несколько, но суть одна.
  1. Добавить в раздел uses формы frxBarcode;
  2. Переместить на форму компонент TfrxBarCodeObject
PS: После того как выполнил первый вариант - ошибка не появлялась.
Автор:

понедельник, 8 августа 2011 г.

MySQL: #42000 Can't find any matching row in the user table

Инструментарий: MySQL, Toad for MySQL
Описание: При изменение привилегий пользователю в MySQL выскакивает сообщение:
 #42000 Can't find any matching row in the user table
Решение: Оказывается начиная с версии MySQL 5.0.2 пользователь без пароль автоматически не создаются. Изменить данную опцию можно несколькими способами:

  1. Изменить в файле my.ini настройки, но не всегда есть возможность настраивать сервер или изменять файлу my.ini 
  2. Добавить к запросу IDENTIFIED BY "пароль"
Автор:

пятница, 5 августа 2011 г.

MySQL: Вызов хранимых функций (Unknown column 'xxx' in 'field list')

Инструментарий: MySQL;  TOAD for MySQL 5.0 и Navicat
В общем хранимые процедуры и функции это большой раздел в котором очень много нюансов как при работе, так и при написании. Я написал некую функцию которая возвращала текущего пользователя, но это не столь важно, суть в том что функцию нужно вызвать. Синтаксис вызова функции следующий:
 SELECT <Название функции>
Конечно же написал в соответствии с синтаксисом свой запрос на вызов функции:
SELECT    GetUserID;  
 В результате выполнения получил сообщение об ошибке:
Результат выполнения Navicat:
  • [SQL] select GetUserID;

[Err] 1054 - Unknown column 'GetUserID' in 'field list'

  • Результат выполнения  TOAD for MySQL
MySQL Database Error: Unknown column 'GetUserID' in 'field list' 1 0

Инструментарий разный, но суть та же, не найдена колонка.
Решение:Оказывается для решения проблемы нужно добавить скобки. В результате наш запрос примет следующий вид:
SELECT    GetUserID();  

 P.S. Казалось что такого, но без скобок название видимо рассматривается как некое поле. В моем случае были опущены скобки, поскольку функция не принимала входных параметров.

Автор:

MySQL: При выполнении ALTER TABLE ошибка [Err] 1005 Can't create table...(errno: 121)

Инструментарий: MySQL, Navicat
Описание: Есть две таблицы tbl_category и tbl_user, которые нужно связать по полях  tbl_category.user_id и  tbl_user.id. Для этого выполняем запрос:
ALTER TABLE tbl_category ADD CONSTRAINT fk_category_user FOREIGN KEY (user_id) REFERENCES tbl_user (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
Результат: При выполнении запроса в Navicat получаем сообщение об ошибке:
[Err] 1005 - Can't create table 'ibox.#sql-17d8_1' (errno: 121)

Решение: Сравнил поля двух таблиц, в обоих таблицах поля int(11), но все дело в значении поля -  unsigned. В таблице  tbl_user.id (unsigned), а  tbl_category.user_id  unsigned не установлено. После установки полю tbl_category.user_id - unsigned все заработало.

Автор:

среда, 20 июля 2011 г.

Delphi 2006: Debugger Kernel BORDBK100.DLL or BORDBK100N.DLL is missing or could not be loaded

  Была установлена Delphi 2006 - все работало прекрасно, установил Delphi 2010. Проект в Delphi 2006 открывается нормально, но когда запускаю отладку - выскакивает ошибка:
Debugger Kernel BORDBK100.DLL or BORDBK100N.DLL is missing or could not be loaded.

  Решение: запустить указанные файлы как службу BORDBK100.DLL, BORDBK100N.DLL с помощью команд:
regsvr32 BORDBK100.DLL
regsvr32 BORDBK100N.DLL


Автор:

вторник, 19 июля 2011 г.

Как в Delphi XE вручную импортировать файл с лицензией (*.slip)

   Возникла ситуация в которой нужно разместить вручную файл лицензии (*.slip) для Delphi XE. Файлы лицензии для Delphi XE обычно хранятся в папке %AllUsersProfile%\Application Data\Embarcadero или в [Диск]:\Program Files\Embarcadero\RAD Studio\8.0\License\ (каталог установленного продукта).
  Для ручной установки лицензии нужно скопировать файл лицензии (RADStudioXE_license.slip) в одну из папок.

Автор:

вторник, 12 июля 2011 г.

Oracle ошибка: ORA-28000: the account is locked

Ошибка: ORA-28000: the account is locked
Описание: Скорее всего пользователь ввел неверный пароль максимальное количество раз, которое указано в профиле пользователя. Параметр FAILED_LOGIN_ATTEMPTS или пользователь был заблокирован DBA.
Решение: Ждем PASSWORD_LOCK_TIME или начинаем действовать, если конечно у вас есть права DBA. 

Источник: mirsovetov.net
  1. Запускаем командную строку и пишем: sqlplus \sys as sysdba;
  2. Вводим пароль (по умолчанию для логина sys пароль sys)
  3. alter user [USER NAME] account unlock; где  [USER NAME] - Имя заблокированного пользователя
  4. Пробуем подключится.

понедельник, 6 июня 2011 г.

Как добавить кнопку +1 от Google на свой блог (blogspot.com)

Для того чтобы добавить кнопку +1 от Google нужно:
  1. Перейти на страницу получения кода кнопки.
  2. Настроить параметры кнопки
  3. Скопировать текст, который сформировался в результате настроек, у меня он следующий:

<’script src="http://apis.google.com/js/plusone.j’s" type="text/javascript">
{lang: 'ru'}

Делаем все согласно инструкции. Открывает Дизайн блога для изменения шаблона:
  1. Панель инструментов ->  Дизайн -> Изменить HTML, и устанавливаем галочку " Расширить шаблоны виджета" - для отображения всего шаблона.
  2. Ищем тег и перед ним вставим код скрипта:  <’script src="http://apis.google.com/js/plusone.j_s" type="text/javascript_">
    {lang: 'ru'}
    <_/_s_c_r_i_p_t>
  3. Если вы хотите чтобы кнопка была в верхней части статьи тогда ищем
    < strong="">class='post-header-line'/> и вставляем после этого тега - тег кнопки
  4. Сохраняем шаблон и любуемся кнопкой +1 на своем блоге 
PS: В некоторых участках кода изменил теги, добавив знаки ’ и _. Для отображения на блоге кода =)

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

Установка компонента QuickReport на Delphi 7

   QuickReport идет в поставке Delphi 7, но по умолчанию его нет в палитре компонентов. Для добавления  QuickReport  в палитру компонент нужно выполнить следующую последовательность действий:
  1. В главном меню Delphi 7 выбрать пункт меню Component -> Install Packages...
  2. Откроется окно управления загружаемыми пакетами. В нем нужно нажать кнопку Add... Для добавления нового пакета.
  3. Откроется окно выбора файлов. В данном окне нужно перейти в папку куда была установлена Delphi (за частую это С:\Program Files\Borland\Delphi7\) и открыть папку Bin. 
  4. В окне выбора файлов установим "Тип файлов" в Package library.bpl 
  5. Выберем пакет с именем dclqrt70.bpl и нажмем кнопку Открыть для подтверждения выбора, после чего в списке установленных пакетов добавится QuickReport Components
  6. Нажимаем ОК для закрытия окно.
  7. Тестирование: Создаем новый проект и тестируем работоспособность.

четверг, 26 мая 2011 г.

MySQL ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

Инструментарий: MySQL Server, Navicat
Описание: Нужно было связать две таблицы (Если ограничение установлено, то такая же ошибка возникает при редактировании/вводе новых данных). При создании Foreign Keys и установке свойств On Delete, On Update = CASCADE, получил в ответ следующее сообщение:
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`xxx`, CONSTRAINT `fk_xxx` FOREIGN KEY (`xxx`) REFERENCES `xxx` (`xxx`))

Решение: После анализа оказалось что у меня данные с дочерней таблицы ссылаются на несуществующие данные с главной таблицы. После редактирования данных все заработало. Пример:
Table1 (родительсткая)
id Name
1 тест 1
2 тест 2

Table2 (дочерняя)
id idParent Name
1  5              тест 5.1
2 1               тест 1.1
В Table2 первая запись ссылается на записи которых нет в Table1.

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

Эффективная реклама на сегодняшний день - банерные сети

   На сегодняшний день самым популярным и эффективным способом размещения рекламы в интернете есть - банерные сети. Яркие графические или мультимедийные банеры наиболее эффективно решают задачу формирования представления о имидже, повышают как узнаваемость бренда так и обеспечивают запоминаемость.
   Преимущества банерной сети в том что в них существует строгое управление тематикой и гибкость отображения. Вы сможете настроить таргетинг и показать банеры только определенной категории пользователей.
Для того чтобы принять участие в банерной сети обращайтесь к партнерам

Delphi: установка MyDAC v5 (Data Access Components for MySQL)

   Инструкция установки компонента MyDAC v5 на Delphi и C++Builder для Win32, Delphi для .NET, Kylix находится в архиве с компонентами. Для себя и для тех, у которых возникли вопросы при установке описываю весь процесс с самого начала. Ниже приведен пример установки с использованием IDE. Я использую Delphi 2010 и MyDAC v5.90.0.57.
   Запустить IDE и выполнить следующие шаги:
  1. Для начала определимся какую сборку будем использовать для работы, поскольку я работаю с Delphi 2010 я буду работать с папкой  Source\Delphi14  (Для Delphi 7 будет соответствующая папка - Source\Delphi7) В дальнейшем обозначим версию под ХХ ( Source\DelphiXX)
  2. Соберем все проекты воедино. Для этого откроем первый нужный нам пакет,  dacXX.dpk
  3. Добавим следующие пакеты, которые находятся в папке Source\DelphiXX, для этого нужно выбрать Project -> Add Exesting Project... в результате чего будет отображено окно выбора нового проекта. После добавления список должен состоять из следующих пакетов (dacХХ.dpk, dacvclXX.dpk, dcldacXX.dpk, dclmydacXX.dpk, dclmysqlmonXX.dpk, mydacXX.dpk, mydacvclXX.dpk, mysqlmonXX.dpk)
  4. Дальше компилируем проект (Project->Compile All Projects). У меня прервалась компиляция из за того, что файл Dac.inc не был найден. Файл Dac.inc находится в папке  Source. Я его и все файлы с расширением *.inc скопировал в папку Source\Design, после чего снова выполнил компиляцию - все удачно скомпилировалось. Правда при компиляции mysqlmonXX, которое информирует о том что нужно скачать SQLBuilder for MySQL Add-in Нажимаем кнопку скачать и после скачивания устанавливаем.
  5.  Для всех пакетов кроме  dacХХ.dpk и mydacXX.dpk выполнил инсталяцию. (Выбираем в менеджере проекта соответствующий проект и кликаем правой кнопкой мыши, после чего в меню выбираем Install)
  6. После всех операций закрываем все и сохраняем (Project Group 1 можно не сохранять) (для закрытия всех проектов нужно выбрать File->Close All)
  7. Дальше добавим пути для дальнейшей корректной работы. Орываем пункт меню "Tools -> Options -> Evironment Options -> Delphi Options -> Library -> Win 32" (Для Delphi 7 другие пункты меню Tools -> Evironment Options -> Library) и напротив пункта Library Path: нажимаем кнопкуиз тремя точками, появится окно в котором нужно выбрать путь к следующей папке \Source\. После выбора нужно нажать кнопку ADD для добавления пути. 
  8. Все, установка и настройка закончена. Для проверки создаем тестовую программу.  
PS. Ясно что форс мажорные обстоятельства были и будет, но у меня прошло все почти без лишних проблем.

Ниже привожу оригинальный текст установки, описанный в документации, которая находится с компонентами  MyDAC v5.90.0.57:

Data Access Components for MySQL Source Code Copyright 1997-2010, Devart. All Rights Reserved

There are two ways to compile and install MyDAC for Windows manually.

I. Using IDE
  Delphi and C++Builder for Win32
  --------------------------------
  Run your IDE and walk through the folowing steps:
    1) Compile DAC run-time package (dacXX.dpk)
    2) For Delphi 6 and higher compile DAC GUI related package (dacvclXX.dpk)
    3) Compile DAC design-time package (dcldacXX.dpk)
    4) Compile MyDAC run-time package (mydacXX.dpk)
    5) For Delphi 6 and higher compile MyDAC GUI related package (mydacvclXX.dpk)
    If you are going to create CLX applications compile MydacClx.pas unit separately.
    6) Compile and install MyDAC design-time package (dclmydacXX.dpk)

  You can find these packages in
     Source\Delphi5\*.dpk - for Delphi 5
     Source\CBuilder5\*.bpk - for C++ Builder 5
     Source\Delphi6\*.dpk - for Delphi 6
     Source\CBuilder6\*.bpk - for C++ Builder 6
     Source\Delphi7\*.dpk - for Delphi 7
     Source\Delphi9\*.dpk - for Delphi 2005
     Source\Delphi10\*.dpk - for BDS 2006
     Source\Delphi11\*.dpk - for RAD Studio 2007
     Source\Delphi12\*.dpk - for RAD Studio 2009
     Source\Delphi14\*.dpk - for RAD Studio 2010

  To compile MyDAC based applications, add MyDAC Source directory path to the "Library Path".

  Delphi for .NET
  ------------------------
  Run your IDE and walk through the folowing steps:     1) Compile DAC run-time package (Devart.Dac.dpk)
     2) Compile DAC design-time package (Devart.Dac.Design.dpk)
     3) Compile MyDAC run-time package (Devart.MyDac.dpk)
     4) Compile MyDAC run-time package (Devart.MyDac.AdoNet.dpk)
     5) Compile and install MyDAC design-time package (Devart.MyDac.Design.dpk)
     6) Specify the path to compiled assembles in "Assembly Search Paths"
     7) To register the MyDataAdapter component in Delphi for .Net Tool Palette, follow these steps:
        - Open Delphi for .Net and go to the "Tool Palette" window;
        - Add "MyDAC" category using popup menu;
        - Select "Installed .NET Components..." from popup menu;
        - Go to the "Installed .NET Components" tab within opened dialog;
        - Check the MyDataAdapter component;
        - Press the OK button.

  You can find these packages in
     Source\Delphi9\*.dpk - for Delphi 2005
     Source\Delphi10\*.dpk - for BDS 2006
     Source\Delphi11\*.dpk - for RAD Studio 2007

   To compile MyDAC based applications, add Devart.Dac and Devart.Mydac to Namespace prefixes, add MyDAC Source directory path to the "Library Path" list.

   Kylix
   ----------------------------
   Run your Kylix IDE and walk the through folowing steps:
      1) Compile DAC run-time package (dacX.dpk)
      2) Compile DAC GUI related package (dacclxX.dpk)
      3) Compile DAC design-time package (dcldacX.dpk)
      4) Compile MyDAC run-time package (mydacX.dpk)
      5) Compile MyDAC GUI related package (mydacclxX.dpk)
      6) Compile and install MyDAC design-time package (dclmydacX.dpk)

  You can find these packages in
     Source\Kylix2\*.dpk     Source\Kylix3\Delphi\*.dpk

II. Using make-files
  Delphi and C++Builder for Win32
  --------------------------------   
    1) Go to one of the following folders (let's denote this folder %MakePath%):
       Source\Delphi5\*.dpk - for Delphi 5
       Source\CBuilder5\*.bpk - for C++ Builder 5
       Source\Delphi6\*.dpk - for Delphi 6
       Source\CBuilder6\*.bpk - for C++ Builder 6
       Source\Delphi7\*.dpk - for Delphi 7
       Source\Delphi9\*.dpk - for Delphi 2005
       Source\Delphi10\*.dpk - for BDS 2006
       Source\Delphi11\*.dpk - for RAD Studio 2007
       Source\Delphi12\*.dpk - for RAD Studio 2009
       Source\Delphi14\*.dpk - for RAD Studio 2010

    2) Find in the 'make.bat' line containing set IdeDir="D:\Program Files\Borland\Delphi7  and make sure that correct path to IDE is set (always include forward quote and do not include ending quote)   
    3) Run 'Make.bat'. Binaries will be copied to the %MakePath%\Mydac subfolder   
    4) Copy %MakePath%\Mydac\*.bpl files to a folder that is included in the PATH environment variable
    5) Run IDE and add dclmydacXX.bpl via Component->Install Packages... menu
    6) To compile MyDAC based applications, add MyDAC Source directory path to the "Library Path" list

  Delphi for .NET
  -----------------
  1) Go to the following folders (let's denote this folder %MakePath%):
      Source\Delphi9\*.dpk - for Delphi 2005
      Source\Delphi10\*.dpk - for BDS 2006
      Source\Delphi11\*.dpk - for RAD Studio 2007

   2) Find in the 'Make.bat' line containing set IdeDir="D:\Program Files\Borland\BDS\4.0  and make sure that correct path to IDE is set (always include forward quote and do not include ending quote)
   3) Run 'Make.bat'. Binaries will be copied to the %MakePath%\Mydac subfolder
   4) Run IDE and add Devart.Mydac.Design.dll via Component->Installed .NET Components->.NET VCL Components->Add... menu. Specify the path to compiled assembles in Component->Assembly Search Paths->Add... menu
   5) To register the MyDataAdapter component in Delphi for .Net Tool Palette, follow these steps:
        - Open Delphi for .Net and go to the "Tool Palette" window;
        - Add "MyDAC" category using popup menu;
       - Select "Installed .NET Components..." from popup menu;
       - Go to the "Installed .NET Components" tab within opened dialog;
       - Press "Select an Assembly" and choose Devart.Mydac.AdoNet.dll;
       - Check the MyDataAdapter component;
       - Press the OK button.
  6) To compile MyDAC based applications, add Devart.Dac and Devart.Mydac to Tools->Options->Environment Options->Delphi Options->Library->  Namespace prefixes

пятница, 29 апреля 2011 г.

Delphi: Секретная комбинация клавиш или "Пасхальное яйцо" - Часть 2

  В предыдущей статье секретная комбинация клавиш или "Пасхольное яйцо"  я описывал как можно управлять компонентами с помощью секретной комбинации клавиш, и для примера использовал запуск отладочного режима при котором отображается дополнительный функционал. Продолжая цикл заметок в этом направлении я попытаюсь описать как можно задать некие отладочные (настроечные) параметры при старте программы. Параметры будут задаваться следующего вида Project.exe -deb.  Для запуска программы отдельно можно создать ярлык с уже заданными параметрами запуска. И так, приступим.
Откроем к примеру предыдущий проект, или создадим новый. В разделе var добавим переменную DEBUGON, которой по умолчанию присвоем значение false
var
  Form1: TForm1;
  DEBUGON:Boolean = false;

   Следующим шагом будет написание процедуры, которая делает перебор всех входных параметров и устанавливает соответствующие значения (процедуру пишем у разделе implementation):

procedure StartInit; // добавляем для глобальной видимости
var
  Form1: TForm1;
  DEBUGON:Boolean = false;

implementation
{$R *.dfm}

procedure StartInit;
  const
    SDebugOn = '-deb';
  var
    I: Integer;
begin
  for I := 0 to ParamCount do
    if ParamStr(I) = SDebugOn  then
      DEBUGON:=true;
end;
  Проверяем в цыклом от 0 до количества параметров все входные параметры.  Кстати первый параметр с индексом 0 будет путь к программе, и ее названием. Если у нас параметр совпадает с константой SDebugOn, то есть имеет значение -deb - тогда переменная DEBUGON = true.
  Дальше нам нужно вызвать данную процедуру при запуске проекта и перед созданием форм. Для этого нужно в главном меню выбрать Project - View Source. В результате откроется исходный код проекта. Вставим вызов нашей процедуры после инициализации и перед созданием форм. У меня код выглядит следующим образом:
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  StartInit;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
   Двигаемся дальше. Переходим на форму и создаем обработчик события на onCreate (два раза кликаем на пустое поле напротив названия onCreate в Object Inspector - Events) и пишем следующий код:
    Panel1.Visible:= DEBUGON;

  Если у нас переменная установлена, тогда задействуем некие параметры, в данном случае делаем видимой или нет Panel1 в зависимости от параметра DEBUGON.
  Практически все, теперь можно протестировать наше приложение на работоспособность запустив его с параметром -deb и без него. Для запуска программы с параметром можно воспользоваться средствами Delphi, для этого нужно зайти в Run-Parameters и написать в поле Parameters наше отладочное -deb. Пожалуй все, теперь можно опять протестировать и увидеть результат.

Delphi: Секретная комбинация клавиш или "Пасхольное яйцо" - Часть 1

   Бывают ситуации что нужно сделать в программе некий скрытый режим, при котором были доступны какие либо действия. Либо это так называемые "пасхальный яйца" либо какой то специальный режим, к примеру режим отладки, при котором будет доступна какая то панель, в которую мы можем выводить статус работы программы с внутренними параметрами.
   Приведу один из способов. Пример буду приводить на неком новом проекте, чтобы не было ничего лишнего. И так приступим.
   Создадим новый проект в Delphi (При написании статьи я использовал Delphi 2010). File - New - VCL Forms Application . (Рис.1)

 Рис.1.
  Создастся новый проект. Кликаем левой кнопкой мыши на форму и переходим в Object Inspector на закладку Properies, для того чтобы изменить свойство KeyPreview на True. Это свойство определяет будет ли форма обрабатывать события клавиатуры, прежде чем эти события обработаются элементом управления на котором был установлен фокус. В итоге нам нужно будет описать обработчик нажатия клавиш только для формы. Что мы собственно сейчас и сделаем. В переходим в Object Inspector на закладку Events, и в создадим обработчик события на onKeyDown для этого нужно два раза кликнуть левой кнопкой мыши напротив надписи onKeyDown. После создания события - мы переходи в Code Editor  для написания кода. Я заранее определился какая комбинация клавиш будет служить для запуска режима отладки - это Ctrl+Shift+D.Пишем следующий код:
  if (ssCtrl in Shift) AND (ssShift in Shift) AND (Key = Ord('D')) then
      begin
        // код обработки
      end
  Код думаю понятен, если у нас нажата кнопка Ctrl и Shift и D - тогда выполняется какой то заранее подготовленный код. К примеру разместим на форме панель (Panel1 и установим параметр Visible=false в Object Inspector - Properties), а на панели еще какие то компоненты. и к секции begin ... end вышеописанного кода напишем код для скрытия/отображения панели. Весь код представлен ниже:
  if (ssCtrl in Shift) AND (ssShift in Shift) AND (Key = Ord('D')) then
      begin
        Panel1.Visible:= not Panel1.Visible;
      end;
  Все готово.Запись Panel1.Visible:= not Panel1.Visible; означает что при выполнении кода параметр Visible будет принимать противоположное значение. Теперь можно запускать проект для тестирования. После запуска у нас не будет видна панель, поскольку мы установили свойство Visible = false (Рис.2), но при нажатии комбинаций клавиш Ctrl+Shift+D - панель отобразится (Рис.3)


Рис.2

Рис.3
   Вот собственно и все. В следующем описании рассмотрим как можно задать некие отладочные (настроечные) параметры при старте программы. Вида Project.exe -deb

вторник, 5 апреля 2011 г.

UPDATE command denied to user 'xxxx'@'IP' for table

   При осуществлении каких либо операций с таблицей (редактирование, добавление, удаление данных) возникает окно с сообщением:
Рис.1 

   Текст сообщения следующий: Ошибка возвращения idSQL Error: UPDATE command denied to user 'user'@'192.168.0.1' for table 'tablename'.
   С данного сообщения можно узнать причину невыполнения нашей команды, а именно: UPDATE command denie. В данном случае я пытался обновить данные в таблице, к которой у меня закрыт доступ.
   РЕШЕНИЕ: Открыть доступ пользователю (назначить соответствующие права на выбор, удаление, редактирование... данных), под которым вы хотите делать какие либо изменения.
   После того как я открыл пользователю возможность редактирования записей в БД - все заработало.

вторник, 1 марта 2011 г.

Delphi MySQL проблемы с русской кодировкой (Кириллицей)

   Если возникают проблемы с кодировкой при обращении к MYSQL серверу необходимо выполнить следующие действия:

  1. Проверить стоит или нет правильная кодировка в таблицах MySQL Server (она должна быть установлена cp1251(укр.) или cp1252(рус.))  
  2. После подключения к MySQL Server необходимо выполнить запрос:

если установлена кодировка cp1251, тогда:
SET NAMES ''cp1251''
иначе, если нужна кодировка cp1252
SET NAMES ''cp1252''


Конфликт uTorrent 2 и Kaspersky Internet Security 2011

   После выхода статьи Конфликт uTorrent 2.0 и Kaspersky Internet Security (KIS) в которой я описал настройку KIS 8 (2009) пришло не мало запросов о настройке KIS 2011. Проблемы решаются те же:
  • При добавлении новой закачки - компьютер начинал жутко тормозить.
   Перейдем сразу к настройке. В процессе настройки использовал следующие средства: uTorrent 2 и KIS 11 (KIS 2011)):
  • Открываем торрент клиент. В главном меню открываем "Настройки ->Конфигурация" или(Ctrl+P).
  • В левой части выбираем пункт "Connection"(Соединения) и запоминаем порт, под которым работает торрент. В меня порт: 36406. (Рис.1.)
  • Рис.1.
  • Запускаем KIS. В правой верхней части экрана нажимаем кнопку "Настройка". (Рис.2.). 
  • Рис.2.
  • Откроется окно настройки (Рис.3.). В котором будет выбран пункт "Сетевой экран". Далее нажимаем кнопку "Настройка" в области Сетевой экран. (Рис.3.)
    • Рис.3.
  • Открываем закладку "Пакетные правила". И нажимаем кнопку "Добавить". (Рис.4.)
    • Рис.4.
  • Выбираем действие - Разрешить. Вводим название сервиса. Ставим галочку возле Протокола и выбираем TCP. Выбираем направление: Входящее/Исходящее.  Вводим локальный порт - порт по которому работает торрент клиент (у меня 36406). И указываем Адрес - любой адрес. (Рис.5.)
  • Рис.5.
  • Делаем тоже и для UDP протокола. Рис. 6.
  • Рис. 6.
  • Теперь нужно переместить два новых пункта в начало. Для этого выбираем один из них и перемещаем с помощью кнопки "Вверх". Рис. 7
    • Рис. 7
  • В результате наши два ресурса будут в начале списка. Нажимаем "ОК" для сохранения изменений. И еще раз "ОК" в окне настроек.

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

Изменение расположения файлов базы данных MySQL

   Для того чтобы изменить расположение файлов базы данных (БД) MySQL необходимо выполнить следующие шаги (В описании используется Windows Vista и MySQL Server v5.1.47 community):
  1. Остановим службу MySQL (данная служба может иметь еще № версии сервера, например MySQL 5). Для этого можно просмотреть ранее описанную статью, как остановить службу в Windows.
  2. Создадим папку где будут сохраняться базы данных. К примеру d:\ProgramData\MySQL\MySQL Server 5.1\data\
  3. Ищем файл my.ini он обычно может размещаться в папке куда установлен MySQL Server (у меня c:\Program Files\MySQL\MySQL Server 5.1\) или в папке Windows. Открываем его для редактирования любым редактором. (Заранее делая резервную копию данного файла) 
  4. Ищем сукцию [mysqld], а в ней параметр datadir. Данный параметр указывает на размещение папки из базами данных. У меня этот параметр содержит следующее значение: datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/". Изменяем его на: D:/ProgramData/MySQL/MySQL Server 5.1/data/ (следим за правильным указанием разделителей между папками, они в обратную сторону) и сохраняем изменения.
  5.  Копируем старые настройки и базы данных, которые были указаны в файле my.ini (C:\ProgramData\MySQL/MySQL Server 5.1\Data\ в новый каталог, который мы создали в пункте №2 (d:\ProgramData\MySQL\MySQL Server 5.1\data\)
  6. Запускаем службу MySQL. (Для этого можно просмотреть ранее описанную статью, как запустить службу в Windows
  7. Проверяем подключение к MySQL Server с помощью консоли или сторонних утилит. 

воскресенье, 20 февраля 2011 г.

Перезапуск, остановка, возобновление работы служб Windows

    Зачастую бывает необходимо перезапустить или остановить службу Windows для выполнения неких операций, которые блокирует служба. И так приступим. Для описания использовались: Windows XP, Vista, Seven
  1. Открыть Администрирование в  Панели управления. Для этого нажимаем Пуск-> Панель управления. Панель управления может быть в двух режимах просмотра, классическом и кратком. На Рис. 1. представлен краткий вид панели управления.

 
 Рис. 1 -Windows XP
 
Рис. 1 - WindowsVista, 7 
 а. Для Windows XP нужно выбрать пункт "Производительность и обслуживание" Рис.2а (Для Windows Vista, 7 нужно выбрать пункт "Система и безопасность" Рис. 2б).
 
 Рис. 2а
 
Рис. 2б 
б. Выбираем пункт "Администрирование". Рис. 3.

Рис. 3 Windows XP
 
Рис. 3 Windows Vista,7 
Также панель управления может быть представлена в классическом виде, тогда она будет выглядеть примерно так как показано на Рис.4. Выбираем "Администрирование"
Рис.4.Windows XP
 
 Рис.4.Windows Vista, 7 
  1. В Администрировании нужно выбрать пункт "Службы". Рис.5.
Рис.5. Windows XP
 
Рис.5.Windows Vista, 7  
 В результате откроется окно с перечнем служб. (Рис.6.)
Рис.6 Windows XP
 
Рис.6.Windows Vista, 7   
  1. Находим нужную службу в списке представленных служб. И тут у нас есть два пути. Первый - можно кликнуть правой кнопкой мыши на нужную службу, в результате чего появится контекстное меню с помощью которого можно выполнить некие действия с данной службой Например: запустить, остановить, приостановить, перезапустить... Если служба запущена - тогда пункты которые отвечают за запуск будут недоступны. Если службы остановлена - пункты которые отвечают за остановку будет недоступны. Второй путь - нажать правой кнопкой мыши на службе и выбрать пункт меню "Свойства" (или два раза кликнуть левой кнопкой мыши на нужную службу). В результате чего откроется окно "Свойства" службы. (Рис.7) 
 Рис. 7 Windows XP
 
Рис.7.Windows Vista, 7    
   В данном окне можно конкретнее настроить службу, к примеру выбрать тип запуска. Если выбрать тип "Авто"  - службы будет автоматически загружена при старте Windows. При выборе типа запуска "Вручную" - службу нужно будет запускать вручную. И режим "Отключено" - служба будет отключена.
Рис.8 Windows XP
 
Рис.8.Windows Vista, 7   
   Для управления текущей службой также есть клавиши быстрой установки состояния службы. А именно: Пуск (Запустить), Стоп(Остановить), Пауза, Продолжить.
   С помощью данного окна можно настроить и управлять службами которые запущены или будут запускаться  на компьютере при старте системы.

пятница, 18 февраля 2011 г.

Delphi Диалоговое окно "выбор директории"

   Возникла задача, в которой нужно вызвать диалоговое окно выбора папки. Если нужно сделать выбор файла можно просто разместить на форме не визуальный компонент OpenDialog написать код взаимодействия и все готово. Для диалогового окна выбора папки структура немного другая.
Сперва нужно добавить модуль FileCtrl, если конечно его еще нет в списке подключенных модулей. В данном модуле есть две функции SelectDirectory: 
function SelectDirectory ( const Caption : string; const StartDir : WideString; out ChosenDir : string ) : Boolean;
где:  Caption     - Текст заголовка окна;
        StartDir    - Рабочая директория, в которую мы переместимся при открытии диалогового окна выбора папки.
       ChosenDir - Выбранный каталог
Если пользователь, в диалоговом окне выбора  папки, нажал "ОК" - результат вернется True и выбранный каталог будет записан в переменную ChosenDir.
function SelectDirectory ( var CurrDir : string; DialogOptions : TSelectDirOpts ; HelpContext : Longint ) : Boolean;
где: CurrDir - Базовая рабочая директория, в которую мы переместимся при открытии диалогового окна выбора папки.
       DialogOptions - настройка диалогового окна выбора папки. Может принимать следующие параметры: sdAllowCreate, sdPerformCreate, sdPrompt. 

              sdAllowCreate - Диалоговое окно выбора папки будет содержать поле редактирования имени каталога, в которое можно вводить имя несуществующего каталога.Указанное имя будет записано в переменную Directory, но при этом сам каталог создан не будет.
              sdPerformCreate  - Параметр используется только совместно с величиной sdAllowCreate. Когда пользователь вводит несуществующий каталог, функция создает его.
              sdPrompt - Параметр используется только совместно с величиной sdAllowCreate. Если пользователь введет имя не существующего каталога, то будет выведено окно на подтверждение создания каталога. Если параметр Options содержит значение sdPerformCreate и пользователь нажимает кнопку OK в диалоговом окне выбора каталога, то указанный каталог создается. В противном случае, каталог создан не будет.
       HelpContext - указывает контекст системы помощи, который будет активирован при нажатии кнопки F1

Примеры использователя:
var SelectedDirName:string;
begin
...
   SelectDirectory('Выберите каталог','V:\',SelectedDirName);
....
end;
   Результат представлен на Рис.1. (В системе Windows Vista диалоговое окно выбора каталога будет выглядит следующим образом)
 Рис.1. 

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

Полное удаление MySQL (Проблемы при повторной установке MySQL)

   При установке MySQL - оказалось что когда то он уже устанавливался и при повторной установке спрашивает старый пароль, служба не хочет запускаться...
   Оказывается после удаления MySQL остаются файлы баз данных и еще некоторые файлы настройки. Поскольку я использую Windows XP - файлы баз данных и настроек размещены по умолчанию:
[Диск:]\Documet and Settings\All Users\Application Data\MySQL\MySQl Server [version]\Data
  После перемещения (удаления) папки [Диск:]\Documet and Settings\All Users\Application Data\MySQL\ - все установилось без проблем. Таким образом я устранил проблему при установке MySQL.

воскресенье, 13 февраля 2011 г.

Введение в Delphi XE Starter Edition

   Небольшой видеоролик, в котором Michael Rozlog рассказывает о некоторых особенностях Delphi XE Starter Edition

понедельник, 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) и забыл их убрать. Ясно что у меня все работало, потому что подключалось к БД, которая стояла у меня на машине, а вот при запуске на других компьютерах появлялась ошибка когда программа делала попытку подключиться к несуществующему серверу и соответственно БД.