Blog

  • wp-syntax

    Today I installed the WP_Syntax plugin for WordPress to highlight the code syntax (for Delphi, C# etc)
    Now I must edit all old posts and edit the text:-)

  • британские дети

    Оказывается вплоть до 1967 Британия посылала детей в эмиграцию в Канаду, Австралию, Новую Зеландию и другие колонии. Около 150 тыс. детей в возрасте от 3 до 14 лет были высланы для “осваивания” территорий и насаждения британской культуры. Из них 100 тыс отправились в Канаду, а остальные 50 тыс в Австралию. ЮАР и т.п.

    Ссылки:
    http://www.murdoch.edu.au/elaw/issues/v9n4/buti94.html
    http://www.telegraph.co.uk/news/worldnews/australiaandthepacific/6569274/Australia-to-say-sorry-to-abused-British-child-migrants.html

    Интересно, а у родителей кто-то спрашивал? Или это были бездомные? В любом случае за ними же кто-то должен был следить там (типа воспитателей).

  • drag’n’drop from external applications

    In Friday in our SIM (Shareware Information System) I added the possibility to drag’n’drop the mail content from external mailer (MS Outlook, Outlook Express etc)

    To add this feature you need:
    1. declare two new Cliboard formats that need to be registered:

    var
      CF_FILECONTENTS,
      CF_FILEDESCRIPTOR: Integer;initialization
    
      // Initialize the OLE libraries
      OleInitialize(nil);
    
      // Register the clipboard formats that we need to handle in the
      // OLE drag drop operation
      CF_FILECONTENTS := RegisterClipboardFormat(CFSTR_FILECONTENTS);
      CF_FILEDESCRIPTOR := RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
    
    finalization
      OleUninitialize;
    

    2. in OnCreate event for your form allow window to accept drop events. Just execute the next code:

    OleCheck(RegisterDragDrop(Handle, Self));
    

    3. for your form you need implement a few methods for IDropTarget interface:

    type
      TfrmOrderWizard = class(TForm, IDropTarget)
      ...
      private
        { IDropTarget }
        function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
                           var dwEffect: Longint): HResult; stdcall;
        function DragOver(grfKeyState: Longint; pt: TPoint;
                          var dwEffect: Longint): HResult; stdcall;
        function DragLeave: HResult; stdcall;
        function Drop(const dataObj: IDataObject;
                      grfKeyState: Longint; pt: TPoint;
                      var dwEffect: Longint): HResult; stdcall;
        { IUnknown
         Ignore referance counting }
        function _AddRef: Integer; stdcall;
        function _Release: Integer; stdcall;
        ...
    

    where:

    function TfrmOrderWizard.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
         var dwEffect: Longint): HResult;
    begin
      dwEffect := DROPEFFECT_COPY;
      Result  := S_OK;
    end;
    
    function TfrmOrderWizard.DragOver(grfKeyState: Longint; pt: TPoint;
         var dwEffect: Longint): HResult;
    begin
      dwEffect := DROPEFFECT_COPY;
      Result := S_OK;
    end;
    
    function TfrmOrderWizard.DragLeave: HResult;
    begin
      Result := S_OK;
    end;
    
    function TfrmOrderWizard._AddRef: Integer;
    begin
       Result := 1;
    end;
    
    function TfrmOrderWizard._Release: Integer;
    begin
      Result := 1;
    end;
    
    function TfrmOrderWizard.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult;
    const
      PT_TSTRING = ULONG(30);
      PT_UNICODE = ULONG(31);
      PR_BODY    = PT_TSTRING or ($1000 shl 16);
      PR_BODY_W  = PT_UNICODE or ($1000 shl 16);
    var
      aFmtEtc: TFORMATETC;
      aStgMed, stgmitem: TSTGMEDIUM;
      pData: PChar;
      pfgd: PFileGroupDescriptor;
      dwCount, dwfetch: Integer;
    
      stat: STATSTG;
      pstg: IStorage;
      pstm: IStream;
    begin
      {Make certain the data rendering is available}
      if (dataObj = nil) then
        raise Exception.Create('IDataObject-Pointer is not valid!');
      with aFmtEtc do
      begin
        cfFormat := CF_TEXT;
        ptd := nil;
        dwAspect := DVASPECT_CONTENT;
        lindex := -1;
        tymed := TYMED_HGLOBAL;
      end;
      {Get the data}
      OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
      try
        {Lock the global memory handle to get a pointer to the data}
        pData := GlobalLock(aStgMed.hGlobal);
        { Replace Text }
        MemoOrder.Text := pData;
      finally
        {Finished with the pointer}
        GlobalUnlock(aStgMed.hGlobal);
        {Free the memory}
        ReleaseStgMedium(aStgMed);
      end;
    
      // Get the file descriptors
      with aFmtEtc do
      begin
        cfFormat := CF_FILEDESCRIPTOR;
        ptd := nil;
        dwAspect := DVASPECT_CONTENT;
        lindex := -1;
        tymed := TYMED_HGLOBAL;
      end;
      OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
      try
        pfgd := PFileGroupDescriptor(GlobalLock(aStgMed.hGlobal));
        // Iterate each of the files
        for dwCount := 0 to pfgd.cItems-1 do
        begin
          // Set up for getting the file data
          with aFmtEtc do
          begin
            cfFormat := CF_FILECONTENTS;
            ptd := nil;
            dwAspect := DVASPECT_CONTENT;
            lindex := dwCount;
            tymed := TYMED_ISTORAGE;
          end;
          if (dataObj.GetData(aFmtEtc, stgmitem) = S_OK) then
          begin
            // IStorage (handle the outlook item)
            pstg := IStorage(stgmitem.stg);
            // Hard coded to open the outlook message item stream
            if (pstg.OpenStream('__substg1.0_1000001F', nil, STGM_SHARE_EXCLUSIVE or STGM_READ, 0, pstm) = S_OK) or
               (pstg.OpenStream('__substg1.0_1000001E', nil, STGM_SHARE_EXCLUSIVE or STGM_READ, 0, pstm) = S_OK) then
            begin
              pstm.Stat(stat, STATFLAG_DEFAULT);
              pData := AllocMem(stat.cbSize);
              try
                pstm.Read(pData, stat.cbSize, @dwFetch);
                // Set the msg body
                MemoOrder.Lines.Add(String(pData));
              finally
                // Free buffer memory
                FreeMem(pData);
              end;
              // Free the stream
              pstm := nil;
            end;
            // Free the storage
            pstg := nil;
            // Release the storage medium
            ReleaseStgMedium(stgmitem);
          end;
        end;
      finally
        // Unlock the memory
        GlobalUnLock(aStgMed.hGlobal);
        // Release the storage medium
        ReleaseStgMedium(aStgMed);
      end;
    
      Result := S_OK;
    end;
  • .coop domain

    Today I got the order with email address in .coop domain. Never saw such kind of domain names before:

    http://www.nic.coop

  • ShareIt Control Panel

    ShareIt changed the theming for own Control Panel. Now their CP is in white colors instead blue as before

  • GeoCities has closed

    Мой первый сайт был именно на geocities.com и провисел там очень долго. Гда два-три точно

    И вот сегодня дятлы из Yahoo  закрыли geocities окончательно. Это как узнать, что твоя первая любовь умерла…

  • VAT ID

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

    И только греки выпендрились. У них код страны это EL вместо GR. Eleada, блин:-)

  • 9

    Вчера досмотрел мультик “9”, который начал смотреть позавчера.
    Очень понравился. И прорисован суперски, и сюжет неплохой. Душа может быть и у человека, и у игрушки, и у камня. А главное после смерти душа может оказаться где угодно:-)

    Вообще смотрю, что в последнее время смотреть такие “мультики” намного интересней, чем фильмы. Зачастую просто забываешь, что герой связан из чулка, а здание полыхает на рисунке, а не наяву.

    И если всякие мультики про “животных” (типа Volt, Garmin etc) мне понравились, но я их стер, то 9 оставил в архивах. Не знаю, захочется ли его пересматривать, но пока пусть хранится. Удалить всегда успею.

  • ПриватБанк

    В этой стране нормально работает только тот процесс, где не задействованы руки и “мозги”. А еще лучше полность автоматизированый процесс без работников.

    У меня отлично работала их карта Visa Internet в течении 9 лет. Все что мне нужно было – это пополнять ее и раз в году (в первых числах октября) узнавать новый CVV2 код, т.к. карта автоматически выпускалась на год.

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

    Я узнаю об этом абсолютно случайно, т.к. картой пользуюсь только для хостинга+домена (раз в году) и иногда по мелочи для покупок в online shops (DealExtreme, for example).

    В чате их Privat24 мне предлагают заказать их новую Visa Classic Internet (тоже виртуальную), а для переноса остатка со старой заблокированной карты пойти в свой филиал и там получить деньги в кассе+сразу же положить их на новую карту.

    Маразм какой-то.

    Но где-то неделю назад домой звонит операционистка Жанна и оставляет свой номер мобильного (я-то на работе в это время). Во время разговора с ней выясняется, что я действительно должен ехать к ним на Предславинскую и написать заявление про перенос остатка с одной карты на другую.

    Вчера с утра поехал. Сама Жанна работает только с 10 утра, поэтому как минимум до 10:30 ее на месте не было вовсе. Я за это время стал в очередь к другой операционистке (работала она одна в это время на все отделение). В течении 45 минут я без всякого интереса выслушивал сколько процентов (10%) получит пенсионерка, оформляющая пенсионную карточку, если не будет снимать свои гроши, а оставит их на счету.
    Потом в течении 2х минут написал под ее диктовку заявление и ушел.

    На данный момент деньги еще не пришли на новую карточку. Подожду еще завтра…