Blog

  • TRichEdit: change the substring but don’t change color/font attributes

    For example, if you have some TRichEdit instance and you want to change some substring there but do not change the formatting (color/font etc) for this text, you may use this code:

    var
      i: Integer;
    begin
      if SameText(strNewValue, strOldValue) then exit;
      repeat
        i := Pos(strOldValue, yourRichEdit.Lines.Text);
        if (i > 0) then
        begin
          yourRichEdit.SelStart := i-1;
          yourRichEdit.SelLength := Length(strOldValue);
          yourRichEdit.SelText := strNewValue;
        end;
      until (i = 0)
    end;

    PS: if use the next code, then formatting will be lost:
    yourRichEdit.Lines.Text := StringReplace(yourRichEdit.Lines.Text, strOldValue, strNewValue, [rfIgnoreCase, rfReplaceAll])

  • 3G/GPRS

    если ехать отдыхать, то сейчас выгодно купить карточку у BeeLine. Они перепродают 3G от Utel, но при этом нет помесячной оплаты, а платишь только за траффик (30коп за 1Мб):
    http://beeline.ua/Services/gprs/3g.wbp

    К сожалению, и сам utel, и МТС, и КиевСтар, и PeopleNet дерут абонплату. Т.е. в итоге цена мегабайта там даже ниже, но их услуги больше подходят тем, кто пользуется этим постоянно. Лично мне такое нужно только в отпуске.

    PS: в Израиле я тоже сидел на 3G – скорость впечатляла. 100Mb стоили 20 шекелей, т.е. суммы вполне сравнимы с BeeLine

  • GUIDs

    Чего-то подумалось сегодня с утра – монополию Microsoft погубит повальное использование во всех дырках псевдо-уникальных GUID’ов.
    Как только кто-то сломает алгоритм генерации или просто их количество начнет зашкаливать, они начнут повторяться у разных разработчиков на компьютерах, это обрушит устоявшуюся технологию и погребет нафиг и Windows, и офис, и кучу third-party разработанного софта. Ведь сейчас практически все зиждется на уникальности генерации GUID…

  • MS Windows STOP error codes

    Very useful resource with short description for most STOP errors (during Windows boot) and links for extended information about error:
    http://aumha.org/a/stop.htm

  • Spreadsheet Convert

    Added the export from Open Office spreadsheets (.ods-files).
    New build uploaded to site for downloading

  • Picture Convert

    Released today. Just added all information on html-pages and uploaded to site

    In trial a few files (10) from directory processed only and “unregistered” text placed in center of any saved image
    The registered version will work without any limitations, of course

  • Microsoft Desktops v1.0

    Русинович выпустил утилиту для виртуальных десктопов:

    http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

  • PriceWaterhouseCooper

    Очередная покупка тулзы от их сотрудника.

    С одной стороны хорошо, что один сотрудник рекомендует тулзу своему соседу, т.е. он доволен покупкой и функционала ему хватает.
    С другой стороны, раз тулза нужна многим (и не только в одном филиале), то почему бы компании не купить пакет лицензий и раздать своим сотрудникам? И им удобней, и мне приятней.

    PS: кстати такая же ситуация с Ernst&Young – тоже разные сотрудники из разных филиалов (что удивляет даже из Литвы и Чехии)  берут себе лицензии, а компания не выбивает скидки за опт.

  • save IStorage into stream

    In last days I worked with IStorage interface. For my task I needed the function to save the IStorage into file and/or stream and later to load from file/stream into IStorage.

    I wrote the next useful functions:

      procedure CreateOLEDoc(const AFileName: WideString; AStorage: IStorage);
      var
        hr: Integer;
        NewStorage: IStorage;
      begin
        hr := StgCreateDocfile(PWideChar(AFileName), STGM_DIRECT or STGM_READWRITE or STGM_CREATE or
                               STGM_SHARE_EXCLUSIVE, 0, NewStorage);
        if (hr = S_OK) then
        begin
          AStorage.CopyTo(0, nil, nil, NewStorage);
          NewStorage.Commit(STGC_DEFAULT);
          NewStorage := nil
        end
      end;

      procedure WriteStorageToStream(AStorage: IStorage; AStream: TStream);
      var
        NewStorage: IStorage;

        LockBytes: ILockBytes;
        HGlob: HGLOBAL;
        intfStream, myStream: IStream;
        oldStatstg: TStatStg;
        cbRead, cbWritten: Comp;
      begin
        HGlob := GlobalAlloc(GMEM_MOVEABLE, 0);
        try
          OleCheck(CreateILockBytesOnHGlobal(HGlob, False, LockBytes));
          OleCheck(StgCreateDocfileOnILockBytes(LockBytes, STGM_DIRECT or STGM_READWRITE or STGM_CREATE or
                               STGM_SHARE_EXCLUSIVE, 0, NewStorage));
          OleCheck(AStorage.CopyTo(0, nil, nil, NewStorage));
          NewStorage.Commit(STGC_DEFAULT);
          OleCheck(CreateStreamOnHGlobal(HGlob, True, intfStream));

          myStream  := TStreamAdapter.Create(AStream);
          try
            OleCheck(intfStream.Stat(oldStatstg, 1));
            OleCheck(intfStream.Seek(0, 0, cbWritten));

            OleCheck(intfStream.CopyTo(myStream, oldStatstg.cbSize, cbRead, cbWritten));
          finally
            myStream  := nil;
            intfStream := nil;
          end;
        finally
          NewStorage := nil;
          GlobalFree(HGlob);
        end;

        AStream.Position := 0;
      end;