Archive for August, 2008

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

Thursday, August 28th, 2008

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

Thursday, August 28th, 2008

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

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

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

GUIDs

Thursday, August 28th, 2008

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

MS Windows STOP error codes

Thursday, August 28th, 2008

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

Wednesday, August 27th, 2008

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

Picture Convert

Wednesday, August 27th, 2008

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

Tuesday, August 26th, 2008

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

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

PriceWaterhouseCooper

Friday, August 22nd, 2008

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

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

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

save IStorage into stream

Thursday, August 21st, 2008

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;

иудаизм запрещает любые татуировки на теле

Thursday, August 21st, 2008