Изображение квадрата Дюрера

ООО АВТОМАТИКА плюс

Rambler's Top100

Рейтинг@Mail.ru

Код программы cgidb

unit Unit1;

interface

uses
  SysUtils, Classes, HTTPApp, DB, DBTables;

type
  TWebModule1 = class(TWebModule)
    procedure WebModule1acDefaultAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure WebModule1acMainAction(Sender: TObject; Request: TWebRequest;
      Response: TWebResponse; var Handled: Boolean);
    procedure WebModule1acEditFormAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  WebModule1: TWebModule1;

implementation

{$R *.dfm}

function RedText(S: string): string;
begin
  Result := '<font color=red>' + S + '</font>';
end;

procedure TWebModule1.WebModule1acDefaultAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := RedText('Запрашиваемая страница не найдена!');
end;

procedure TWebModule1.WebModule1acMainAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  Page: TStringList;
  Q: TQuery;
  I: Integer;
  CurrentRow, RadioStr: string;

  // Выполняет необходимые действия над записями базы данных
  procedure CheckDatabaseOpeation;
  var
    Operation: string;
    I: Integer;
  begin
    Operation := Request.ContentFields.Values['operationtype']; // Тип операции
    if (Operation = '') or (Request.ContentFields.Values['editformbtn'] <> 'ОК') then Exit;
    
    if Operation = 'Добавить' then              // ДОБАВЛЕНИЕ
    begin
      if Request.ContentFields.Values['db_Name'] = '' then
        Page.Add(RedText('Добавление записи: значение ключевого поля не присвоено!'))
      else
      begin
        Q.Append;
        for I := 0 to Q.FieldCount - 1 do
          Q.Fields[I].AsString := Request.ContentFields.Values['db_' + Q.Fields[I].FieldName];
        Q.Post;
      end; 
    end else if Operation = 'Изменить' then     // ИЗМЕНЕНИЕ
    begin
      if CurrentRow = '' then
        Page.Add(RedText('Изменение записи: запись не выбрана!'))
      else
      begin
        if not Q.Locate('Name', CurrentRow, [loCaseInsensitive]) then
          Page.Add(RedText('Изменение записи: запись не найдена: ' + CurrentRow))
        else
        begin
          if Request.ContentFields.Values['db_Name'] = '' then
            Page.Add(RedText('Изменение записи: значение ключевого поля не присвоено!'))
          else
          begin
            Q.Edit;
            for I := 0 to Q.FieldCount - 1 do
              Q.Fields[I].AsString := Request.ContentFields.Values['db_' + Q.Fields[I].FieldName];
            Q.Post;
          end;
        end;
      end;
    end else if Operation = 'Удалить' then         // УДАЛЕНИЕ
    begin
      if CurrentRow = '' then
        Page.Add(RedText('Удаление записи: запись не выбрана!'))
      else
      begin
        if not Q.Locate('Name', CurrentRow, [loCaseInsensitive]) then
          Page.Add(RedText('Удаление записи: запись не найдена: ' + CurrentRow))
        else
        begin
          Q.Delete;    
        end;
      end;
    end;
  end;
begin
  Page := TStringList.Create;
  try
    CurrentRow := Request.ContentFields.Values['dbrec'];

    Page.Add('<h1>Публикация базы данных</h1>');
    Page.Add('<h2>Данные из "country.db"</h2>');
    Q := TQuery.Create(nil);
    try
      Q.DatabaseName := 'DBDEMOS';
      Q.SQL.Text := 'SELECT * FROM Country ORDER BY Name';
      Q.RequestLive := True;
      Q.Open;

      try
        CheckDatabaseOpeation();
      except
        on E: Exception do
        begin
          Page.Add(RedText('<br>Error: ' + E.Message + '<br>'));
          if Q.Modified then
            Q.Cancel;
        end;
      end;
      
      Q.First;

      Page.Add('<br><br>');
      Page.Add('<form action="editform" method="post">');
      Page.Add('<input name="btn1" type="submit" value="Добавить">');
      Page.Add('<input name="btn1" type="submit" value="Изменить">');
      Page.Add('<input name="btn1" type="submit" value="Удалить">');

      Page.Add('<table border="1">');

      // Выводим наименования столбцов таблицы
      Page.Add('<tr>');
      for I := 0 to Q.FieldCount - 1 do
      begin
        Page.Add('<th>');
        Page.Add(Q.Fields[I].FieldName);
        Page.Add('</th>');
      end;
      Page.Add('<th>*</th>');
      Page.Add('</tr>');

      // Выводим записи таблицы
      while not Q.Eof do
      begin
        Page.Add('<tr>');
        for I := 0 to Q.FieldCount - 1 do
        begin
          Page.Add('<td>');
          Page.Add(Q.Fields[I].AsString);
          Page.Add('</td>');
        end;

        // Добавляем еще один столбец в элементом radiobutton     
        RadioStr := '<input name="dbrec" type="radio" '+
          'value="' + Q.FieldByName('Name').AsString + '"';

        // Устанавливаем radiobutton для текущей записи
        if (CurrentRow <> '') and
           (CurrentRow = Q.FieldByName('Name').AsString) then
          RadioStr := RadioStr + ' CHECKED ';

        RadioStr := RadioStr + '>';
   
        Page.Add('<th>'+RadioStr+'</th>');
        // столбец в элементом radiobutton добавлен!

        Page.Add('</tr>'); // Запись добавлена
        Q.Next;
      end;
      Page.Add('</table>');

      Page.Add('<input name="btn1" type="submit" value="Добавить">');
      Page.Add('<input name="btn1" type="submit" value="Изменить">');
      Page.Add('<input name="btn1" type="submit" value="Удалить">');

      Page.Add('</form>');
    finally
      Q.Free
    end;

    Response.Content := Page.Text; // Окончательный результат
  finally
    Page.Free;
  end;
end;

procedure TWebModule1.WebModule1acEditFormAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  Page: TStringList;
  Q: TQuery;
  CurrentRow, Operation: string;

  // Добавление форму редактирования
  procedure AddEditForm(IsEdit: Boolean; IsDelete: Boolean = False);
  var
    I: Integer;
    Value: string;
  begin
    Page.Add('<form action="main" method="post">');
    if IsDelete then
    begin
      Page.Add('<h2>Вы действительно хотите удалить запись "'+CurrentRow+'"?<h2>');
    end else
    begin
      for I := 0 to Q.FieldCount - 1 do
      begin
        if IsEdit then
          Value := Q.Fields[I].AsString // Для редактирования
        else
          Value := '';                  // Для добавления

        Page.Add(Q.Fields[I].FieldName + ': ');
        Page.Add('<input name="db_' + Q.Fields[I].FieldName + '"' +
                 ' type="text" value="' + Value + '"><br>');
      end;
    end;

    Page.Add('<input name="editformbtn" type="submit" value="ОК">');
    Page.Add('<input name="editformbtn" type="submit" value="Отмена">');

    // Добавляем скрытый элемент, который позволит вернуть главной странице
    // имя выбранной записи. Имя должно быть такое же, как у type="radio"
    Page.Add('<input name="dbrec" type="hidden" value="' + CurrentRow + '">');

    // Добавляем скрытый элемент для типа операции
    Page.Add('<input name="operationtype" type="hidden" value="' + Operation + '">');

    Page.Add('</form>');
  end;
begin
  Page := TStringList.Create;
  try
    CurrentRow := Request.ContentFields.Values['dbrec'];
    Operation := Request.ContentFields.Values['btn1'];
    Page.Add('<h1>Публикация базы данных</h1>');

    Q := TQuery.Create(nil);
    try
      Q.DatabaseName := 'DBDEMOS';
      Q.SQL.Text := 'SELECT * FROM Country';
      Q.RequestLive := True; // Разрешаем редактирование
      Q.Open;

      if Operation = 'Добавить' then              // ДОБАВЛЕНИЕ
      begin
        AddEditForm(False);
      end else if Operation = 'Изменить' then     // ИЗМЕНЕНИЕ
      begin
        if CurrentRow = '' then
          Page.Add(RedText('Изменение записи: запись не выбрана!'))
        else
        begin
          if not Q.Locate('Name', CurrentRow, [loCaseInsensitive]) then
            Page.Add(RedText('Изменение записи: запись не найдена: ' + CurrentRow))
          else
          begin
            AddEditForm(True);
          end;
        end;
      end else if Operation = 'Удалить' then         // УДАЛЕНИЕ
      begin
        if CurrentRow = '' then
          Page.Add(RedText('Удаление записи: запись не выбрана!'))
        else
        begin
          AddEditForm(False, True);
        end;
      end else
        Page.Add(RedText('Операция не задана!'));
    finally
      Q.Free;
    end;         

    Page.Add('<br><a href="main">Главная страница</a>');
    
    Response.Content := Page.Text; // Окончательный результат
  finally
    Page.Free;
  end;        
end;

end.
Логинов Дмитрий © 2005-2015