Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 31
Я поместил имя модуля с формой ввода данных в список используемых модулей главной формы. Вот базовая схема моего кода:
>procedure TFrmItemNav.BtnChangeLocClick(Sender: TObject);
>{var DlgItemLoc: TDlgItemLoc;}
>begin
> DlgItemLoc := TDlgItemLoc.Create(FrmItemNav);
> DlgItemLoc.ShowModal;
> if DlgItemLoc.ModalResult = mrOk then
> {делаем все, что необходимо для постинга данных}
> else
> {очищаем и делаем Cancel};
> DlgItemLoc.Free;
>end;
Отображение определенных полей БД
Delphi 1
Вот что можно сделать во время выполнения программы:
>Table1.FieldByName(RemovedFieldName).Visible := False;
или
>Table1.Field[removedFieldNumber-1].Visible := false;
Из базы данных в переменные
Delphi 1
Примерно так вы можете программным путем извлечь содержимое поля:
>aValue := TMyTable.FieldByName('SomeField').AsText;
или
>aValue := TMyTable.FieldByName('SomeField').AsInteger;
или
>aValue := TMyTable.Fields[1].AsFloat;
В действительности здесь вы получаете объект TField от объекта TTable (или TQuery), и затем вызываете соответствующий метод объекта TField для получения самих данных. Вы можете также изменить значение самого поля, но только в случае, если объект TTable находится в режиме вставки (Insert) или редактирования (Edit). Члены AsFloat, AsInteger, AsDateTime и AsString в действительности являются свойствами, и как таковые также могут принимать значения. С помощью Редактора Полей (Fields Editor, для вызова которого достаточно дважды щелкнуть на объекте TTable или TQuery) также возможно создание объектов-полей. Эти объекты могут быть использованы вместо получения их каждый раз от объекта TTable или TQuery.
Получение информации о таблице
Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:
>procedure TForm1.ShowFields;
>var
> i : Word;
>begin
> Memo1.Lines.Clear;Table1.FieldDefs.Update; { должно быть вызвано, если Table1 не активна }
> for i:= 0 to Table1.FieldDefs.Count - 1 do With Table1.FieldDefs.Items[i] do Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));
> Memo1.Lines.Add(Name + ' – ' + IntToStr(Size));
end;
Если вам просто нужны имена полей (FieldNames), то используйте метод TTable GetFieldNames:
GetIndexNames для получения имен индексов:
>var FldNames, IdxNames : TStringList
>begin
> FldNames := TStringList.Create;
> IdxNames := TStringList.Create;
> If Table1.State = dsInactive then Table1.Open;
> Table1.GetFieldNames(FldNames);
> Table1.GetIndexNames(IdxNames);
> {…… используем полученную информацию ……}
> FldNames.Free; {освобождаем stringlist}
> IdxNames.Free;
>end;
Для получения информации об определенном поле вы должны использовать FieldDef.
Обмен данными между TMemoField и TMemo
Delphi 1
>Procedure TMemoToTMemoField;
>begin
> TMemoField.Assign(TMemo.Lines);
>end;
>Procedure TMemoFieldToTMemo;
>VAR aBlobStream : TBlobStream;
>begin
> aBlobStream := TBlobStream.Create(TMemoField, bmRead);
> TMemo.Lines.LoadFromStream(aBlobStream);
> aBlobStream.Free;
>end;
Если в транзакции изменена какая-то таблица, то для другого пользователя блокируется вся таблица, до окончания транзакции. Как лечить?
Nomadic отвечает:
По умолчанию, оператор UPDATE в MS SQL Server пытается поставить эксклюзивную табличную блокировку. Вы можете обойти это, используя ключевое слово FROM в сочетании с опцией PAGLOCK для использования MS SQL Server страничных блокировок вместо эксклюзивной табличной блокировки:
>UPDATE orders SET customer_id=NULL FROM orders(PAGLOCK) WHERE customer_id=32;
Блокиpовка на всю таблицу пpи UPDATE ставится только в том случае, если по предикату нет индекса. Так, можно просто проиндексировать таблицу orders по полю customer_id, и не забывать делать UPDATE STATISTIC, хотя будет работать и с PAGLOCK. Просто не факт, что UPDATE всегда делает табличную блокировку.
Форма Мастер-Деталь
Delphi 1
…это нормально в двух случаях:
1. Эксперт баз данных по умолчанию создает запрос, где RequestLive установлен в False; если вы хотите что-либо изменить, установите RequestLive в True.
2. При отношениях «один к многим», из-за правил сохранения целостности, вам дозволяется делать изменения только на форме «многих», а не на форме «один».