Run Time Form Tasarımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
DannyOceans
Üye
Mesajlar: 15
Kayıt: 24 Eki 2006 11:47

Run Time Form Tasarımı

Mesaj gönderen DannyOceans »

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 ....
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Run Time Form Tasarımı

Mesaj gönderen ikra »

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
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen SimaWB »

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;
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. :!:
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
DannyOceans
Üye
Mesajlar: 15
Kayıt: 24 Eki 2006 11:47

Re: Run Time Form Tasarımı

Mesaj gönderen DannyOceans »

Ö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....
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen SimaWB »

DannyOceans 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....
Ben bu kodlar işinize yaramaz demedim :D
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;
şeklinde Edit'i çalışma esnasında hareket ettirebilirsiniz. Yani bu kodlar size aslında ciddi manada yol gösterici olmalı. (Ama yukarıda da belirttiğim gibi tüm bileşenlerde işe yaramaz.)

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
DannyOceans
Üye
Mesajlar: 15
Kayıt: 24 Eki 2006 11:47

Re: Run Time Form Tasarımı

Mesaj gönderen DannyOceans »

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...
Kullanıcı avatarı
ByDeniS
Üye
Mesajlar: 144
Kayıt: 03 Oca 2009 12:24
Konum: My Computer

Re: Run Time Form Tasarımı

Mesaj gönderen ByDeniS »

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.
·•· Bilgi Güçtür ! Bu Gücü Hisset ! ·•·
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen SimaWB »

There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen vkamadan »

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
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen SimaWB »

There's no place like 127.0.0.1
DannyOceans
Üye
Mesajlar: 15
Kayıt: 24 Eki 2006 11:47

Re: Run Time Form Tasarımı

Mesaj gönderen DannyOceans »

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...
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Run Time Form Tasarımı

Mesaj gönderen ikra »

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...
kıdemsiz üye
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Run Time Form Tasarımı

Mesaj gönderen SimaWB »

a.s @ikra; ilk gönderdiğiniz kodla Label'ı haraket ettiremezsiniz. Çünkü

Kod: Tümünü seç

TControl(Sender).Perform(wm_SysCommand, sc_Move or 1, 0);
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. :bravo: 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
DannyOceans
Üye
Mesajlar: 15
Kayıt: 24 Eki 2006 11:47

Re: Run Time Form Tasarımı

Mesaj gönderen DannyOceans »

Çok teşekkürler arkadaşlar sizin sayenizde baya bir adım ilerledim istediklerimin tamamını yapabileceğime inanıyorum ...
Cevapla