Валентин Озеров - Советы по 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
btnTemp.Caption := 'I''m glad to see You';
btnTemp.SetBounds(20, 20, 80, 20);
{ You must define this event handler named 'OnBtnTempClick' }
btnTemp.OnClick := OnBtnTempClick;
{ Ready to show }
btnTemp.Visible := true;
{ Done. }
end;
Как создать клон (копию, достаточно близкую к оригиналу) произвольного компонента?
Nomadicсоветует:
{ Здесь процедyра CreateClone, которая креатит компоненту ОЧЕНЬ ПОХОЖУЮ на входную. С такими же значениями свойств. Присваивается все, кроме методов. }
functionCreateClone(Src: TComponent): TComponent;
varF: TStream;
begin
F := nil;
try
F := TMemoryStream.Create;
F.WriteComponent(Src);
RegisterClass(TComponentClass(Src.ClassType));
F.Position := 0;
Result := F.ReadComponent( nil);
finally
F.Free;
end;
end;
Как заставить произвольный компонент реагировать на изменения в TDataSource?
Nomadicсоветует:
TFieldDataLink. За D2 не скажу, а в D1 в Help'е его нет, реализован в \DELPHI\SOURCE\VCL\DBTABLES.PAS.
typeTMyForm = class(TForm)
{…}
Table1: TTable;
DataSource1: TDataSource;
private
FDL : TFieldDataLink;
procedureRecChange(Sender: TObject);
public
{...}
end;
procedureTMyForm.FormCreate(Sender: TObject);
begin
FDL:=TFieldDataLink.Create;
FDL.OnDataChange := RecChange;
FDL.DataSource := DataSource1;
FDL.FieldName := 'MyFieldName';
end;
procedureTTabEditDlg.FormDestroy(Sender: TObject);
begin
FDL.Free;
end;
procedureTTabEditDlg.MasterChange(Sender: TObject);
begin
{… тут реагируй на изменения …}
end;
За отслеживание различных событий, происходящих с TDataSource, в иерархии VCL отвечает класс TDataLink. TFieldDataLink– наследник, который выполняет маскирование событий, не относящихся к конкретному столбцу набора данных.
Если надо отслеживать изменения в любом столбце набора, используйте TDataLink. Если необходимо отслеживать события для некоторого подмножества строк набора данных, посмотрите на реализацию TGridDataLink.
Доступ к другим компонентам из базового
Delphi 1
Список-свойство Components[] существует во всех потомках TComponent и используется для хранения ссылок на все собственные компоненты. При вызове «mycomponent := TSomeComponent.Create(aComponent)», ссылка на mycomponent помещается в список aComponent Components[]. В большинстве случаев, в методе Create в качестве владельца компонентов определена форма, и ссылки на компоненты помещаются в список Components[] самой формы.
Метод FindComponent() (упомянутый где-то еще) только производит поиск компонентов в текущем списке Components[]. Если объект, который вы хотите найти, принадлежит другому компоненту, вы должны просканировать его список компонентов.
В зависимости от того, как вы создаете свою базу и другие компоненты, вы можете осуществить рекурсивный алгоритм поиска, который стартует в верхней части дерева собственника набора компонентов (вероятно, формы), спускаясь вниз и проходя по списку Components[] каждого вновь найденного компонента, пока желаемый объект не будет найден.
Хорошей альтернативой может служить способ, при котором вы всегда определяете базовый компонент в качестве владельца всех других ваших «подкомпонентов» (при их создании). После этого будет работать поиск по свойству вашего базового компонента Components[].
CANVAS.TEXTWIDTH
Delphi 1
Установить размер шрифта для панели можно следующим образом:
WithStatusBar1.Panels[1] do begin
Text := Edit1.Text;
Canvas.Font.Size := StatusBar1.Font.Size;
Width := Canvas.TextWidth(Text) + 10;
end;
Создание компонента
Delphi 1
…чтобы сгруппировать свойства наподобие Font, вам необходимо создать наследника (подкласс) TPersistent. Например:
TBoolList = class(TPersistent)
private
FValue1: Boolean;
FValue2: Boolean
published
propertyValue1: Boolean readFValue1 writeFValue1;
propertyValue2: Boolean readFValue2 writeFValue2;
end;
Затем, в вашем новом компоненте, для этого подкласса необходимо создать ivar. Чтобы все работало правильно, вам =необходимо= перекрыть конструктор.
TMyPanel = class(TCustomPanel)
private
FBoolList: TBoolList;
public
constructorCreate(AOwner: TComponent); override;
published
propertyBoolList: TBoolList readFBoolList writeFBoolList;
end;
Затем добавьте следующий код в ваш конструктор:
constructorTMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBoolList := TBoolList.Create;
end;
Циклический опрос компонентов
Delphi 1
procedureTForm1.FormCreate(Sender: TObject);
varI : integer;
begin
forI:= 0 toComponentCount -1 do
if(Components[I] ISTEdit) then
(Components[I] ASTEdit).{Вашпараметр} := {ваше значение};
end;
Если вам необходимо идентифицировать конкретный набор edit-компонентов, поместите их на панели и сделайте примерно так:
procedureTForm1.FormCreate(Sender: TObject);
varI : integer;
begin
withMyPanel do forI:= 0 toControlCount -1 do
if(Controls[I] ISTEdit) then
(Controls[I] ASTEdit).{Вашпараметр} := {Ваше значение};
end;
В контексте примера, Edit1, Edit2 и т.д. есть то же самое, что и Edit[1], Edit[2]. Если вы хотите иметь доступ к серии элементов управления как к элементам массива, поместите их в TList.
MyArr := TList.Create;
MyArr.Add(Edit1);
MyArr.Add(Edit2);
…
For i := 0 ToMyArr.count - 1 Do
(MyArr.items[i] AsTEdit).Enabled := False;
MyArr.Free;
procedureTForm1.FormCreate(Sender: TObject);
varI: Integer;
begin
forI := 0 toComponentCount -1 do
ifComponents[I] isTEdit then
TEdit(Components[I]).Whatever := 10;
end;
Для получения доступа используйте:
TButton(mylist.items[i]).property := sumpin;
или
TButton(mylist.items[i]).method;
Это хорошее решение для пакетной обработки компонентов или для получения доступа при линейном способе. Для решения вашей проблемы есть еще более легкое решение, которое требует предварительной работы в режиме проектирования. Установите свойство tag и получите преимущество в том, что все компоненты являются производными от TComponent и имеют это свойство.
Читать дальшеИнтервал:
Закладка: