Главная » Delphi » Хранение данных между сеансами

0

Теперь осталась только  одна  проблема: установленные пользователем данные  не сохраняются между сеансами. Информация о предпочтениях будет утеряна, если пользователь выйдет  из приложения. Но если сохранить эти значения в конце  сеанса и прочитать их в начале  следующего, то можно  передать данные между сеансами. Создаваемое демонстрационное приложение считывает необходимые данные  в обра ботчике события LoginFormAdapter.OnLogin, а затем  сохраняет их в обработчике события SessionService.OnEndSession. Код  обработчиков этих  событий приве ден в листинге 23.4.

Листинг 23.4. Обработчики событий OnLogin и OnEndSession

procedure TLogin.LoginFormAdapter1Login(Sender: TObject; UserID: Variant);

var

IniFile: TIniFile;

TempName: string;

begin

// Данные сеанса захватываются здесь

TempName:= Home.WebUserList.UserItems.FindUserID(UserId).UserName;

// WebContext.EndUser.DisplayName;

Home.CurrentUserName := TempName;

Lock.BeginRead;

try

IniFile := TIniFile.Create(IniFileName);

try

Session.Values[sFavoriteMovie]:= IniFile.ReadString(TempName,

sFavoriteMovie, ”);

Session.Values[sPasswordHint]:= IniFile.ReadString(TempName,

sPasswordHint, ”);

Session.Values[sLikesChocolate]:= IniFile.ReadString(TempName,

sLikesChocolate, ‘false’);

finally

IniFile.Free;

end;

finally

Lock.EndRead;

end;

end;

procedure THome.SessionsServiceEndSession(ASender: TObject; ASession: TAbstractWebSession; AReason: TEndSessionReason);

var

IniFile: TIniFile;

begin

// Сохранение данных о предпочтениях

Lock.BeginWrite;

if FCurrentUserName <> ” then begin

tryIniFile := TIniFile.Create(IniFileName);

try

IniFile.WriteString(FCurrentUserName, sFavoriteMovie,

ASession.Values[sFavoriteMovie]);

IniFile.WriteString(FCurrentUserName, sPassWordHint,

ASession.Values[sPasswordHint]);

IniFile.WriteString(FCurrentUserName, sLikesChocolate,

ASession.Values[sLikesChocolate]);

finally

IniFile.Free;

end;

finally

Lock.EndWrite

end;

end;

end;

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

Переменная Lock является глобальной переменной типа TMultiReadExclusive- WriteSynchronizer, которая создается в разделе инициализации страницы Home. Поскольку осуществлять чтение и запись  в файл  .INI могут несколько сеансов одно временно, этот компонент позволяет синхронизировать эти процессы. Добавьте в раздел интерфейса модуля wmHome следующее объявление:

var

Lock: TMultiReadExclusiveWriteSynchronizer;

А затем добавьте в него разделы инициализации (initialization) и

завершения (finalization):

Initialization

Lock := TMultiReadExclusiveWriteSynchronizer.Create;

finalization

Lock.Free;

Этот код использует также функцию IniFileName, которая объявлена следующим образом:

const

sIniFileName = ‘DDG6Demo.ini';

function IniFileName: string;

begin

Result := ExtractFilePath(GetModuleName(HInstance)) +

sIniFileName;

end;

Добавьте данный код в модуль wmHome и можно  считать, что создание полнофунк ционального Web приложения завершено. Приложение  способно не  только  прове рять  пользователей при входе,  но и подстраиваться под их предпочтения, а также  за поминать эту информацию и использовать ее при  следующем посещении пользовате лем данных страниц.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии