Formdaki Nesneye Captiondan Ulaşmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Formdaki Nesneye Captiondan Ulaşmak

Mesaj gönderen Abrak »

Selam Arkadaşlar 1 haftadır ısrarla olacağına inandığım için araştırıyorum ama hala bulamadım fikri olan paylaşırsa memnun olurum.

Diğer Formdaki nesneye formun captionundan nasıl ulaşabilirim.

yani formun ismini dikkate almıyorum oluşan formun captionuna göre içindeki nesneye müdahale etmek istiyorum.

tabiki;

Kod: Tümünü seç

function yaz(bul:string) :string;
var
i:integer;
begin
for i:=0 to form1.MDIChildCount-1 do
begin
if form1.MDIChildren[i].Caption = bul then result := form1.MDIChildren[i].Name;
application.ProcessMessages; 
end;
end;
Şeklinde ulaşmak mümkün olacaktır fakat benim istediğim döngü falan kullanmadan ulaşmak umarım anlatabilmişimdir
Saygılarımla
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
ertug
Üye
Mesajlar: 82
Kayıt: 10 Ara 2004 05:41

Mesaj gönderen ertug »

Merhaba,
İstediğiniz aşağıdaki gibi bir uygulama mı?

Yeni bir uygulama açın. İkinci bir form (Form2) ekleyin. İlk forma (Form1) bir düğme ekleyin.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  aForm: TForm;
begin
  aForm := TForm(Application.FindComponent('Form2')); //<- typecast
  if Assigned(aForm) then //<- bu kontrolü yapmazsak ve form bulunamazsa AV verecektir
    aForm.Show;
end;
O form içerisindeki bir nesneyi bulmak için, (Form2)ye bir (Edit1) koyun.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  aForm: TForm;
  anEdit: TEdit;
begin
  aForm := TForm(Application.FindComponent('Form2'));
  if Assigned(aForm) then
  begin
    anEdit := TEdit(aForm.FindComponent('Edit1'));
    if Assigned(anEdit) then
      anEdit.Text := 'Delphi''yi seviyorum';
    aForm.Show;
  end;
end;
Ertuğ Kaya
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

selam;
Verdiğiniz örnekte Form2 dediğiniz form ismi ama ben form nameyi kullanmadan direk captiondan ulaşmak istiyorum form nameyi bilmiyorum ve döngülerle bulmak istemiyorum direk

Kod: Tümünü seç

FindComponent('Form2'));//Form2 caption
buna benzer bir şekilde ulaşmak mümkünmü onu öğrenmek istiyorum
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

sanırım dediginiz sekilde cagıracak bir yontem yok
en azından bir nesneyi cagırmak iicn class ismini ve kendi ismini bilmeliyiz.
FindWindow apisi ile yine classismini girmek gerekiyor ama ben bir ornnek ile yapmaya calıstım forma ulasamadım

Butun bunların yerine Anaformda private bit TStringList iniz olsun
Formları olustururken bir method ile olusturun
ve listeye FListe.Add('Form adı',FrmFormum) seklinde ekleyin
cagıracagınız zaman listede ismi arayın varsa
aForm:=TForm(FListe.Objects[formunindexi]) ile bu forma ulasmanız gerek

tabi en onemli noktalardan biride bu formlar free edilince listeden de silinmeli
ÜŞENME,ERTELEME,VAZGEÇME
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

en azından bir nesneyi cagırmak iicn class ismini ve kendi ismini bilmeliyiz.
FindWindow apisi ile yine classismini girmek gerekiyor
gkimirti bey;
class ismini biliyorum class isimleri sabit TForm2 bu bilgiye göre mümkünmü birdaha zorlayabilirmisiniz
teşekkür ederim
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

hocam malesef findwindow ve findwindowex ile captionı verilen forma ulasamadım
GoogleGroups ta birkac ornek kullanım gostermisler ben win2000 de denedim ,olmadı...
yaptıklarımı buraya gonderiyorum belki fikir verir.
ama dedigim gibi TStringList ile yapılabilir bence.
child formları nasıl cagırıyorsunuz?

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  ChildWindow:TForm;
begin
  ChildWindow:=TForm(FindWindowEx(Form1.Handle,0,PChar('TForm2'),PChar('2.cocuk form')));
//  ChildWindow:= TForm(FindWindow(PChar('TForm2'),'2.cocuk form'));

  if Assigned(ChildWindow) then
    ShowMessage('pencere var')

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
  begin
    Caption := '1.cocuk form';
    Show;
  end;

  with TForm2.Create(nil) do
  begin
    Caption := '2.cocuk form';
    Show;
  end;
end;

end.
ÜŞENME,ERTELEME,VAZGEÇME
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

Uğraşınız için teşekkür ederim;
Tform2.create(self); ile çağırıyorum

Bu Findwindow.. larda iş bitiyor ordan handle numarasını alabiliyoruz aldığımız handle numarasına görede pencere ismini alacağız sanırım uygulama mantığı olarak bu geliyor sanırım, ama cevap olduğuna inancım dahada arttı :(

Sağolun tekrar kolay gelsin. Saygılarımla;
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
ertug
Üye
Mesajlar: 82
Kayıt: 10 Ara 2004 05:41

Mesaj gönderen ertug »

Merhaba,

Sizin cevap yolladığınıza dair gönderilen e-postayı atlamışım. O yüzden geç fark edebildim. Bunun için ve sorunuzu yanlış değerlendirdiğim için kusura bakmayın.

FindWindow metodu bence iyi bir metod değil. Zira bulmak istediğiniz formun create edilmiş ve handle almış olması gerekmektedir. Ayrıca Delphi açıkken Delphi içerisindeki design-time formu ile karışacağından debug etmek de zordur. Yine de handle üzerinden gitmek isterseniz yapmanız gereken, elinizde "handle"ı olan forma bir mesaj göndermek olacaktır. Karşıdaki form da bu mesajı yakalayarak bir prosedür çalıştırmalı ve yapmak istediğinizi o prosedür içerisinde yapmalısınız.

Kod: Tümünü seç

 {test edilmemiş}
const
  UM_MESAJ = WM_USER + $1; //veya başka bir sayı

//...

var
  FormHWND: HWND;
//...
  FormHWND := FindWindow(nil, 'Diğer Form');
  PostMessage(FormHWND,  UM_MESAJ, 0, 0); 
Alıcı formda, test edilmemiş

Kod: Tümünü seç

const
  UM_MESAJ = WM_USER + $1; //veya başka bir sayı
//...

private
  procedure UM_Mesaj(var aMsg: TMessage); message UM_MESAJ;

//...
procedure UM_Mesaj(var aMsg: TMessage); 
begin
  //...
end;
Bu çok etkili bir yöntem olmayacaktır. Formun mesaj gönderildiği anda görünür veya görünmez olarak çalışıyor olması gereklidir (önceden create edilmeli).

gkimirti arkadaşımızın önerdiği liste üzerinden forma ulaşmak daha etkili bir yol olacaktır. Ancak bu metodda da formlar yaratılmış olmalıdır.

Eğer istediğiniz yaratılmamış formları "caption"larına göre seçerek yaratmaksa o zaman daha farklı bir yola girmek gerekecektir.

Uygulamanız hakkında biraz daha detay verebilir misiniz?

Ertuğ Kaya
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

olay kısaca şöyle;
Çalışma sırasında Create edilmiş 50 tane TForm2 childform var ve veri girişi var bu veriler geldiğinde ilgili captionlu formlara bu veriler yazdırılacak captiondan ulaşmamdaki sebep form nameleri gerektiğinde /,-,% gibi isimler veremediğinden kullanıcı nameleri kullanamıyorum

aslında şöyle bir kod kullanıyorum;

Kod: Tümünü seç

function yaz(bul:string) :string; 
var 
i:integer; 
begin 
for i:=0 to form1.MDIChildCount-1 do 
begin 
if form1.MDIChildren[i].Caption = bul then result := form1.MDIChildren[i].Name; 
application.ProcessMessages; 
end; 
end; 
Ama benim uğraşım ise bu kodda kasma olabileceğini düşünerek daha kısa ve kullanışlı bir formül
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
ertug
Üye
Mesajlar: 82
Kayıt: 10 Ara 2004 05:41

Mesaj gönderen ertug »

Abrak yazdı:olay kısaca şöyle;
aslında şöyle bir kod kullanıyorum;

Kod: Tümünü seç

function yaz(bul:string) :string; 
var 
i:integer; 
begin 
for i:=0 to form1.MDIChildCount-1 do 
begin 
if form1.MDIChildren[i].Caption = bul then result := form1.MDIChildren[i].Name; 
application.ProcessMessages; 
end; 
end; 
Ama benim uğraşım ise bu kodda kasma olabileceğini düşünerek daha kısa ve kullanışlı bir formül
Programcılıktaki en büyük yanlışlıklardan birine düşmüşsünüz. Yazdığınız kod bence yapabileceğiniz en iyi uygulama, daha iyisini arayıp vakit kaybetmenize gerek yok. 50 tane form tarayan bir döngü için, performans zaten çok önemli değildir. Yazdığınız kod çalıştığına göre sorun yok demektir.

Kodunuzu biraz daha geliştirebilirsiniz.

Kod: Tümünü seç

function Yaz(Bul:string): String; 
var 
  i: integer; 
begin 
  for i := 0 to Form1.MDIChildCount - 1 do 
  begin 
    if Form1.MDIChildren[i].Caption = Bul then 
    begin
      Result := Form1.MDIChildren[i].Name; 
      Break;  //bulunca döngüden çık
    end;
  end; 
end; 
Size diğer bir tavsiyem yazdığınız kodda, dil geliştiricinin tavsiye ettiği yazım kurallarına uymanızdır. Büyük küçük harflere, satırların başladığı yerlere vs. dikkat ediniz. Bu sayede kodlarınız standart ve daha okunaklı olacaktır. Özellikle takım çalışması içinde herkesin standart kod yazması çok önemlidir. :D

Ertuğ Kaya
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

Bu konuda haklısınız baya vakit kaybettim sağolun görüşlerinizi paylaştığınız için
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
Cevapla