x-kom hosting

Problem z C++ Builder 6

Kremius
komentarz
komentarz (edytowane)

Jeszcze jedno, ważne pytanie:
Czy można "wsadzić" do C++ mapkę Targeo / Google Maps z możliwością przybliżanie i oddalania widoku?

Potrzebuje jeszcze szybkiej odpowiedzi. Czy można zrobić tak, aby w komponencie ComboBox, kiedy nie ma nic wpisanego wpisywały się tylko wielkie litery, a kiedy długość będzie równa 1, żeby pisały się tylko małe litery? Z góry dzięki za szybką odpowiedź

P.S poprzedni post możesz zignorować

Edytowane przez Kremius

leggo
komentarz
komentarz

[quote name='Kremius' timestamp='1356962820' post='1652938'] Czy można zrobić tak, aby w komponencie ComboBox, kiedy nie ma nic wpisanego wpisywały się tylko wielkie litery, a kiedy długość będzie równa 1, żeby pisały się tylko małe litery? [/quote]
Rozumiem, że chodzi Ci o to by tekst wpisywany do pola rozpoczynał się od wielkiej litery? Jeśli rozwiążesz to tak jak napisałeś (sprawdzając ile liter zostało już wpisanych) nie będzie to działać poprawie. Może zdarzyć się sytuacja, w której w polu będą już wpisane jakieś litery (długość zawartości będzie większa od 1), a użytkownik przesunie kursor na początek pola i doda tam jakąś literę. W takiej sytuacji tekst będzie i tak zaczynał się małą literą.

Lepszym rozwiązaniem będzie, jeżeli przy każdej zmianie zawartości sformatujesz tekst.
Na początek sprawdzisz czy pole nie jest puste.
[CODE]
if(!ComboBox1->Text.IsEmpty())
[/CODE]
A następnie podzielisz tekst na dwa osobne łańcuchy: pierwszy zawierający tylko pierwszy znak (o indeksie 1) oraz drugi zawierający pozostałą część tekstu.
Na pierwszym łańcuchu stosujesz funkcję [b]UpperCase()[/b], a na drugim [b]LowerCase()[/b].
Później pozostaje Ci już tylko połączyć łańcuchy i wrzucić je do combo box.

Oczywiście nie musisz dzielić łańcucha jeśli długość tekstu będzie równa 1.
Na koniec będziesz jeszcze musiał pewnie przestawić kursor w polu w odpowiednie miejsce.

Kremius
komentarz
komentarz

Jeszcze taka sprawa. Załóżmy, że mam komponent [b]Edit1[/b] i chciałbym zrobić tak, aby po wpisaniu pierwszego znaku sprawdzał, czy nie jest to np. [b]W[/b] następnie sprawdzał, czy drugi znak nie jest to [b]E. J[/b]eśli by tak było to żeby dodawał spację i ustawiał kursor na końcu ciągu znaków (2 ostatnie akurat potrafię, tylko nie wiem jak zrobić, aby sprawdzał, jaki znak zostanie wpisany w ciąg znaków). W efekcie chciałbym aby po wpisaniu [b]WE00000[/b] automatycznie wyświetlał mi [b]WE 00000[/b], zamiast [b]BZA0000[/b] wyświetlał [b]BZA 0000[/b],itd. Głównie chodzi mi o to, jak sprawdzić co zostało wpisane do pola [b]Edit1[/b] jako pierwszy znak, drugi, itp...

Z góry dzięki za pomoc

leggo
komentarz
komentarz

Pierwszy znak:
[CODE]
Edit1->Text[1]
[/CODE]

Np. sprawdzenie czy w drugim polu jest litera 'a':
[CODE]
if(Edit1->Text[2]=='a')
[/CODE]

Oczywiście tutaj też musisz uważać, żeby nie sprawdzać pustego ciągu, ani nie wyjść poza jego zakres.

Kremius
komentarz
komentarz

wpisałem if (Edit1->Text[1]=="B"){
Label1->Caption->"Województwo Podlaskie"
}

wyskoczył mi błąd [b]Cannot convert char to char *[/b]

leggo
komentarz
komentarz

Błąd jest spowodowany tym, że użyłeś [b]"[/b] zamiast [b]'[/b].
Dodatkowo w linii 2. zamiast drugiej strzałki powinieneś użyć znaku równości.
[CODE]
if (Edit1->Text[1]=='B'){
Label1->Caption="Województwo Podlaskie";
}
[/CODE]

Kremius
komentarz
komentarz (edytowane)

Dzięki...

 

 

Edit 1

 

 

Wpisałem:

if ((Edit1->Text[1]=='B')&&(Edit1->Text[2]=='E')){

Label1->Caption="Warszawa-Mokotów";

}

 


Wywaliło mnie z programu z jakimś błędem.

Edytowane przez Kremius
leggo
komentarz
komentarz

Nie ma czegoś takiego jak "jakiś błąd".

 

[quote name='leggo' timestamp='1357155711' post='1662294'] Oczywiście tutaj też musisz uważać, żeby nie sprawdzać pustego ciągu, ani nie wyjść poza jego zakres. [/quote]

Kremius
komentarz
komentarz

Da się może zrobić, wyszukiwanie w czasie rzeczywistym, tzn. jak wpiszę np. A pokaże mi się lista wszystkich, które zaczynają się na A. Jak dopiszę B, pokaże się wszystko, co ma początek, AB w postaci listy, z której będę mógł wybrać poprzez kliknięcie?

Z góry dzięki

leggo
komentarz
komentarz (edytowane)

Jak sprawdzić co zostało wpisane do CB już wiesz.

Elementy do listy dodajesz tak:

 



ComboBox1->Items->Add("tekst");

 

A usuwasz tak:

 



ComboBox1->Items->Delete(x);

 

gdzie x jest numerem indeksu elementu do usunięcia.

Całą zawartość listy możesz wyczyścić w następujący sposób:

 



ComboBox1->Clear();

 

 

Oczywiście takie rozwiązanie wymagałoby od Ciebie przechowywanie danych w tablicy lub liście, by można było swobodnie na nich operować.

Edytowane przez leggo
Kremius
komentarz
komentarz

Mam jeszcze pytanie bardziej do prywatnego użytku? Otóż chciałbym się dowiedzieć, jak zrobić, program, który by odczytywał dane z jakiegoś pliku, powiedzmy dane.txt i wyświetlał je w odpowiednim formacie. Znaczy, tak aby imie było wyświetlane w Label1, nazwisko w Label2, wiek w Label3. Oraz aby można było to edytować (domyślam się, że nie mogą być wyświetlane w komponencie Label) i nadpisywać za poprzednie. Tak aby poprzednia wartość została zastąpiona nową. A także możliwość dopisania nowej pod koniec pliku dane.txt

Z góry dzięki

leggo
komentarz
komentarz

W tym raczej bulider Ci nie pomorze.

Do takich zabaw musisz wykorzystać klasy [b]ofstream[/b] i [b]fstream[/b] bezpośrednio z C++.

  • 2 tygodnie później...
Kremius
komentarz
komentarz

Mam jeszcze takie 2 pytania, praktycznie ze sobą związane:

1. Czy jest możliwość (i jak) zrobić mapę obrazów. Chodzi mi o to, aby po naciśnięciu w odpowiednią część mapki (np. Województwo) wyświetlały się różne informacje.

2. Czy jest możliwość, aby komponent Image miał zmienny kształt. Tzn aby przyjmował kształt od obrazka jaki jest do niego wczytany (np. okrągły, nierówne krawędzie, tak aby miał kształt województwa jaki do niego wczytam)?

leggo
komentarz
komentarz

Komponent Image może zmieniać kształt bazując na rozmiarach wczytanego obrazka, ale za to obrazek nie może być okrągły, ani mieć nierównych krawędzi. Pliki graficzne zawsze mają kształt prostokąta. Jeżeli grafika jest np. okrągła, to znaczy że otaczają ją piksele przezroczyste, ale one również są częścią obrazka. Dlatego [b]Image[/b] zawsze będzie kwadratowy.

 

Jeśli chodzi natomiast o "image map", to nie sądzę żeby bulider miał pod to jakieś gotowe rozwiązania.

Tutaj masz opisany, może nie najlepszy, ale za to szybki i prosty sposób jak osiągnąć taki efekt.

Kremius
komentarz
komentarz

Nie za bardzo zrozumiałem. Ale dzięki za pomoc...

leggo
komentarz
komentarz

Co jest dla Ciebie niejasne?

Kremius
komentarz
komentarz

Sam nie wiem. Może inne rozwiązanie. Czy można zrobić tak, aby sprawdzić współrzędne myszki i jeśli będą wynosiły 120,120 (np. województwem zachodniopomorskim) i klawisz myszy zostanie wciśnięty wtedy będzie wyświetlany odpowiedni obraz.

 

Druga sprawa. Próbuje dodać rzecz (która ma wspólne z pytaniem powyżej, ale nie koniecznie). Otóż wiem jak sprawdzić jaki jest pierwszy znak w komponencie Edit. Więc teoretycznie wiem jak zrobić, tak aby jeśli jako pierwszą literę wpiszę W wyskoczy mi woj. mazowieckie (tak aby pokazała się mapka z podpowiedziami dopóki nie usunę pierwszej litery), i to mi działa. Tylko jak skasuję wszystko (zrobię puste pole Edit) wyskakuje mi błąd. Gdyż jak sam wcześniej wspomniałeś w metodzie if (Edit1->Text[1]=='W') nie mogę sprawdzać pustego ciągu znaków. Wiesz może jak to naprawić? 

 

Mój kod wygląda mniej więcej tak:

if (Edit1->Text[1]=='B'){Image1->Picture->LoadFromFile("maps/B.jpg")} i tak dalej przez wszystkie wyróżniki, czyli C,D,E,F,G,K,L,N,O,P,R,S,T,W,Z

następnie mam wpisane:

if (Edit1->Text=="BI"){ treść odpowiedzialna wyświetlenie informacji dotyczących Białegostoku}

leggo
komentarz
komentarz (edytowane)

Sprawdzenie pozycji kursora:

Mouse->CursorPos.x;
Mouse->CursorPos.y;

Jednak najpierw musisz skądś wiedzieć, które z województw znajduje się na tej pozycji.


Co do drugiego pytania, to mam wrażenie, że już to pisałem...
Przed takim sprawdzeniem, sprawdzasz czy pole nie jest puste:

if(!Edit1->Text.IsEmpty())
Edytowane przez leggo
Kremius
komentarz
komentarz (edytowane)

Mam jeszcze 3 pytania:

1. Czy można zrobić coś w rodzaju aktualizacji. Tzn. powiedzmy, że będę miał stały adres, gdzie będę wrzucał nowsze wersje swojego programu, i jeśli kliknę w programie Menu Pomoc->Aktualizacja wtedy pobierze mi plik z tamtej strony i zastąpi za istniejący program, który wcześniej zostanie zamknięty?

 

2. Czy można zrobić, tak aby po kliknięciu w jakiś element wyświetlała się odpowiednia opcja, tak jak to jest w komponencie ComboBox (lub zmienić ComboBox, tak aby przypominał ListBox, czyli cały czas "otwarty").?

 

3. Czy można ustawić w ComboBox lub/i ListBox automatyczne sortowanie wg nazwy. Tak, że jeśli dopiszę jakiś element pod koniec zostanie on wyświetlony np. jako 5 (jeśli taka będzie kolejność alfaetyczna)?

Edytowane przez Kremius
leggo
komentarz
komentarz

1. Można, ale bulider Ci w tym nie pomorze. Najprostszym rozwiązaniem jest stworzenie osobnego programu zajmującego się aktualizacją. Program sprawdzałby czy istnieje nowa wersja i w razie konieczności pobierał nową wersję i wklejał w miejsce starej.

 

2. W ListBox-ie komunikat Click wysyłany jest tylko wtedy, gdy kliknięty zostanie jeden z elementów listy. Wystarczy więc, że będziesz po prostu reagował na ten komunikat, sprawdzał co jest wybrane i wykonywał akcję związaną z tym konkretnym wyborem.

 

3. Zarówno w przypadku CoboBox, jak i ListBox wystarczy, że w Object Inspector ustawisz właściwość [b]Sorted[/b] na [b]true[/b].

Kremius
komentarz
komentarz (edytowane)

Dzięki. Bardzo pomocne. Mam jeszcze takie pytanie, ponieważ zrobiłem wyszukiwanie pozycji z 2 ListBoxów, które mi działa. Problem jest w tym, że nie pokazuje dokładnie (czasami), jak wpiszę to zaznacza mi ten element, lecz jeśli coś dopiszę i nie ma elementu z tym dopiskiem to nadal mam zaznaczony wcześniej wyszukany element. Można to jakoś naprawić?

 

P.S Jak zrobić coś takiego jak MultiSelect, tak aby zaznaczało wszystkie pozycje, które zawierają wpisany ciąg znaków. Próbowałem z właściwością MultiSelect we właściwościach ListBox'ów, ale po tym nie działa mi wyszukiwanie. Jakaś rada?

Edytowane przez Kremius
leggo
komentarz
komentarz

Pokaż to wyszukiwanie.

Kremius
komentarz
komentarz (edytowane)
        if (Edit1->Text!=""){
        ListBox1->Perform(LB_SELECTSTRING, -1,(LPARAM)Edit1->Text.c_str());
        ListBox2->Perform(LB_SELECTSTRING, -1,(LPARAM)Edit1->Text.c_str());
        } else {
        ListBox1->ItemIndex = -1;
        ListBox2->ItemIndex = -1;
        }

 

Do tego chcę też dodać, że jeśli nic nie będzie zaznaczone, aby pokazał się komunikat "Nie znaleziono" (w komponencie Label4)

 

Edit 1

Application->MessageBoxA("Czy na pewno chcesz wyjść z programu", "Zamknij program", MB_ICONQUESTION | MB_YESNO);
        if (IDYES){
        Application->Terminate();}
        if (IDNO){
        }

 

Słuchaj. Chcę zrobić zapytanie o wyjście z programu. Mam powyższy kod. Moje pytanie co zrobić, aby działało poprawnie. Wciskam TAK to zamyka, wciskam NIE, to też zamyka.

Edytowane przez Kremius
leggo
komentarz
komentarz

Funkcja [b]MessageBox[/b] informuje o wybranym przez użytkownika przycisku poprzez parametr zwracany. Żeby dowiedzieć się więc co kliknął użytkownik, musisz pobrać wartość zwróconą przez funkcję i porównać ją z odpowiednią stałą. Np. tak:

if(IDYES == Application->MessageBoxA("Czy na pewno chcesz wyjść z programu", "Zamknij program", MB_ICONQUESTION | MB_YESNO)) Application->Terminate();

W kodzie który ty podałeś oba if-y się wykonywały, ponieważ wartości kryjące się pod stałymi są dodatnie. Jeśli się nie mylę [b]IDYES[/b]=6, a [b]IDNO[/b]=7.

 

Zaraz popatrzę na te listbox-y (potrzebny mi do tego drugi komputer).

  • Dobra wypowiedź 1
Kremius
komentarz
komentarz

Dzięki. Jakieś wieści na temat ListBox'ów. Jeszcze jedno, czy można zrobić zliczanie tych linii, które są wpisane do ListBox'u oraz nie są to puste ciągi znaków (jeśli dana linia nic nie ma, to żeby jej nie zliczało).

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.