Run Time Form Tasarımı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 15
- Kayıt: 24 Eki 2006 11:47
Run Time Form Tasarımı
Kullanıcı programı kullanırken açık olan formu düzenlemesini nasıl sağlıyabilirim ... Bu konu hakında iki gündür araştırmalar yapıyorum yalnız sağlıklı bir bilgiye ulaşamadım maalesef Yardımcı olursanız sevinirim...
Detaylar....
Kullanılan formda label edit nesneleri bulunmaktadır bunları kullanıcıya göre formun istendiği yere konumlandırılmasını sağlamam gerekiyor...
Aynı programı kullanan 3 kullanıcı bulunuyor 3 kişide form ekranı farklı farklı görünecektir...
Yardımlarınız için şimdiden teşekkür ederim ....
Detaylar....
Kullanılan formda label edit nesneleri bulunmaktadır bunları kullanıcıya göre formun istendiği yere konumlandırılmasını sağlamam gerekiyor...
Aynı programı kullanan 3 kullanıcı bulunuyor 3 kişide form ekranı farklı farklı görünecektir...
Yardımlarınız için şimdiden teşekkür ederim ....
Re: Run Time Form Tasarımı
Kod: Tümünü seç
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with TIniFile.Create(ExtractFilePath(Application.ExeName)+'\ControlsPos.Ini') do
try
if Button = mbLeft then
begin
ReleaseCapture;
TControl(Sender).Perform(wm_SysCommand, sc_Move or 1, 0);
end;
WriteInteger(TControl(Sender).Name,'Top',TControl(Sender).Top);
WriteInteger(TControl(Sender).Name,'Left',TControl(Sender).Left);
finally
Free;
end;
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);
end;
kıdemsiz üye
Re: Run Time Form Tasarımı
Edit1 ve diğer hareket ettirilecek bileşenlerin üzerinde mause'un her hareketinde Ini dosyayı açıp içerisine bilgi yazmak hiç uygun değil bence.ikra yazdı:Kod: Tümünü seç
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin with TIniFile.Create(ExtractFilePath(Application.ExeName)+'\ControlsPos.Ini') do try if Button = mbLeft then begin ReleaseCapture; TControl(Sender).Perform(wm_SysCommand, sc_Move or 1, 0); end; WriteInteger(TControl(Sender).Name,'Top',TControl(Sender).Top); WriteInteger(TControl(Sender).Name,'Left',TControl(Sender).Left); finally Free; end; 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); end;
OnMouseDown'da sadece bileşenin taşıma işlemi yapılması yeterli. Formun OnClose'unda Ini dosyaya bileşenlerin en son koordinatları yazılabilir.
Fakat; yukarıdaki örnekteki gibi OnMouseMove'u kullanmak isterseniz sadece TWinControl'dan türetilmiş olan bileşenler için çalışır. Dolayısıyla arkadaşın istediği label'ların (sınıfı TLabel ise eğer) hareketi sağlanamaz.
There's no place like 127.0.0.1
-
- Üye
- Mesajlar: 15
- Kayıt: 24 Eki 2006 11:47
Re: Run Time Form Tasarımı
Öncelikle emeğiniz için teşekürler...
SimaWB arkadaşımın dediği gibi bu kodlar benim işime yaramaz.... Belirtmekte fayda görüyorum bunu calışma anında kullanıcı formunu düzenlemesine imkan vermek lazım görsel olarak ini dosyası işimi görmüyor ...
Yardımlarınızı bekliyorum....
SimaWB arkadaşımın dediği gibi bu kodlar benim işime yaramaz.... Belirtmekte fayda görüyorum bunu calışma anında kullanıcı formunu düzenlemesine imkan vermek lazım görsel olarak ini dosyası işimi görmüyor ...
Yardımlarınızı bekliyorum....
Re: Run Time Form Tasarımı
Ben bu kodlar işinize yaramaz demedimDannyOceans yazdı:Öncelikle emeğiniz için teşekürler...
SimaWB arkadaşımın dediği gibi bu kodlar benim işime yaramaz.... Belirtmekte fayda görüyorum bunu calışma anında kullanıcı formunu düzenlemesine imkan vermek lazım görsel olarak ini dosyası işimi görmüyor ...
Yardımlarınızı bekliyorum....
Arkadaşın gönderdiği kodları denediniz mi bilmiyorum ama
Kod: Tümünü seç
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE = $F012;
begin
ReleaseCapture;
TControl(Sender).Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
Ini'ye gelince; her kullanıcının form tasarımlarını bir yerde saklamanız gerekiyor. Arkadaş bunun için Ini'yi uygun görmüş. Ini, registry, veri tabanı yada farklı bir dosya... (Formun son halini saklamak için TStream'in WriteComponent ve ReadComponent fonksiyonlarına bakmanızı tavsiye ederim.)
There's no place like 127.0.0.1
-
- Üye
- Mesajlar: 15
- Kayıt: 24 Eki 2006 11:47
Re: Run Time Form Tasarımı
Bu kodlar tabiki işe yarar ama benim yapmak istediğim bu değil ... Yalnız benim işime yaramıyor ekleyen arkadaşta emeğine sağlık yardımcı olmaya çalışmış teşekkür ederim...
Benim yapmak istediğim şu kullanıcıya her türlü işlemi yapmasına izin verilecek yani gerekirse edite renk değişikliği gerekirse boyut değişikliği yani bizim form tasarımını düşünün tüm özelliklerini barındıracak birşey yapmak istiyorum ...
İlgilendiğiniz için teşekkür ederim...
Benim yapmak istediğim şu kullanıcıya her türlü işlemi yapmasına izin verilecek yani gerekirse edite renk değişikliği gerekirse boyut değişikliği yani bizim form tasarımını düşünün tüm özelliklerini barındıracak birşey yapmak istiyorum ...
İlgilendiğiniz için teşekkür ederim...
Re: Run Time Form Tasarımı
Profesyonel olduğumdan değil ama kayıtsız kalamadım.
Öncelikle bu kadar isteği yerine getirebilmen için puzzle gibi düşünmen gerekmektedir. Muhakkak bir component'i vardır sanıyorum ama ondada bir yetersizlik bulacağınızı düşünüyorum. Bu yüzden aşağıdaki kendimce tavsiyelerimi belirtmek istiyorum.
Tahminimce bir forum üzerindeki elemanda bir kullanıcının yapmak isteyeceği değişiklikler;
• Yazı boyut, renk, font vs vs ayarları.
• Background renk ayaları (örneğin edit background gibi)
• Border renk ayarları
• Eleman pozisyonları
• Eleman boyutları
• Birki birde shadow özelliği
Bundan fazlasıda neler olabilirse halledilebilir bunlar halladildikten sonra..
• Öncelikle kullanıcı ara yüzde değşiklikleri yaptığında forumu kapatıp açtığında aynı değişiklikler duruyor olucaksa bir kayıt sistemi belirlemelisin. Form üzerinde değişiklik yapılan elemanların son değerlerini saklamak için ve açılışta bunları elemanlar oluşturulduktan sonra geri yüklemek.
Kullanabileceklerin : ini, registry, DB, TStream
• Bu işin en zor kısmı eleman pozisyonları olmalıki bunun cevabını saolsun arkadaşalar vermiş. Bunun dışındaki zorluk olarak karşına çıkabilecek durum ise itemlerin birer kimliğe bürünmesi bu kimlikte kayıt edilmesi bu kimlikte yüklenmesi ve karıştırılmaması.
Profesyonel ve amatör bir kullanıcı ortasında bir delphici isen birinci zorluğu aştın ikinciyi araştırarak işini çözebileceğini düşünüyorum, yanlış anlamazsanız sizinkisi hem pişir hem yedir misali oldu.
Kolay gelsin iyi çalışmalar.
Öncelikle bu kadar isteği yerine getirebilmen için puzzle gibi düşünmen gerekmektedir. Muhakkak bir component'i vardır sanıyorum ama ondada bir yetersizlik bulacağınızı düşünüyorum. Bu yüzden aşağıdaki kendimce tavsiyelerimi belirtmek istiyorum.
Tahminimce bir forum üzerindeki elemanda bir kullanıcının yapmak isteyeceği değişiklikler;
• Yazı boyut, renk, font vs vs ayarları.
• Background renk ayaları (örneğin edit background gibi)
• Border renk ayarları
• Eleman pozisyonları
• Eleman boyutları
• Birki birde shadow özelliği
Bundan fazlasıda neler olabilirse halledilebilir bunlar halladildikten sonra..
• Öncelikle kullanıcı ara yüzde değşiklikleri yaptığında forumu kapatıp açtığında aynı değişiklikler duruyor olucaksa bir kayıt sistemi belirlemelisin. Form üzerinde değişiklik yapılan elemanların son değerlerini saklamak için ve açılışta bunları elemanlar oluşturulduktan sonra geri yüklemek.
Kullanabileceklerin : ini, registry, DB, TStream
• Bu işin en zor kısmı eleman pozisyonları olmalıki bunun cevabını saolsun arkadaşalar vermiş. Bunun dışındaki zorluk olarak karşına çıkabilecek durum ise itemlerin birer kimliğe bürünmesi bu kimlikte kayıt edilmesi bu kimlikte yüklenmesi ve karıştırılmaması.
Profesyonel ve amatör bir kullanıcı ortasında bir delphici isen birinci zorluğu aştın ikinciyi araştırarak işini çözebileceğini düşünüyorum, yanlış anlamazsanız sizinkisi hem pişir hem yedir misali oldu.
Kolay gelsin iyi çalışmalar.
·•· Bilgi Güçtür ! Bu Gücü Hisset ! ·•·
Re: Run Time Form Tasarımı
There's no place like 127.0.0.1
Re: Run Time Form Tasarımı
Eğer DevExpress kullanıyor ya da kullanmayı düşünüyorsanız bu işi göz alıcı bir şekilde yapabilen "LayoutControl" bileşenlerini kullanabilirsiniz. http://www.devexpress.com/Products/VCL/ExLayoutControl/
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
-
- Üye
- Mesajlar: 15
- Kayıt: 24 Eki 2006 11:47
Re: Run Time Form Tasarımı
Tevsiyeleriniz işin teşekkürler ...
TMS Scripter Studio Pro en uygunu gibi görünüyor ...
LayoutControl bu component hakkında bilgi bulamadım demolarını inceledim yalnız kodlarla nasıl kullanacağımı bilemedim..
LayoutControl hakkında bilgi verebilirseniz yada link verebilirseniz iyi olur...
İyi çalışmlar...
TMS Scripter Studio Pro en uygunu gibi görünüyor ...
LayoutControl bu component hakkında bilgi bulamadım demolarını inceledim yalnız kodlarla nasıl kullanacağımı bilemedim..
LayoutControl hakkında bilgi verebilirseniz yada link verebilirseniz iyi olur...
İyi çalışmlar...
Re: Run Time Form Tasarımı
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.
örneginseklinde 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...
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;
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...
kıdemsiz üye
Re: Run Time Form Tasarımı
a.s @ikra; ilk gönderdiğiniz kodla Label'ı haraket ettiremezsiniz. Çünkü
komutuyla gönderilen wm_SysCommand mesajını TControl sınıfı dinlemez. Ancak TWinControl sınıfı dinler. Zaten gönderdiğiniz kodu denediğinizde de çalışmadığı görürsünüz.
Ama son gönderdiğiniz kodlar zaten farklı ve bence gayet güzel. Fakat; sürüklenen bileşenin yeni kordinatarı hesaplanırken parent'ının kordinatları da dikkate alınmalı. Yoksa kullanıcı bileşeni formun dışına doğru taşıyabilir ve bir daha geri getiremez
Birde OnMouseUp'ta sürekli Ini'ye yazmaya çalışmak yerine LoadControlPos gibi SaveControlPos komutu yazılıp formun OnClose'unda çalıştırılırsa daha kullanışlı olur.
Kod: Tümünü seç
TControl(Sender).Perform(wm_SysCommand, sc_Move or 1, 0);
Ama son gönderdiğiniz kodlar zaten farklı ve bence gayet güzel. Fakat; sürüklenen bileşenin yeni kordinatarı hesaplanırken parent'ının kordinatları da dikkate alınmalı. Yoksa kullanıcı bileşeni formun dışına doğru taşıyabilir ve bir daha geri getiremez
Birde OnMouseUp'ta sürekli Ini'ye yazmaya çalışmak yerine LoadControlPos gibi SaveControlPos komutu yazılıp formun OnClose'unda çalıştırılırsa daha kullanışlı olur.
There's no place like 127.0.0.1
-
- Üye
- Mesajlar: 15
- Kayıt: 24 Eki 2006 11:47
Re: Run Time Form Tasarımı
Çok teşekkürler arkadaşlar sizin sayenizde baya bir adım ilerledim istediklerimin tamamını yapabileceğime inanıyorum ...