Windows mesajları ~ String Parametre

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Windows mesajları ~ String Parametre

Mesaj gönderen ulu coder »

Merhaba.

Windows mesajı ile yapmam gereken bi şey var.
Tıpkı bu linkte olduğu gibi
Fakat durum biraz farklı, string iki parametre (1 de olur) göndermem gerekiyor, nasıl yapabilirim?
Yardımlarınız için teşekkürler,

kolay gelsin...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Bence Mesaj yerine Windows Temp dizinine bir INI dosya aç, dilediğin kadar parameterik veriyi yaz. Sonra Mesaj yayınla ve yayını okuyan her kimse aynı adresten INI'yi okuyup değerlendirsin. Pratik çözümler her zaman en işlevsel sonuçları doğurur.
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

iki stringi araya null isareti veya daha farkli baska bir ozel isaret koyarak tek parametre olarak gonderin.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Mesajla string iletmek için sadece cast etmen yeterli:

Kod: Tümünü seç

var
  a:String;
  b:string;
begin
  a := 'bahadir';
  b := 'alkac';
  PostMessage(Handle, WM_USER, Integer(a),Integer(b));
end;

Bunu yakalamak için de

Kod: Tümünü seç

procedure TForm1.OnWMUser(var AMsg:TMessage);
var
  a, b:string;
begin
  a := string(Msg.WParam);
  b := string(Msg.LParam);
  ShowMessage(a + ' ' + b);
end;
Ama bir konuda uyarmam gerekiyor. İki farklı uygulama arasında bu mesajlaşma işlemi yürümez. Eğer bu mesajlaşma iki farklı uygulama arasında ise WM_COPYDATA (Sanırım buydu) mesajını incelemeni tavsiye ederim.

Kolay gelsin,
Bahadır Alkaç
ozzyksk
Üye
Mesajlar: 32
Kayıt: 02 Ara 2005 10:22
Konum: Karşıyaka/İZMİR

Mesaj gönderen ozzyksk »

Kod: Tümünü seç

application.messagebox(pchar('1.satır'+#13+'2.satır'),'baslik',MB_OK+MB_ICONERROR);
Bu işini görür ;)
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Selam,

cevaplarınız için teşekkürler.

Cevapları okumadan önce biraz uğraştım ve string veriyi döngüye sokup her karakterin ASCII kodunu gönderdikten sonra işlem bitti mesajı göndererek şimdilik hallettim. @opt2000'nin çözümü daha iyi, ama bütün gece uğraştıp yaptıktan sonra şimdi kodlara dokunmaya korkuyorum :roll:
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

@opt200 arkadaşımızın örneği yaklaşım olarak doğru ama PostMessage ile değilde SendMessage ile gönderilirse güvenli olur. Çünkü SendMessage'de mesaj dönüşü beklenecektir. PostMessage denildikten sonra bir alt satırdan devam edecektir. Ki @opt2000 verdiği örnekte PostMessage'den sonra function bitiyor; A ve B değişkenleri fonksiyon bitiminde FREE olacaklardır.

Bu durumda PostMessage ile gönderilen A ve B nin pointerleri ilgili procedurde hatalara sebep verebilecektir. Şanslı iseniz, Post yapılan fonksiyon son bulmadan önce Post edilen fonksiyonda A ve B pointerlerini kulanabilirsiniz. Ama garantisi yok.

Garantili bir yöntem şöyledir.

Kod: Tümünü seç

.
.
.
Procedure Form1.GondericiClick(Sender: TObject);
var
   S : String;
   P : Pointer;
begin
   S := Adi.Text + ' - ' + Soyadi.Text;

   GetMem(P, SizeOf(Integer);
   Integer(P^) := StrToInt(Text1.Text);
   (*
   Şimdi Integer(P^)  göndermede kafanız karışmasın. 
   Böyle bir teknik lazım olabilir diye yeri gelmişken veriyorum.
   *)

   PostMessage(Handle,
               WM_USER + 1,
               Integer(P),                // Integer göndermek
               Integer(StrNew(PChar(S))); // String göndermek
end;
.
.
Procedure Form1.TextSeysi(Var Msg : TMessage);
var
   S : String;
   I : Integer;
   P1: Pointer;
   P2: PChar;
begin
   P1 := Pointer(Msg.WParam);
   P2 := PChar(Msg.LParam);
   S  := StrPas(P2);
   I  := Integer(P1^);
   StrDispose(P2);
   // Post edilen yerdeki String'i free ediyoruz.
   // Bundan böyle bu fonksiyon içinde S değişkenini kullanacağız.
   // Eğer StrDispose yapmazsak, bellkete hep kalır.
   // Şu aşamaya kadar GondericiClick fonksiyonu bitmiş olabilir.
   // Artık güvenle S değişkenini kullanabilirsiniz.
end;
.
.

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Arkadaşlar zama içerisinde hepimiz şunu öğrendik. "Siz Windows'un başını ağrıtmazsanız, Windows da sizin başınızı ağrıtmaz..." Ufkunuz geniş olsun ama basit düşünün :lol:
Resim
Resim ....Resim
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

@mrmarman öyle deme. Yüksek yoğunluk gerektiren işlemlerde iyi bir teknik kullanmak iyidir. Evet basitinden ini dosyası hatta daha iyisi Regisrty kullanmak kolay gelebilir. Ama bilgi güvenliği ve performans açısından kötü sonuçlar doğurabilir.

Bir INI dosyasını açmak, key'i bulmak (eğer varsa), kayıt etmek vs. işlemler acayip CPU döngüsü istiyor. Farkında olmasakta kod tarafında oradan oraya bir sürü iş yapıyor. Ne için sadece basit bir STRING değerini kaydetmek ve okumak için.

Windows bana göre bu tip yaklaşımda olan programları değil, sistemi yormayan ve optimize edilmiş kodlarla daha mutlu olacaktır.

Yeri gelmişken, Microsoft yazılım camiasını özellikle Win32 camiasını darma duman etme girişimleri, hep hatalı kodlama sonuçlarından doğan Windows'a atılan çamurların temizlenmesi için düşünülmüştür. Bu nedenle, bari .NET falan yapalımda bellek taşması vs. sebeplerden ötürü sistem güme gitmesin demişlerdir.

Bazen program yayınlanan paket programları yüklüyorum ve görüyorum ki çoğunda bellek taşması ve aşırı CPU kullanımı var. En son bir arkadaşımızınbir programını indirip yükledim. Program içinde saat konulmuş. Güzel hoş, ama taskmanager ile programı izlemeye aldığımda saniyede bir bellek artıyor. Artıyorda artıyor. Hiçbir kontrol ve optimize yapılmamış. Bu progamın 5-6 saat çalıştıktan sonraki halini düşünemiyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Murat hocam yanlış anladın, INI dosyası kullanın diye ısrar etmiyorum sadece ne istediğimizi bilelim diyordum... :o

- Edit -

- Cevap hakkı doğurmamak için ekleme yapıyorum.. Sanki @ulu coder ne istediğini bilmiyormuş gibi oldu kusura bakmasın...

- ifade etmeye çalıştığım, soru sorarken ne yapmak istediğimizi de eklersek, o kadar köftelik malzeme kullanırız.
Resim
Resim ....Resim
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

@muratdicle hocam çok teşekkür ederim, açıklayarak kodları yazmışsınız...

@mrarman, amacım windows message kullanımını öğrenmekti. Karşılaştığım sorunu çözmek için kullanabileceğim başka bir çok yol vardı ama windows message'ı öğrenmek için güzel bi fırsattı, değerlendirdim.

Cevap yazan herkese teşekkürler, kolay gelsin...
En son ulu coder tarafından 17 Mar 2007 05:10 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

:D @mrmarman yanaklarından öpüyorum.
Cevapla