Windows mesajları ~ String Parametre
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Windows mesajları ~ String Parametre
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...
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...
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Selam,
Mesajla string iletmek için sadece cast etmen yeterli:
Bunu yakalamak için de
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ç
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;
Kolay gelsin,
Bahadır Alkaç
Kod: Tümünü seç
application.messagebox(pchar('1.satır'+#13+'2.satır'),'baslik',MB_OK+MB_ICONERROR);

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
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

- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
@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.
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;
.
.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
@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.
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.
- Murat hocam yanlış anladın, INI dosyası kullanın diye ısrar etmiyorum sadece ne istediğimizi bilelim diyordum... 
- 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.

- 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.
@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...
@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.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim: