Pobieranie danych z pola Edit i jego ukrywanie

0

Witam,
mam kłopot: pobieram dane z pola Edit w ten sposób:

AnsiString c_str=Edit1->Text

Ponieważ Edit staje się Visible podczas Clicka na Image, chciałbym zrobić dwie rzeczy:

  1. w momencie wpisania do Edit znaku i/lub po nacisnięciu Enter pole Edit ma byc Visble=false
  2. tekst z pola Edit, juz jako c_str ma zostać użyty w funkcji Clicka, czyli wyglądałoby to tak, jakbyśmy wychodzili z funkcji OnClick w Image, wchodzili do Edit, tam wpisywali, pobierali ten tekst z powrotem do OnClicka.... jest takie "zawieszenie" funkcji mozliwe? (w zależności od wpisanego tekstu ma pobrać do Image'a funkcja switch inny Picture)

To mój pierwszy projekt w C++Builderze. Poproszę o ew. podpowiedź, inne rozwiązanie jeśli moje jest z góry uznane za niemożliwe:)

0

hehe... śmieszne, ale prawdziwe... możliwe, że dlatego, że poświęciłem już jakis kawałek swojej pracy nad tym projektem, to za wszelką cenę chcę uparcie brnąć w tym kierunku.. szkoda mi tego co zrobiłem.
w każdym razie brak mi wiedzy na temat możliwości wykorzystania właściwości i eventów obiektów w Builderze... Poproszę Was o nazwę książki z celnymi, prosto wytłumaczonymi tychże w Builderze. cofnę się, aby nabrać rozpędu...

2

@k1313: myślę, że nikt w tym wątku nie odpowiedział, dlatego że nikt nie zrozumiał tego co chcesz zrobić. Spróbuj więc jeszcze raz wytłumaczyć o co chodzi w tych dwóch punktach. ;)

Jeśli o lekturę chodzi, to dokumentacja dostarczona wraz ze środowiskiem w zupełności wystarczy (ew. skorzystaj z tej dostępnej w sieci). Znajdziesz tam wszystkie potrzebne informacje na temat systemu zdarzeń.

0

To ja może dopowiem odnośnie książek. Jak tak @furious programming napisał. Najważniejsza jest dokumentacja. W moim doznaniu jest ona dobrze zrobiona, łatwo się w niej połapać. Jednak jeśli szukasz jakichś książek to niestety muszę Cię zmartwić. Odnośnie C++ Builder'a dawno nie wyszła żadna nowa sensowna książka. Są co prawda jakieś starocie opisujące programowanie w C++ Builderze 6 czy nawet 5 (nie pamiętam tytułów, ale są nawet przekłady w naszym języku 5-tka w wersji dwutomowej 6-tka w jednym od Heliona). Do wprowadzenia i poznania filozofii można by przeczytać. Jednak reszta to studiowanie dokumentacji.

0

ok, spróbuję jeszcze raz, poprzedni post pisany był w momencie całkowitej pomroczności jasnej, podczas prób kodowania... ciężko wtedy mysleć jak człowiek, eech..

  1. program ma pozwalać użytkownikowi nadać wartość liczbową (i wyświetlić ją) komórki pól Sudoku (81)
  2. tak sobie umyśliłem, znalawszy piękną grafikę (!sic! kajam się...), że komórkami tymi będą Pola Image do których będę wczytywał odpowiedni Picture, w zależności od tego co wpisze użytkownik w pkt 1 (od 1-9)
  3. OnClick Image ma powodować, że:
    3a. pojawia się Pole Edit (zmiana Visible),
    3b. tam wpisujesz cyferkę i
    3c. po naciśnięciu Enter (PressKey) wczyta cyfrę z Edita, wybierze do wczytania Picture do Image oraz aktualizuje tablica 3D całego Sudoku.
    taki był/jest plan

teraz wytłumaczę, co potrzebuję:

  • OnClick Image'a startuje funkcję. Ta, w pierwszej linii pokazuje Pole Edit, wtedy użytkownik przechodzi do Edit, żeby wpisać cyfrę... A tymczasem w kolejnej linii funkcji OnClicka już chcę użyć tekstu z Edit, by wybrać obrazek.

A przecież nie da rady dwutorowo działać! ..muszę więc wybór obrazka umieścić w innym evencie. np. PressKey Edita... Ale Edit ma służyc wielu komórkom, więc musi zwracać tę wartość z powrotem do Pola, które go wywołało...JAK? (przepraszam za przydługi tekst, ale w trakcie pisania, parę rzeczy mi się wyjaśniało i w międzyczasie poprawiałem w programie)
Więc jak? Jak wrócić z powrotem do funkcji, która "otworzy" nam Edita, który po zmianie tekstu otrzyma chara/stringa..?

Edyta łąja mnie, mówiąc, żebym najpierw napisał program, który działa, a potem go sobie kwiatkował grafiką. No tak, ale tak czy siak, jak wrócić do funkcji z wartością?

1

Teraz przynajmniej wiadomo dokładnie o co chodzi. ;)

Z tego co widzę, całość można zamknąć dwoma zdarzeniami. Pierwsze to OnClick po kliknięciu w kontrolkę obrazka. W tym zdarzeniu pobierz współrzędne tej kontrolki, wyczyść zawartość pola edycyjnego i wyświetl je w odpowiednim miejscu w oknie. Dodatkowo, zapamiętaj np. w dodatkowym polu klasy okna klikniętą kontrolkę, a dokładniej jej referencję. To będzie potrzebne w dalszej części.

Drugim zdarzeniem może być OnKeyPress. W nim sprawdź czy wciśnięto Enter oraz czy pole edycyjne zawiera poprawną liczbę. Jeśli tak, to ukryj pole edycyjne, na podstawie podanej liczby określ ścieżkę obrazka i za pomocą zapamiętanej w dodatkowym polu referencji, załaduj ten obrazek do kontrolki.

0

Jeeezu... jeszcze nie wszystko wiem jak zrobić z tego co powiedziałeś.:))) lecę na googla...

pobierz współrzędne tej kontrolki(...) zapamiętaj np. w dodatkowym polu klasy okna klikniętą kontrolkę, a dokładniej jej referencję. >

mam pobrać Left i Top? tak: int x=P1->left , int y=P1->Top ???

OnKeyPress. W nim sprawdź czy wciśnięto Enter (...) Jeśli tak, to ukryj pole edycyjne,

if (getchar()=='\n') Edit1->Visible=false; ?

za pomocą zapamiętanej w dodatkowym polu referencji, załaduj ten obrazek do kontrolki.

.....?

1
k1313 napisał(a):

mam pobrać Left i Top? tak: int x=P1->left , int y=P1->Top ???

Sądziłem, że to już masz. No ale tak, dokładnie o to chodzi. Wskaźnik na instancję klikniętej kontrolki dostajesz w parametrze Sender tego zdarzenia, więc użyj go do odczytania pozycji.

if (getchar()=='\n') Edit1->Visible=false; ?

getchar używa się w konsoli, a zdarzenie OnKeyPress dostarcza znak w parametrze Key. Jeśli ten parametr zawiera znak o kodzie 13 to znaczy, że wciśnięto Enter i to masz wybadać warunkiem.

za pomocą zapamiętanej w dodatkowym polu referencji, załaduj ten obrazek do kontrolki.

Zadeklaruj sobie dodatkową zmienną, do której wpisz Sender w zdarzeniu OnClick. Następnie w zdarzeniu OnKeyPress użyj tej zmiennej do załadowania obrazka.


Przykładowego kodu niestety nie podrzucę, bo od Borlanda używałem jedynie Delphi i w ogóle nie znam ichniejszego dialektu C++. Jeśli nie rozumiesz o czym piszę to musisz przysiąść i nauczyć się podstaw języka, bo bez tego ani rusz.

0

Wielkie dzięki!!, oczywiście, że siadam. :) nie ma innej opcji;)


znalazłem wiele przykładów użycia Sender.
próbuję kilka z nich, np.:

void __fastcall TSUDOkumacz::P1Click(TObject *Sender)
{
int x=(TImage*)Sender)->Left;
int y=(TImage*)Sender)->Top;
Edit1->Visible=true;
}

podczas kompilacji zgłasza błąd: cannot convert 'TImage*' to 'int'. w parametrach Left i Top nie ma int?

0

Ale czy aby na pewno to się kompiluje? Poprawnie powinno być tak:

void __fastcall TSUDOkumacz::P1Click(TObject Sender)
{
  int x=((TImage*)Sender)->Left;
  int y=((TImage*)Sender)->Top;
  Edit1->Visible=true;
}

Pominę już fakt korzystania z rzutowania w stylu C w C++.

Trochę się przyczepię do tego co @furious programming napisał. Ja tam jestem leniwy i nie pamiętam, że enter to 13. Bardziej elegancko będzie jak będzie się korzystało z tego http://docwiki.embarcadero.co[...]/Seattle/en/Virtual_Key_Codes oraz VK_RETURN :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0