Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

Проблемы с ComboBox

Delphi 1 

…попробуйте сохранять в переменной в методе формы OnEnter или OnCreate значение Index. Затем, чтобы отменить выбор пользователя, сделайте:

ComboBox1.ItemIndex := var1;

DBEdit 

Исправление DBEdit MaxLength

Delphi 1

Я, кажется, не могу получить свойство MaxLength, чтобы работать с компонентами TDBEdit. В TEdit это работает

как положено, но при попытке задать максимальную длину текста в TDBEdit это не срабатывает, и я все еще могу набрать текст сверх установленного ограничения.

По-моему, это является следствием этого кода в TDBEdit.DataChange (DBCTRLS.PAS):

if FDataLink.Field <> nil then begin

 …

 if FDataLink.Field.DataType = ftString then MaxLength := FDataLink.Field.Size

 else MaxLength := 0;

 …

end else begin

 …

 MaxLength := 0;

 …

end;

т.к. иногда значение устанавливается на ноль…

Похоже все будет работать, если вы измените строку

MaxLength := 0;

на

MaxLength := inherited MaxLength;

Для того, чтобы изменения вступили в силу, вам необходимо перекомпилировать ваш complib с измененным DBCTRLS.PAS, находящимся в пути lib.

Если вы хотите использовать MaxLength с StringField, изменений необходимо сделать немного больше:

if (FDataLink.Field.DataType = ftString) and (inherited MaxLength = 0) then

MaxLength := FDataLink.Field.Size

else MaxLength := inherited MaxLength;

Или использовать что-то типа EditMask…

– Reinhard Kalinke

Поиск и управление TEdit/TField

Я хотел бы менять цвет компонентов TDBEdit и TEdit, расположенных на форме, на другой, "отчетливый" цвет, в том случае, если с помощью них требуется ввести какие-либо данные.

Как насчет этого? Представляю вашему вниманию два метода. Первый метод задает цвет каждому DBEdit, имеющему требуемое поле. Второй метод (более сложный) задает цвет каждому БД-компоненту, имеющему необходимое поле.

procedure TForm3.Button3Click(Sender: TObject);

Var Control : Integer;

begin

 For Control := 0 To ControlCount-1 Do

If Controls[Control] Is TDBEdit Then

With TDBEdit(Controls[Control]) Do

If DataSource.DataSet.FieldByName(DataField).Required Then Color := clRed;

end;

{
Данный метод будет работать только в случае, если БД-компонент обладает тремя полями: DataSource, типа TDataSource, DataField, типа String, и Color, типа TColor (это не должно быть проблемой). Также вам необходимо включить TypInfo в список используемых модулей }

procedure TForm3.Button4Click(Sender: TObject);

Var

 Control : Integer;

 DataSource : TDataSource;

 DataField : String;

 Function GetDataSource(Instance: TComponent) : Boolean;

 Var PropInfo: PPropInfo;

 Begin

Result := False;

PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'DataSource');

If (PropInfo <> Nil) And (PropInfo^.PropType^.Kind = tkClass) Then Begin

DataSource := TDataSource(TypInfo.GetOrdProp(Instance, PropInfo));

Result := DataSource <> Nil;

End;

End;

 Function GetDataField(Instance: TComponent) : Boolean;

 Var PropInfo : PPropInfo;

 Begin

Result := False;

PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'DataField');

If (PropInfo <> Nil) And (PropInfo^.PropType^.Kind = tkString) Then Begin

DataField := TypInfo.GetStrProp(Instance, PropInfo);

Result := True;

End;

 End;

 Procedure SetColor(Instance: TComponent; Color: TColor);

 Var PropInfo : PPropInfo;

 Begin

PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'Color');

If (PropInfo <> Nil) And (PropInfo^.PropType^.Kind = tkInteger) Then TypInfo.SetOrdProp (Instance, PropInfo, Ord(Color));

 End;

begin

Поделиться с друзьями: