Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Вниз
Связывание полей/свойств объекта и контролов Найти похожие ветки
← →
Gonza (2002-09-08 15:36) [0]Уважаемые! Возник такой вопрос.
В .Net можно связать контрол на форме (напримет Edit) и поле/свойство объекта, т.е. в результате получается, что при изменении текста в Edit"е меняется и cв-во объекта, а при изменении cв-ва объекта( присваивании ему что-либо) меняется содержимое Edit"а.
Возможно ли такое в Дельфи? Естественно без обработки каких либо событий.
← →
Ученик (2002-09-08 19:24) [1]объект типа TEdit, свойство Text
← →
Gonza (2002-09-08 20:06) [2]Ученик ©
Вы не так поняли.
Пример:
Есть класс:
SomeClass = class
...
property a:string; read GetA write SetA;
...
end;
...
Obj:SomeClass;
На форме есть Edit1:TEdit;
Так вот как связать Obj.a и Edit1.Text, чтоб при изменении
Obj.a изменения отображались в Edit1, а при изменении Edit1.Text изменялось бы и Obj.a?
← →
Ученик (2002-09-08 22:05) [3]>Gonza © (08.09.02 20:06)
Как выглядит операция связывания ?
← →
Старый паскалист (2002-09-08 22:17) [4]Нельзя так сделать в Дельфи.
Я прикола ради осуществил первую часть (Edit -> Prop).
Обратная связь, я думаю, неосуществима (без специального кода в SetХХХ или каких-нибудь хакерских манипуляций с кодом).
Я бы не скзал, что это особо изящное решение, оно ставит запрет
на использование Tag и OnChange для связанных компонент в коде программы.
unit LnkPrps;
interface
uses
TypInfo, Classes, Controls, StdCtrls;
type
TPropRef = record
Instance: TObject;
PropInfo: PPropInfo;
end;
PPropLink = ^TPropLink;
TPropLink = record
IdMarker: Integer; // = $ABCD0123
Control: TControl;
PropRef: TPropRef;
end;
procedure LinkEditToProp(Edit: TEdit; Obj: TObject; PropName: string);
procedure UpdateLinkedEdit(Edit: TEdit);
implementation
uses
SysUtils;
const
IdMarker = $0ABC0123;
type
TDummy = class
class procedure OnChange(Sender: TObject);
end;
var
PropLinkList: TLIst;
function NewLink(Obj: TObject; PropName: string): PPropLink;
begin
New(Result);
Result^.IdMarker := IdMarker;
Result^.PropRef.Instance := Obj;
Result^.PropRef.PropInfo := GetPropInfo(Obj, PropName);
if Result^.PropRef.PropInfo = nil then
begin
Dispose(Result);
Result := nil;
raise Exception.Create("Property not found");
end;
PropLinkList.Add(Result);
end;
procedure DeleteAllLinks;
var i: Integer;
begin
for i := 0 to PropLinkList.Count-1 do
Dispose(PPropLink(PropLinkList[i]));
PropLinkList.Free;
end;
procedure LinkEditToProp(Edit: TEdit; Obj: TObject; PropName: string);
var p: PPropLink;
begin
p := NewLink(Obj, PropName);
p^.Control := Edit;
Edit.Tag := Integer(p);
Edit.OnChange := TDummy.OnChange;
end;
procedure UpdateLinkedEdit(Edit: TEdit);
var p: PPropLink;
begin
with Edit do
begin
p := Pointer(Tag);
if p^.IdMarker <> IdMarker then raise Exception.Create("Tag is not refers to PPropLink");
Text := GetPropValue(p^.PropRef.Instance, p^.PropRef.PropInfo^.Name, True);
end;
end;
procedure UnLinkEditFromProp(Edit: TEdit; Obj: TObject; PropName: string);
var p: PPropLink;
begin
p := Pointer(Edit.Tag);
PropLinkList.Remove(p);
Dispose(p);
end;
{ TDummy }
class procedure TDummy.OnChange(Sender: TObject);
var p: PPropLink;
begin
with Sender as TEdit do
begin
p := Pointer(Tag);
if p^.IdMarker <> IdMarker then raise Exception.Create("Tag is not refers to PPropLink");
SetPropValue(p^.PropRef.Instance, p^.PropRef.PropInfo^.Name, Text);
end;
end;
initialization
PropLinkList := TLIst.Create;
finalization
DeleteAllLinks;
end.
← →
Ученик (2002-09-08 22:29) [5]Продолжаем приколы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TA = class
private
FControl : TControl;
FPropName : string;
function GetA : string;
procedure SetA(Value : string);
public
constructor Create(AControl : TControl; APropName : string);
published
property A : string read GetA write SetA;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FA : TA;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
TypInfo;
constructor TA.Create(AControl : TControl; APropName : string);
begin
inherited Create;
FControl := AControl;
FPropName := APropName;
end;
function TA.GetA : string;
begin
Result := GetStrProp(FControl, FPropName)
end;
procedure TA.SetA(Value : string);
begin
SetStrProp(FControl, FPropName, Value)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FA := TA.Create(Edit1, "Text")
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := FA.A
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FA.A := Edit3.Text
end;
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c