Delphiyi sistematik olarak okuyarak öğrenmedim. Bu yüzden Delphi'de kafama göre takılıyorum.
Bir program düşünün. Bir sürü buton var.
Butona bastığımda programı yazarken tasarladığım panelllerden birisini görünür hale getiriyorum. İşim bitince kapat butonuna basınca bu panel görünmez oluyor.
Bir başka butona basınca bu kez bir başka panel görünür hale geliyor.
Bu yapı tahminimce hoş bir yapı değildir. En basitinden ana forumda tasarım aşamasında bir sürü panel üstü üste duruyor bu da kafa karışıklığı yapıyor.
Bahsettiğim yapıdaki amaca uygun en güzel çözüm nedir?
Tam olarak programi anlamadim yani kullanim kolayligi icin hangisi daha uygun bilmiyorum ama tabsheet tarzi sayfalarla sorun cozulebilir gb geliyor
mesaj birleştirme:: 07 Aralık 2015, 13:51:11
Birde su cozum var kullanıcının göreceği panel bellidir. siz panelleri tasarim aninda tabsheetler icinde rahatca tasarlarsiniz kullanici tabsheeti gormez. butona basinca ilgili panelin parenti kullanicinin gorcegi panel olur kapat tusuna basinca parent yine tabsheete doner
Tabsheet nedir bilmiyorumki. Belki kullanıyorumdur.
Mesela
2 buton olsun.
1. buton Set PLL tuşu
2. buton Set timer tuşu
Set PLL tuşuna basınca ekrana bir sürü editbox vs gelecek.
Set Timer tuşuna basınca da ekrana bir ton editbox, checkbox vs vs gelecek.
Tasarım aşamasında iki tane panel hazırlıyorum.
1.si Set Pll ile ilgili nesneleri barındırıyor. 2. ise set timer ile ilgili olanları.
Set PLL tuşuna basınca 1. paneli görünür yapıyorum.
Set timer tuşuna basınca 2. paneli görünür yapıyorum.
Bazen visible özelliğini kapadığım panel hataya da neden oluyor. Ne bileyim invisible panelde setfocus vs yapamazsın şeklinde.
Tasarım aşamasında herhangi bir paneli bring to front bring to back yapabiliyoruz.
Panelleri visible yapak yerine yazılımla back yada front yapabilsem bazı sorunlarım çözülecek.
Fakat gene de İşi bilenler sanki bu amacımı daha farklı çözüyorlar diye düşünüyorum.
Şu anda 10 panele sahişp bir program yazıyorum ve ana forma ait program çok karmaşıklaştı.
Panellere ne eklersem bu eklentiye ait tanıtımlar ana forma otomatik eklendiğinden hangi komponent kime ait karışıp gidiyor.
Buradan buyurun:
https://www.youtube.com/watch?v=2OEiGMri7o4 (https://www.youtube.com/watch?v=2OEiGMri7o4)
Delphi tabsheet (pagecontrol) dediğim bu tarz birşey
(http://edn.embarcadero.com/article/images/10086/docksite.gif)
Ben 16 sayfanın her birinde 3 sayfa olarak kullandım bunu. Yani 48 panel. Adinational diye bir sayfadaydı sanırım şuan ulaşamıyorum. Burada her sayfaya panel yerleştirip uygun panelin parent. değerini değiştirerek işi çözüyorsunuz. Hatta panellerle kullanıcının formlarını ayrı tutarak tasarım işlemini dahada kolaylaştırabilirsiniz.
VB de TabStrip i şöyle kullanıyorum
(http://s18.postimg.cc/b269gynbd/Ekran_Al_X_nt_s.jpg) (http://postimg.cc/)
gif upload (http://postimg.cc/index.php?lang=turkish)
Delphi 6'da win32 komponent bölümünde TabControl ve PageControl adında iki bileşen buldum.
Form üzerine yerleştirdiğimde panelden bir farkını göremedim.
Panelden farkı nedir? Anlamadım?
Panele göre avantajını gösteren çok basit bir örnek verebilirmisiniz?
Sağ tuşa basıp Newpage ile sayfa ekleyebilmeniz lazım. Örnekde eklerim şimdi
bukadat TAB tasarım hatasıdır. Kullanıcıyı sıkar, MDI Form ve child form kullanın ben 5tab dan fazla tab kullanmamaya çalışırım.
Mümkün olduğu kadar Soldan Sağa Çalışırım.
Bendeki delphi XE, bende Lazrs.da yazdım https://yadi.sk/d/uveb2ACRm4aVN buradan exe ve kodu görebilirsiniz.
tabpanel MDI for çalışırsanız daha cok işinize yarar mdi child formlar iç içe açıldığında hangi form nerde diye aramak yerine tabpanelden tab index'e tıklayarak ilgili child pencereye geciş yapabilirsiniz. SDI formlarla çalışıyorsanız zaten çok ihtiyaç duymazsınız yinede kulanabilirsiniz ama tabcontrol nesnesinin erişimi daha kolaydır, tab panelde birsürü indexle uğraşmak zorunda kalabilirsiniz.Birazda yoğurt meselesi gibi.
Benim önerim design time'da tasarım kolaylığı sağlamak için zaten anladığım kadarıyla kullanıcı tab sheet hiç görmeyecek. Kullanıcı bolca tasarlanmış panellerden uygun olanını görecek sadece anladığım kadarıyla
@boreasProgram Win7 de çalışmadı. Programı delphi6 ya çevirip kullandım ama Tabshhet yok galiba. Tabcontrol var. Onu kullandım.
Alternatif fikir getiren arkadaşlar mümkünse küçük örnek program verirseniz sevinirim. (Açık koduyla)
delphi bilmem hiç kullanmadım
https://www.youtube.com/watch?v=P2myCPK-qzs (https://www.youtube.com/watch?v=P2myCPK-qzs)
Avast varsa o sıkıntı çıkarmış olabilir son sürümünde sorun çıkarıyor.
Panellerle çalışmaya devam etmeye karar verdim. Yalnız hala şu sorunu çözebilmiş değilim.
Forum üzerine iki ayrı yere panel koyalım.
Sonra penllerden birisini kısmen diğerinin üstüne taşıyalım.
Tasarım aşamasında mouse ile panellerden birisini tıklayıp sağ click yapıp control kısmında bring to front ya da send to back yapabiliyoruz.
Aynı işlemi runtime aşamasında nasıl yapıyoruz.
Panellerin visible özelliğine dokunmak istemiyorum hepsi visible olacak. Panelleri mili milime aynı ve üstü üste yerleştirip ekranda göstermek istediğimi en tepeye çıkartacağım.
Bunu nasıl yaparım?
EDIT
Boşu boşuna dert etmişim.
panel1.BringToFront;
panel2.SendToBack;
Panel dediğiniz nedir ben bilemedim,
VB de, buton, textbox gibi nesnelerden birden fazla sayıda nesneye "sınır koyan" Frame var.
Frame i sağa sola cekince içindeki nesneler de beraberce gider, yani frame e tabidir.
O frame X-Y koordinat (Top-Left) başlangıçlarını ana forumun boyutunun dışına uçuracak değerler girebilirsiniz. İçindeki bütün nesneler alan dışına cıkacağından görünmez olur, ancak o olaydan önce aktif olan buton falan kalmamalı, enter deyince onu tıklar. Ayrıca tabstop u da kapatmak gerek.
Guzel program yazmak ve hizli olmasini saglamak icin bu kotu bir yontem z hocam bilgin olsun. Sen panel frame vb kontrolleri sadece gorunmez yapiyorsun. Ama onlar hafizada hala duruyor. Mdi, child form yapisi kullanarak, her bir panel yerine bir form kullanarak istenilen yapilir. Mdi form uzerine konulacak bir menu ile istenilen child form acilir islem yapilir ve kapatilir.
Programı yazıp bitirmem lazım.
Panel yerine birden fazla form ile de çalıştım ama ortalıkta birden fazla özellikle de sürüklenip gezebilen form istemiyorum.
Mesela ana form açıkken bir butona tıklayınca ortaya çıkan yeni bir form işime gelmiyor. Ama formlar birbirine kenetlenecek ve ortada tek form görünecekse olur.
Bir de şöyle bir sıkıntı var.
Panellerden birisindeki veri değiştimi tüm panellerdeki nesnelerin veri değerleri bu değişen veriden etkilenmek zorunda. Bu yüzden panellerin visible değeri ile de oynayamıyorum çünkü bazı nesneler görünmez iken sistem değer atamaya vs kızıyor. Şimdilik panelleri üstü üste yerleştirip aktif olanı en tepeye almakta buldum çareyi.
Gerçi çözümü vardır da neyse.
Bu panelleri üst üste dizmesi iyi de tasarım aşamasında altlardaki bir paneli en üste getirmek çok zahmetli.
Diyelimki altlardaki panele bir komponent ekleyip çıkaracağız.Ancak üstteki panelleri sağa sola itip istediğim panele ulaşabiliyorum.
Yok mu bunun basit bir yolu.
Soldaki object inspector üzerinden panelin adı tıklanır. Forma baktığımızda Altta kalan panelin etrafında bir çerçeve olduğu görünecektir. bu çerçeve ile panelin yerini anlarız. inspector üzerinden panelin +sı tıklanır içindeki nesneleri seçebiliriz. Altta klan panelin çerçevesi görünüyor. fakat seçilen nesneler görünmüyor. ama nesnelerin olayları ve propertyleri object insepctor üzerinden ulaşılabilir.
bu kadarı işle yarar mı ki? Tasarım esnasında bu panelleri basamak gibi sıralamalı. program çalışırken orijinal konumlarına gelmesi için kod yazmalı.
@z hocam istersen müsait olduğunda teamviewer'dan bağlanıp sana delphi6'da page control'u göstereyim işini çözebilecek yegane bileşen o. Rahat rahat tasarımını yaparsın.
Delphi vs herşey proje makinemde ve o makine internete çıkmıyor hocam.
Z hocam sana ilginç bir şey anlatayım mı? muhtemelen şaşarsın. Tasarım aşamasında yukarıdan bir nesne alıp form üzerine yerleştiriyoruz. O da ne? nesne kımıl kımıl kımıldıyor. hareket bile edebilir icabında. bu durum tasarım aşamasında oluyor.
ne işe yarar? orası ayrı konu. belki bu nesneyi ekleyince kendisi 1500 tane başka nesne ekleyebilir. öyle kallavi bir nesne yani :)
Hocam Ben tabcontrol kullanıyorum. lazarus ile örnek aşağıda. Butonlarla istediğim sayfayı etkin yapıyorum. bazı projelerde çalışma esnasında sekmeleri gizli yapıp butonlarla geçiş yapıyorum.
http://www.sercanca.com/wp-content/uploads/2015/12/pagecontrol.rar (http://www.sercanca.com/wp-content/uploads/2015/12/pagecontrol.rar)
------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
begin
pagecontrol1.ActivePage := tabsheet1;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
pagecontrol1.ActivePage := tabsheet2;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
pagecontrol1.ActivePage := tabsheet3;
end;
------------------------------------------------------------------
@z eğer invisible yaptığınızda hata alıyorsan ve back front yapıyorsan gizldikletini kullanımını disable yapman veya TAB controlünü kapatman gerekebilir. Klavyeden TABla gizlediğin bir bileşene ulaşılabilir.
Eğer mümkünse formları tasarım esnasında görebileceğin şekilde yan yana diz, FormCreate olayına hepsinin Left Right aynı noktaya çekersin ve formu boyutlandırırsın.
form create oalyında hata alır objeler henüz create olmamış durumdadır. Show ya da paint daha uygun. Ama esas sıkıntı anladığım kadarıyla tasarım anında pek çok panelle uğraşmak. Sağa sola çekip durmak onunda dediğim gibi ya farklı formlarda tasarımı yapıp ana formdan çağıracak ya da notebook, page control bileşeni gibi birşey kullanacak.
http://www.megafileupload.com/e1hn/Project1.rar (http://www.megafileupload.com/e1hn/Project1.rar)
boyle bisi isini gorurmu
Hocam işin asıl çözümü sizin her bir panel içinde yaptıklarınızı panel olarak değil de User Control olarak tasarlamanızdır. Evet tab control de bir çözüm ancak tasarım zamanında her bir sayfanız ayrı bir form gibi görünür. Uygulama çalıştığında formda ilk olarak o User Controlu, formun controllerine eklerseniz ve pozisyonunu kod içinde ayarlarsınız. Başka sayfaya gideceğiniz zaman mevcut kontrolü formdan çıkarıp yenisini eklerseniz. Bu şekilde özetlenebilir. Arka planda hangi kontrolün gösterildiğini bildiğiniz için ona göre işlem yaparsınız.
edit1.visible := false yapıp içeriğini değiştirdiğimde bir hata almıyorum.
FormCreate Panel1 konumunu değiştirdiğimde bir hata almıyorum.
edit1.visible := false yapıncada içeriği değiştirebilirsiniz, görünür olması ya da olmaması erişilebilirliliği değiştirmez ama free yapılırsa hata alırsınız. Formcreate olayı şöyle anladığım kadarıyla objeler belli bir sırada oluşuyor diyelimki 40 tane bileşen var bunların bazıları siz komutu işletene kadar oluşuyor ama bazıları oluşamayabiliyor ve onlara eriştiğinizde hata alıyorsnuz. Mesela table ya da queryler var form açılınca open yapmak istediniz bir kısmı open oluyor ama bazende hata alabiliyorsunuz. Bu yüzden assign gibi bir komutla oluşup oluşmadığını kontrol etmek gerekiyor. Tecrübeyle sabit :)