Tam Sürümünü Görmek İçin : MFC kodu -2 soru
Flagrant
19/06/2007, 10:58
merhaba
formumda 1 button 2 editbox var. Yapmak istedigim gayet basit 1. editboxda yazilan sayiyi 2 ile carpip 2. editboxa atiyorum (buttona tiklandiginda) OnButton fonksiyonu asagida:
CString mac;
CEdit *editbox1;
editbox1 = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1));
editbox1->GetWindowText(mac);
int macint = atoi(mac);
macint *=2;
CEdit *editbox2;
editbox2 = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT2));
char *str;
str = new char[editbox1->GetWindowTextLength()];
itoa(macint,str,10);
editbox2->SetWindowText(str);
delete []str;
burada 2 sorum var;
1) reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT2)); boyle bir satir yazmadan bu isi yapmanin bir yolu var mi?
2) en son satirda delete[] str kisminda run-time error veriyor sebebi nedir? Bu satiri kaldirdigimda hata vermiyor ama tabi pointer arrayi silmemis oluyorum. Nasil silebilirim bu arrayi?
tesekkurler
lektroon
19/06/2007, 12:50
.....
.....
#include <iostream>
.....
.....
void CSoruDlg::OnBnClickedButton1()
{
CEdit *editbox1;
editbox1 = static_cast<CEdit*>(GetDlgItem(IDC_EDIT1));
if(editbox1->GetWindowTextLength())
{
std::string mac;
CString sz;
int macint;
editbox1->GetWindowText(sz);
mac = std::string(sz);
macint = 2*atoi(mac.c_str());
sz.Format("%d", macint);
mac = std::string(sz);
macint = atoi(mac.c_str());
CEdit *editbox2;
editbox2 = static_cast<CEdit *>(GetDlgItem(IDC_EDIT2));
editbox2->SetWindowText(mac.c_str());
}
}
Aslında girilen string'in numeric olduğunu da kontrol etsen iyi olur.
Flagrant
19/06/2007, 13:30
tesekkuler! c bilmedigim icin bu tarz kullanimlara asina degilim acaba
sz.Format("%d", macint);
satiri tam olarak ne yapiyor.
@Flagrant.
-editbox1=(CEdit*) GetDlgItem(IDC_EDIT1);
Bu sekildede yapabilirsin..
-sz stringine macint tam sayisini yazar.Yani sayi string oluyor diyebliriz.
acehreli
19/06/2007, 17:57
lektroon, konuyla ilgisi yok ama <iostream>'in eklenisini acikca gosterdigin icin sanki verdigin kodda gerekiyormus gibi sanilabilir.
<iostream> "cout << 42" gibi standart giris/cikis islemlerini bildirir. (Hatta aslinda standarda bakilirsa 'cout'u bile bildirmesi gerekmez. cout icin ayrica <ostream>'i eklemek gerekir, ama cout'u kullanmak icin <ostream>'i gerektiren kutuphane yok.)
Gosterdigin kodda std::string oldugu icin aslinda <string>'i eklemek gerekir. Senin ortaminda eger <iostream>'i ekleyince std::string'in bildirimi de geliyorsa; bu, kullandigin kutuphanenin bir yan etkisi. :) Yani en dogrusu aslinda <string>'i ayrica eklemektir.
Ali
Not 1: static_cast icin hicbir baslik gerekmez.
Not 2: atoi icin <stdlib.h> basligi gerekir. Veya, std::atoi olarak kullanilacaksa <cstdlib>.
Euclides
19/06/2007, 19:08
1-2 tavsiye vermek gerekirse, CString zaten std::string'in yaptığı işleri yapar, farklı farklı kullanmaya gerek yoktur.
LPCTSTR overload edilmiş bir operatordür. (LPCTSTR)x şeklinde byte array'e erişebilirsiniz.
atoi yerine _ttoi kullanırsanız daha mfc'imsi olur, unicode desteği vermiş olursunuz.
lektroon
20/06/2007, 09:05
acehreli,
<iostream>'i include edince, <string>'in de eklendigini bildigim icin onu include ettim. <string>'in kendisini include edersek, daha direkt bir anlatım yapmış oluruz, haklı olabilirsiniz. <stdlib.h> zaten include ediliyor, wizard tarafından. "static_cast icin hicbir baslik gerekmez" derken ne demek istediğinizi anlamadım açıkçası, onun için birşey include etmedim ki ben.
Euclides,
CString class'ının c_str() gibi bir metodu olmadığını gördüğüm için std:string kullandım.
cshell,
editbox1=(CEdit*) GetDlgItem(IDC_EDIT1);
demişsiniz. Bu iyi bir fikir değil bence. Evet çalışır ancak bu eski stil bir C-style type casting işlemi. C++'da static_cast gibi daha gelişmiş type casting operatörleri var. Onları kullanmak daha mantıklı.
Flagrant,
sz.Format("%d", macint);
satırı printf veya benzeri fonksiyonlarda görebileceğiniz formatting işlemini yapıyor. int tipindeki macint değişkeninin değerini alıyor, %d paremetresi ile onu string tipindeki sz değişkeninin içine atmasını sağlıyor. Örneğin macint'in değeri 5 ise, sz'nin değeri "5" oluyor, gibi.
lektroon
20/06/2007, 09:16
Euclides,
Ayrıca GetWindowText fonksiyonunun iki versiyonu var. Birincisinde string length bilgisi belirtmeniz gerekli, ikincisi ise CString tipinde bir referans alıyor. Bu da CString'i kullanmamın nedeni. MFC'yi çok fazla bildiğimi söyleyemem. MSDN'den fonksiyonlara ve detaylarına bakarak kodu yazdım. Çalıştığını görünce de post ettim.
acehreli
20/06/2007, 11:50
<iostream>'i neden ekledigini anlamaya calisirken static_cast'ten suphelenmistim. O yuzden "static_cast icin de eklenmis olamaz" diye soyledim.
Onemli bir konu degil tabii ama <iostream>'in <string>'i icermesinin standart oldugunu sanmiyorum. Yani baska bir ortamda eklenmiyor olabilir. Boyle soyluyorum ama g++ bile ekliyormus. :)
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.