CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Działanie w zależności od klikniętego buttona

Działanie w zależności od klikniętego buttona

dział ogólny

Działanie w zależności od klikniętego buttona

Nowy postprzez swiezak » piątek, 21 stycznia 2011, 04:51

1. Program pytać usera czy ma przenieść wartość z memo1 do memo2. Jak uzależnić akcję od Buttona?
KOD cpp:     UKRYJ  
Label1->Caption = "Czy przeniesc: ";

for(int i = 0 ; i < Memo1->Lines->Count ; i++)
 {
        if(wcisne TAK)
        Label2->Caption = Memo1->Lines->Strings[i];
        Memo2->Lines->Add(Memo1->Lines->Strings[i]);
 }
}


2. tyle jezeli chodzi o TButtony, ale istnieje również MessageBox, przez któy rowniez mozna to uzyskać:
KOD cpp:     UKRYJ  
for(int i = 0 ; i < Memo1->Lines->Count ; i++)
{
String  a = Memo1->Lines->Strings[i];
if( Application->MessageBox("czy przeniesc? " +a , "blablbla",MB_YESNO | MB_ICONQUESTION) == IDYES ) // jak tu z tym 'a' ma być?
{
        Label1->Caption = "przenosze: " +a;

        Label2->Caption = Memo1->Lines->Strings[i];
        Memo2->Lines->Add(Memo1->Lines->Strings[i]);
 }
   };

Jak zrobić by w okienku wyświetlał przenoszony element?[/b]
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: Działanie w zależności od klikniętego buttona

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 08:49

Kurde nic nie kumam o co ci chodzi :| Wypełnij profil bo nie wiem jakiego kompilatora używasz.

1.
KOD cpp:     UKRYJ  
  if(MessageBoxA(this->Handle,"Czy przenieść","Pytanie",MB_YESNO|MB_ICONQUESTION)==mrYes) { // przenoszenie }  


2.

Zakładam, że 2010

String a = "Czy przenieść: " + Memo1->Lines->Strings[i];

KOD cpp:     UKRYJ  
Application->MessageBox(a.t_str() , "blablbla",MB_YESNO | MB_ICONQUESTION)



Nie wiem czy o to ci chodzi, ale ja tak interpretuje twoje wypowiedzi. Jak się mylę to mnie popraw.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Działanie w zależności od klikniętego buttona

Nowy postprzez Cyfrowy Baron » piątek, 21 stycznia 2011, 10:41

Ja również nic z tych pytań nie rozumiem. Przemyśl kolego co chcesz zrobić i opisz problem precyzyjnie, używając zrozumiałych sformułowań. Nikt nie będzie się domyślał o co Tobie chodzi. Jakie pytanie zadasz, taką otrzymasz odpowiedź.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Działanie w zależności od klikniętego buttona

Nowy postprzez swiezak » piątek, 21 stycznia 2011, 15:56

1.JPG


Mamy taki o to program. Po kliknięciu na przycisk "Zacznij przenoszenie" wywoła się pętla for tyle razy ile jest linii w Memo1, w ciele tej pętli będzie wywołanie okna potwierdzającego czy przenieść dany element ( ma wyświetlać jego treść np. "Czy przenieść [kota]"), jeśli user kliknie na TAK to element zostanie dopisany do Memo2, jeśli NIE to zapyta o kolejny element.

cyfbar-przenoszenie.rar


Corvis, to co napisałeś

KOD cpp:     UKRYJ  
Application->MessageBox(a.t_str() , "blablbla",MB_YESNO | MB_ICONQUESTION)


jest niby dobrze, ale muszę przed każdym Stringu dać wcześniej "L"

KOD cpp:     UKRYJ  
for(int i = 0 ; i < Memo1->Lines->Count ; i++)
{
                String a = "Czy przenieść: " + Memo1->Lines->Strings[i];

                if(Application->MessageBox(L"tu ma być ten String a", L"Pytanie",MB_YESNO | MB_ICONQUESTION) == ID_YES)         /* tto jak tutaj pierwszy argument ma wyglądać? Jakąś konwersję  muszę chyba przeprowadzić */
                {
                 Memo2->Lines->Add(Memo1->Lines->Strings[i]);
                }
 }



Oprócz tego zastanowiło mnie jak uzyskać taki efekt jak powyżej jednak nie korzystając z MessageBoxa, tylko samemu zrobić takie okienko (nie mówię tu, że ma się wywoływać nowy Form) dodałabym TLabel, TButton dwa razy.

KOD cpp:     UKRYJ  
String a = "Czy przenieść: " + Memo1->Lines->Strings[i];
Button1->Caption = "Tak";
Button2->Caption = "Nie";
Label1->Caption = a;


Coś na zasadzie:

2.JPG


Mam nadzieję, że wystarczająco jasno wyjaśniłem.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Firefox

Re: Działanie w zależności od klikniętego buttona

Nowy postprzez Cyfrowy Baron » piątek, 21 stycznia 2011, 16:31

Teraz jak uzupełniłeś profil widać z czym masz problem, a chodzi to, że w środowiskach C++Builder 2009 i 2010 domyślnie używana jest zmienna typu UnicodeString, a nie AnsiString przez co niektóre wartości wymagają konwersji. Dużo zależy jak masz ustawione mapowanie w środowisku na char czy wchar_t.
Problem dokładnie opisałem w tym poście: http://programowanie.cal.pl/forum/viewtopic.php?f=16&t=1098&p=7401&hilit=#p7401

Co się zaś tyczy twojego kodu, to zależnie od mapowania. Jeżeli masz ustawione mapowanie na char to funkcji Application->MessageBox używasz tak:

KOD cpp:     UKRYJ  
String  a = Memo1->Lines->Strings[ i];
Application->MessageBox( ("czy przeniesc? " + a).c_str(), L"blablbla",MB_YESNO | MB_ICONQUESTION) == IDYES


Dodając do siebie dwie wartości typu String, z których jedna lub wszystkie są w zmiennej tego typu - a typ String w C++Builder 2009 i 2010 zawsze jest typem UnicodeString, a nie jak wcześniej AnsiString - musisz użyć metody c_str(). W przykładzie dodawane wartości to: "czy przeniesc?" i a.
Natomiast podając bezpośrednio wartość String, czyli po prosty teks bez zmiennej, tutaj jest to wartość: "blablbla" przed tekstem wprowadzasz symbol duże L, które służy właśnie do konwersji z UnicodeString na wchar_t.

W C++Builder 2009 i 2010 funkcja Application->MessageBox ma taką konstrukcję:

KOD cpp:     UKRYJ  
int __fastcall MessageBoxA(const wchar_t * Text, const wchar_t * Caption, int Flags);


Podczas gdy we wcześniejszych wersjach jest tak:

KOD cpp:     UKRYJ  
int __fastcall MessageBoxA(const char* Text, const char * Caption, int Flags);


Jak zapewne pamiętasz we wcześniejszych wersjach używając tej funkcji również musiałeś stosować konwersję za pomocą funkcji c_str(), gdy dodawałeś zmienne typu String, ale nie musiałeś stosować symbolu L, gdyż dokonywała się niejawna konwersja z AnsiString na char.

Jeżeli mapowanie masz ustawione na wchar_t to możesz stosować zarówno c_str() jak i t_str() do konwersji UnicodeString (String) na wchar_t. Jeżeli jednak chcesz konwertować AnsiString na wchar_t to musisz użyć funkcji WideString i c_bstr().

KOD cpp:     UKRYJ  
 AnsiString a = "jakiś tekst";
 Application->MessageBox(WideString("Komunikat" + a).c_bstr(), L"test", MB_OK);
 //lub
 Application->MessageBox(WideString(a).c_bstr(), L"test", MB_OK);


Chcąc natomiast dokonać konwersji z UnicodeString na char trzeba najpierw dokonać konwersji na AnsiString a potem na char:

KOD cpp:     UKRYJ  
void Funckja(char *tekst)
{
 ShowMessage( (String)tekst );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String a = "jakiś tekst"; // String = UnicodeString

 Funckja( AnsiString(a).c_str() );
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Działanie w zależności od klikniętego buttona

Nowy postprzez Cyfrowy Baron » piątek, 21 stycznia 2011, 16:38

jest niby dobrze, ale muszę przed każdym Stringu dać wcześniej "L"


Musisz, a powód opisałem w poprzednim poście.



Oprócz tego zastanowiło mnie jak uzyskać taki efekt jak powyżej jednak nie korzystając z MessageBoxa, tylko samemu zrobić takie okienko (nie mówię tu, że ma się wywoływać nowy Form) dodałabym TLabel, TButton dwa razy.


Jeżeli nie nowy Form, formularz, okno to co. MessageBox to też nowe okno, tyle że systemowe, czyli przywoływane z API systemu Windows.
Przeczytaj sobie w serwisie Cyfrowy Baron dział API, porady:
  • Wywoływanie nie modalnego okna komunikatu.
  • Tworzenie okien komunikatów o dowolnym kształcie.
  • Obsługa komunikatów (MessageBox).



Podany kod powinien wyglądać tak:

KOD cpp:     UKRYJ  
for(int i = 0 ; i < Memo1->Lines->Count ; i++)
{
                String a = "Czy przenieść: " + Memo1->Lines->Strings[i];

                if( Application->MessageBox( a.c_str(), L"Pytanie", MB_YESNO | MB_ICONQUESTION) == ID_YES)
                {
                  Memo2->Lines->Add(Memo1->Lines->Strings[i]);
                }
 }
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 4 gości