Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-61319
Cherv
2002-07-05 19:16
2002.09.19
Как програмно, на время, отключить клавиатуру или монитор


3-60940
Abu
2002-08-27 17:44
2002.09.19
проверка для Excel


4-61352
Squ
2002-07-29 11:59
2002.09.19
ShellApi


3-60967
Shtukatur
2002-08-28 19:41
2002.09.19
Как сортировать lookup поля?


1-61118
Andy BitOff
2002-09-10 11:15
2002.09.19
TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский