Сохранить строку в памяти?+пример работы с атомами

Материал из DRKB

Сохранить строку в памяти?+пример работы с атомами[править | править код]

Например через атомы:

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


const UniqueSignature = 'GI7324hjbHGHJKdhgn90jshUH*hjsjshjdj';

procedure CleanAtoms;
var
  p: PChar;
  i: Word;
begin
  GetMem(p, 256);
  for i := 0 to $FFFF do
  begin
    GlobalGetAtomName(i, p, 255);
    if StrPos(p, PChar(UniqueSignature)) <> nil then GlobalDeleteAtom(i);
  end;
  FreeMem(p);
end;

procedure WriteAtom(AStr: string);
begin
  CleanAtoms;
  GlobalAddAtom(PChar(UniqueSignature + AStr));
end;

function ReadAtom(): string;
var
  p: PChar;
  i: Word;
begin
  GetMem(p, 256);
  for i := 0 to $FFFF do
  begin
    GlobalGetAtomName(i, p, 255);
    if StrPos(p, PChar(UniqueSignature)) <> nil then break;
  end;
  Result := StrPas(p + Length(UniqueSignature));
  FreeMem(p);
end;

procedure TReadFromAtom.Button1Click(Sender: TObject);
begin
  WriteAtom(Edit1.Text);
end;

procedure TReadFromAtom.Button2Click(Sender: TObject);
begin
  Showmessage(ReadAtom);
end;


Примечание: константа "UniqueSignature" должна быть достаточно длинной, чтобы однозначно идентифицировать атом, в тоже время длина хранимой строки вместе с UniqueSignature не должна превышать 255 символов. Данная конструкция может хранить только 1 значение. Для хранения нескольких значений надо назначить несколько разных UniqueSignature и использовать сходные процедуры.


Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02073