Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Связывание полей/свойств объекта и контролов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-61179
gary5555
2002-09-08 11:07
2002.09.19
Как в компоненте ComboBox место текста вывести цветные прямоуголь


14-61292
Сценарист
2002-08-23 20:46
2002.09.19
Синоним к слову сценарий?


14-61259
BigBadMutuh
2002-08-17 01:33
2002.09.19
Нужен козырной снимок или рисунок бабочки.


3-60972
serg1977
2002-08-28 16:23
2002.09.19
Какую использовать компаненты ?


1-61110
grigorys
2002-09-10 10:38
2002.09.19
Как вызвать End Process из Delphi и прервать действие программы