Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
else ifVarIsNull(NewVal) thenShowMessage('Field was blanked out')
elseShowMessage('New Field Value: ' + String(NewVal));
end;
Если Вы взглянете на исходники формы RecError (в репозитории), то Вы увидите, как она использует эту информацию для вывода строки ' ' при показе ошибок синхронизации данных. На сервере Вы добавляете ограничения уровня записи, используя свойство Constraints Вашего TQuery/TTable или ограничения уровня поля, используя постоянные обьекты TField (с помощью FieldsEditor либо на CustomConstraint, либо ImportedConstraint). Если Вы используете ограничения уровня поля, они вступают в силу, когда данныеотправляются в поле (например, когда Вы уходите из органа управления, связанного с этим полем (типа TDBEdit)).
Как достучаться до методов сервера приложений из TClientDataSet?
Nomadicотвечает:
Вот так:
RemoteServer.AppServer.MyMethod
AppServer – свойство только для чтения, возвращающее интерфейс удаленного сервера, возвращаемый провайдером сервера приложений. Клиентские приложения могут общаться напрямую с сервером приложений через этот интерфейс.
Я включил dbclient.dll в секцию `additional files` опций распространения по web, но этот файл никогда не загружается на клиента. Как это исправить?
Nomadicотвечает:
Ваш INF-файл должен включать в себя строки наподобие:
[Add.Code]
dbclient.dll=dbclient.dll
[dbclient.dll]
file=http://yoursite.com/dbclient.cab
clsid={9E8D2F81-591C-11D0-BF52-0020AF32BD64}
RegisterServer=yes
FileVersion=4,0,0,36
Замените «yoursite» Вашим HTTP-адресом, где находится cab-файл. FileVersion – это версия файла в Вашем cab-файле (проверьте информацию о версии DBCLIENT, чтобы быть уверенным в соответствии). Убедитесь, что FileVersion относится к версии Вашего DBCLIENT.DLL. Вы можете положить dbclient.dll в cab-файл, используя утилиту CABARC, которую Вы найдете в папке delphi\bin. Примерная команда вызова CABARC может выглядеть примерно так:
CABARC N DBCLIENT.CAB DBCLIENT.DLL
Как можно использовать TClientDataSet в локальном приложении с таблицами Paradox, без использования компонент TProvider и TRemoteServer?
Nomadicотвечает:
Вы не сможете отделаться от Провайдера (хотя бросать его на форму/модуль данных не придется), но Вы сможете использовать TClientDataSetв одно-точечном (single-tier) приложении. Для того, чтобы открыть client dataset, Вы должны назначить Провайдера Данных вручную.
{ CDS = TClientDataSet }
{ Table1 = TTable }
CDS.Provider := Table1.Provider;
CDS.Open;
Также Вы должны включить модуль BDEProvв предложение uses.
Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что `WIN1251 undefined`
Nomadicотвечает:
A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3).
Создание
Функции редактора полей во время выполнения программы
Возможен ли вызов функций редактора полей (Fields Editor) во время выполнения программы?
Да. Если вы определили поля во время разработки приложения, то во время выполнения можно менять их свойства (например, Size).
Например, следующий код изменяет каждый размер поля TField.Size так, чтобы соответствовать фактическому размеру поля открываемого набора данных:
procedureSetupFieldsAndOpenDataset(DataSet: TDataSet);
varFieldNum, DefNum: Integer;
begin
withDataSet do
begin
ifActive thenClose;
FieldDefs.Update;
{набор данных должен быть закрыт}
{ищем каждое предопределенное TField в DataSet.FieldDefs:}
forFieldNum := FieldCount - 1 downto0 do withFields[FieldNum] do
begin
DefNum := FieldDefs.IndexOf(FieldName);
ifDefNum < 0 then raiseException.CreateFmt('Поле "%s" не найдено в наборе данных "%s"',[FieldName, Dataset.Name]);
{устанавливаем свойство size:}
Size := FieldDefs[DefNum].Size;
end;
Open;
end;
end;
– Lindsay Reichmann
Производная TIntegerField
Я думал о производной, новом варианте компонента TIntegerfield, но я не могу понять как мне его получить во время разработки, ведь он не устанавливается в палитру компонентов.
Это то, что вы хотите. Создайте следующий молуль:
MICRON.PAS:
unitmicron;
interface
uses DB, DBTables, Classes;
type
TMicronField = class(TIntegerField)
public
functionIsValidChar(Ch: Char): Boolean; override;
end;
procedure Register;
implementation
functionTMicronField.IsValidChar(Ch: Char): Boolean;
begin
Result := Ch in['+', '-', '0'..'9','.'];
end;
procedure Register;
begin
RegisterFields([TMicronField]);
end;
end.
Поместите данный модуль в ваш каталог lib и добавьте это поле, используя диалог установки компонент. Затем, используя «DataSet designer», свяжите TMicronField с нужными вам полями, после чего вы увидите, что список типов полей включает теперь «Micron». (для отображения полей на новый тип поля, сначала вам необходимо удалить все TIntegerFields).
Другое решение, более простое (но так-же работающее), заключается в изменении исходного кода DBTables и простой замене существующей функции IsValidChar на TIntegerField.
– Mark Edington
Создание новой таблицы на основе структуры другой таблицы
Delphi 1
На ум сразу приходит операция присваивания значения свойству (стоящему с левой стороны от ':='), при которой Delphi в своих недрах вызывает метод 'write' и передает ему в виде единственного параметра все то, что находится в правой части выражения. Если свойство не имеет метода write, оно предназначено только для чтения. Вот определение свойства FieldDefs объекта TDataSet в файле DB.PAS:
propertyFieldDefs: TFieldDefs readFFieldDefs writeSetFieldDefs
Как вы можете видеть, у него есть метод write. Следовательно, код:
Destination.FieldDefs := Source.FieldDefs;
в действительности делает такую операцию:
Destination.SetFieldDefs(Source.FieldDefs);
(за исключением того, что вы не можете использовать эту строку, поскольку SetFieldDefs определен в секции Private.)
Вот определение свойства IndexDefs объекта TTable в файле DBTABLES.PAS file:
propertyIndexDefs: TIndexDefs readFIndexDefs;
В этом случае метод write отсутствует, поэтому свойство имеет атрибут только для чтения. Тем не менее, для самого объекта TIndexDefs существует метод Assign. Следовательно, следующий код должен работать:
Source.IndexDefs.Update;
Destination.IndexDefs.Assign(Source.IndexDefs);
Перед вызовом Assign для Source.IndexDefs вызывайте метод Update, чтобы быть уверенным в том, что вы получите то, что хотите.
Метод SetFieldDefs является процедурой с одной строкой кода, в которой вызывается метод FieldDefs Assign.
Также можно проверить, определен ли реально индекс, и, если нет, то при вызове IndexDefs.Assign вы можете получить исключение типа «List Index Out Of Bounds» (или что-то типа этого). Например, так:
Читать дальшеИнтервал:
Закладка: