Blog

  • where to store the program settings (.ini)

    Most comfortable (for me personallY) place where program must store the ini-file with options/settings is the application directory. For example, dbview.exe must save the dbview.ini in same folder where .exe is

    But interface guide from Microsoft noted that these end-user settings must be saved in CSIDL_APPDATA (C:\Documents and Settings\<user>\Application Data\<Company>\<Application>)

    If application ran in MS Vista with enabled UAC and tried to write (create file) something into application directory, error raised.

    So we changed the code (to get the file name for settings):
    function GetINIFileName: string;
    var
      strFileName: string;
    begin
      strFileName := ExtractFileName(ParamStr(0));
      Result := GetUserDirectory(‘Scalabium\’ + ChangeFileExt(strFileName, ”) + ‘\’) + ChangeFileExt(strFileName, ‘.ini’)
    end;

    where
    function GetUserDirectory(const SubDir: string): string;
    var
      List: PItemIDList;
      Path: array[0..MAX_PATH] of Char;
    begin
      SHGetSpecialFolderLocation(0, CSIDL_APPDATA, List);
      SHGetPathFromIDList(List, Path);
      Result := String(Path);
      if (Result = ”) then
        Result:= ExtractFilePath(ParamStr(0))
      else
      if (SubDir <> ”) then
      begin
        Result := Result + ‘\’ + SubDir;

        ForceDirectories(Result);
      end
    end;

  • free hosting

    http://www.freehostia.com/free_hosting.html
     Data storage: 250 MB
     Monthly bandwidth: 5 GB
     Hosting for 2 domains
     NO ADS

     PHP & Perl enabled
     1 MySQL database
     10 MB MySQL DB space
     Elefante free scripts

  • IMGConvert + gif/png pictures

    Для чтения gif/png-картинок используется GraphicEx from Mike Lischke
    Но эта библиотека не позволяет создавать ни gif, ни png. Они только читаются правильно, а сохранения там нет вовсе.

    Начал искать альтернативы.
    Для PNG довольно быстро у себя в архивах нашел TPNGImage from [email protected]
    Единственно докрутил сам вызов события OnProgress при сохранении.
    Работает медленно, но пока терпимо.

    Из первостепенного – нужно избавиться от дублирования файлов для сжатия. Они есть и в GraphicEx, и в TPNGImage (adler.obj, deflate.obj etc). С наскоку убрать не удалось – эти файлы из разных версий с разными опубликованными методами. Лишнего там на 40-45Kb

    А вот с GIF замучился. От RXLib (TRxGifAnimator) отказался сразу – слишком много лишнего тянет в себе и анимация мне не нужна вовсе.
    Потом взял TGIFImage from Anders Melander. У меня он был версии 06-Oct-2002. Прикрутился быстро, но качество создаваемых картинок абсолютно не впечатлило – цвета калечились очень сильно.

    Сегодня сходил к нему на сайт http://melander.dk/delphi/gifimage
    Оказалось он передал этот компонент в CodeGear и он включен в BDS 2007. Взял его новую версию и воткнул к себе в Delphi 5. После получаса исправления ошибок компиляции все заработало и результатом создаваемых картинок я доволен.

  • ограбления банков

    В прошлом году прошла целая череда ограблений банков в Киеве. Милиция радостно хлопала в ладоши, заявляя, что банки сами виноваты – отказались от государственной охраны и наняли пенсионеров-вахтеров.
    Потом вроде бы даже рапортовали, что нашли какого-то юношу, на которого повесили почти все ограбления.

    Сейчас с 1 августа тарифы на гос.охрану в банках подняли нехило и многие банки отказалиьс от их услуг. Даже не сомневаюсь, что опять пойдет волна ограблений.

    Ведь даже если сама милиция и не грабит, то слить информацию о неохраняемых отделениях бандитам – пять минут работы, а отличная прибавка к финансовой незалежности.

  • клонирование

    Я в биологии-химии понимаю мало. Даже часть знаний из школьной программы уже благополучно выветрились из головы.

    Но вот в разрезе клонирования возникает вопрос – если клонировать живое “существо” можно из любой сохранившейся клетки, то получается, что любая клетка несет всю необходимую информацию.

    Почему в таком случае “обычное” зачатие предполагает яйцеклетку+спермотозоид? Ведь по идее любая мужская клетка, которая попадет в женский организм должна привести к рождению нового человека?

    Или женская яйцеклетка до того умна и норовиста, что способна “обработать” только спермотозоид?

  • 45

    Сегодня было бы 45 лет со дня свадьбы моих родителей.
    Вечером хоть и буду звонить маме по skype, наверное не рискну даже поднимать эту тему – у самого еще сердце болит и поверить не могу.

  • Delphi: TFindDialog и локализация

    При использовании из Delphi диалогов самой MS Windows (TFindDialog, TOpenDialog etc) есть проблема с локализацией приложения – эти диалоги всегда будут отображаться с надписями в рамках локализации самой Windows.

    Например, ваше приложение может иметь немецкий интрефейс, а вызываемый диалог будет отображать все еще русские или английские строки. Как-то это неправильно и решил я такое дело поправить.

    С наскоку проблему не удалось решить. Т.е. заголовок самого окна изменить не проблема – просто послать сообщение WM_SETTEXT хэндлу диалога с новой строкой в параметре.
    А вот найти описания всех контролов-детей не удалось ни в исходниках Delphi, ни в хедерах Visual Studio.
    День поисков в Google тоже результатов не принес. Такое впечатление, что кроме меня эта тема никого не волнует.

    Пришлось запускать Spy+ из VS и смотреть идентификаторы (ControlID) всех детей-контролов. Далее дело техники – в событии OnShow перебор всех детей, проверка ControlID и посылка сообщения на изменение текста:

    procedure TMain.dlgFindShow(Sender: TObject); 
    var 
      s: String; 
      ControlID: Integer; 
      hChildWin: hWND; 
    begin 
      s := 'Поиск'; 
      SendMessage(dlgFind.Handle, WM_SETTEXT, 0, LParam(PChar(s)));  
    
      hChildWin := GetWindow(dlgFind.Handle, GW_CHILD or GW_HWNDFIRST); 
      while (hChildWin <> 0) do 
      begin 
        ControlID := GetDlgCtrlID(hChildWin);  
    
        if (ControlID = $FFFF) then 
        begin 
          s := '&Что:'; 
          SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); 
        end 
        else 
        if (ControlID = $0001) then 
        begin 
          s := '&Найти далее'; 
          SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); 
        end 
        else 
        if (ControlID = $0002) then 
        begin 
          s := '&Отмена'; 
          SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); 
        end;  
    
        hChildWin := GetWindow(hChildWin, GW_HWNDNEXT); 
      end; 
    end;
  • skype

    В последние 10 дней активно использую skypeout. Пока очень доволен.
    И качество разговора не отличается от “обычного”, и цены какие-то смешные. Разумеется, если одновременно с разговором качать десяток фильмов, то во время разговора некоторые слога-слова будут выпадать, но мы не такие активные качальщики, чтобы делать это одновременно.

    Отдельный аппарат-телефон для skype (usb или wifi) я пока не покупал. Пока устраивают обычные наушники с микрофоном. Когда-то (лет 7 назад) мне их нахаляву прислали откуда-то именно для VoIP.

    Обычный skype (PC<->PC) попробовали тоже – работает без проблем.
    Пробовали раньше на ADSL 128, а теперь на 512 – все пучком.

    Заплатить всего $0.5 за получасовый разговор Украина-Израиль вместо $30 это радует мой кошелек.

    Сначала я пробовал оплатить skypeout через WebMoney. Но все эти посредники работают через business-группы. Т.е. как бы есть компания, которая всем своим сотрудникам может кидать деньги на их кошельки. Но при этом подключаясь к такой группе, нужно понимать, что у админа группы будет доступ ко всей моей статистике. Я на такое не готов.

    Поэтому оплатил карточкой Visa через HGC (http://skype.hgcbroadband.com/en/skypeout_buy.htm)
    Счет пополнился моментально.

    А вообще глобализация жжет:
    – покупать у гонгконской компании евро, которые будут зачисляться на мой долларовый счет в эстонской компании для звонков из Украины в Израиль.
    И при всей такой длинной цепочке это все прекрасно работает. Молодцы.

  • picture convert

    Вроде бы линейка продуктов массовой конвертации файлов пополнилась новой тулзой для обработки изображений:-)