selamun aleykum
TLabel'in de atasi TControl.
o halde TLabel icin de ayni islem kullanilabilinir.
konu ini dosyasinin iceriginin okunamamasi ise, kriptolayarak kayit edilebilinir yada veritabaninda tutulabilinir. yada kendine has bir dosya olusturulabilinir.
farz edelim ki, her bilesenin tüm özelliklerine ulasabilmek istiyoruz. O halde PropInfo ile bu kullanilan görsel bilesenin Left, Top, Color vesaire property'leri PropInfo ile kontrol edilip uygun bir popup menü acilabilinir.
arzu edilirse, bu is icin bir editör yazilabilinir.
benim verdigim kodlar yalnizca yol gösterici.
böyle bir imkanin oldugunu, böyle bir yol izlenebilecegini belirtmek istedim.
örnegin
Kod: Tümünü seç
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Edit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
FDownX,
FDownY: Integer;
FDragging: Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMoveCracker = class(TControl);
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDownX := X;
FDownY := Y;
FDragging := True;
TMoveCracker(Sender).MouseCapture := True;
end;
procedure LoadControlPos(AControl: TControl);
var
DefControlTop, DefControlLeft: Integer;
begin
with TIniFile.Create(ExtractFilePath(Application.ExeName)+'\ControlsPos.Ini') do
try
with AControl do
if SectionExists(Name) then
begin
DefControlTop := Top;
DefControlLeft := Left;
Top := ReadInteger(Name, 'Top', DefControlTop);
Left := ReadInteger(Name, 'Left', DefControlLeft);
end;
finally
Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadControlPos(Edit1);
LoadControlPos(Label1);
end;
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FDragging then
with Sender as TControl do
begin
Left := X - FDownX + Left;
Top := Y - FDownY + Top;
end;
end;
procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FDragging then
begin
FDragging := False;
TMoveCracker(Sender).MouseCapture := False;
with TIniFile.Create(ExtractFilePath(Application.ExeName)+'\ControlsPos.Ini') do
try
WriteInteger(TControl(Sender).Name,'Top',TControl(Sender).Top);
WriteInteger(TControl(Sender).Name,'Left',TControl(Sender).Left);
finally
Free;
end;
end;
end;
seklinde yapacak olursak, hem TEdit hem de TLabel gibi TControl'den türetilmis bilesenler hareket ettirilebilinir.
fakat burada dikkat edilmesi gereken husus, her bir Form icin ayri bir INI dosyasi olusturulmasi gerekiyor olmasi.
cünkü her form'un icinde birer Edit1 nesnesi olabilir.
eger tek bir dosya icinde tutulmak isteniyorsa, ic ice kümelenmis bir TCollection ile tüm formlar ve barindirdigi elemanlar tutulup, TWriter, TReader ile tek dosyaya yazilabilinir.
MainForm load ederken, es zamanli olarak TCollection kayitli dosyadan okutulur ve her form acilisinda bu collection'dan elemanlarin pozisyonlari okunabilinir.
böyle olmak zorunda degil, alternatifler cok...
yarcimdi olabildiysem ne mutlu bana...