CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Jak powiązać RadioGroup z Memo

Jak powiązać RadioGroup z Memo

dział ogólny

Jak powiązać RadioGroup z Memo

Nowy postprzez Przemyslav » niedziela, 25 maja 2014, 14:13

Witam wszystkich bardzo serdecznie :) Otóż piszę program do pikietażu - kilometrażu dróg pod C++Builder 6. Jego forma wstępnie tak:

Obrazek

W momencie wyboru drogi z ComboBox program wczytuje do RadioGroup i Memo plik tekstowy o składni następującej:

Kod: Zaznacz cały
37,4 - 41,8 km=Powiat Zgierski
41,8 - 362,9 km=Miasto Łódź
362,9 - 382 km=Powiat Łódzki Wschodni
399,8 - 416,1 km=Powiat Piotrkowski
416,1 - 447,5 km=Powiat Radomszczański
>> 447,5 km=Województwo Śląskie - Kierunek Częstochowa


I teraz mam problem jak rozwiązać kwestię wyboru z RadioGroup, gdyż lista kilometrów jest różna dla różnych dróg i w momencie wyboru właściwego kilometra chciałbym, aby w Memo lub nawet Label był wyświetlany dany powiat, a nie cała lista.

Kod wygląda tak:

Uni1.h

KOD cpp:     UKRYJ  
private:        // User declarations
        THashedStringList *Lista;


Unit1.cpp

KOD cpp:     UKRYJ  
void __fastcall TForm1::ComboBox3Select(TObject *Sender)
{
        //co zrobimy po wybraniu z listy dróg krajowych z ComboBox
        if (ComboBox3->ItemIndex == 0)
        {
                String sFileName = ExtractFilePath(ParamStr(0)) + "dat\\kraj1pik.dat";

                if(!FileExists)
                {
                        Application->MessageBox(("Nie odnaleziono pliku '" + ExtractFilePath(ParamStr(0)) + "dat\\kraj1pik.dat'!").c_str(), "Uwaga! Brak pliku", MB_OK | MB_ICONSTOP);
                        RadioGroup1->Items->Clear();
                        Memo1->Clear();
                        return;
                }

                Lista = new THashedStringList;
                Lista->LoadFromFile(sFileName);

                RadioGroup1->Items->Clear();
                Memo1->Clear();

                for(int i = 0; i < Lista->Count; i++)
                {
                        RadioGroup1->Items->Add(Lista->Names[i]);
                        Memo1->Lines->Add(Lista->Values[Lista->Names[i]]);
                }
                delete Lista;
        }
}


Byłbym wdzięczny za każdą pomoc :)
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Cyfrowy Baron » niedziela, 25 maja 2014, 15:20


Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Przemyslav
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Przemyslav » niedziela, 25 maja 2014, 16:21

Niby próbuje coś z:
KOD cpp:     UKRYJ  
RadioGroup1->Items->Strings[RadioGroup1->ItemIndex]...
RadioGroup1->Items->Objects[i]...
 


no i z ListBox, ale im dalej w las tym ciemniej :(
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Przemyslav » niedziela, 25 maja 2014, 16:53

Już poradziłem:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox3Select(TObject *Sender)
{
        //co zrobimy po wybraniu z listy dróg krajowych z ComboBox
        if (ComboBox3->ItemIndex == 0)
        {
                String sFileName = ExtractFilePath(ParamStr(0)) + "dat\\kraj1pik.dat";

                if(!FileExists)
                {
                        Application->MessageBox(("Nie odnaleziono pliku '" + ExtractFilePath(ParamStr(0)) + "dat\\kraj1pik.dat'!").c_str(), "Uwaga! Brak pliku", MB_OK | MB_ICONSTOP);
                        RadioGroup1->Items->Clear();
                        Memo1->Clear();
                        return;
                }

                Lista->Clear();
                Lista->LoadFromFile(sFileName);

                RadioGroup1->Items->Clear();
                Memo1->Clear();

                for(int i = 0; i < Lista->Count; i++)
                {
                        RadioGroup1->Items->Add(Lista->Names[i]);
                }
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
        delete Lista;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
        Memo1->Clear();
        Memo1->Lines->Append(Lista->Values[Lista->Names[RadioGroup1->ItemIndex]]);
}
//---------------------------------------------------------------------------
 
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Cyfrowy Baron » niedziela, 25 maja 2014, 20:41

No i widzisz, wystarczyło pomyśleć! Teraz lepiej zapamiętasz niż gdybym dał ci gotowy kod.



Użyłeś metody Append co w przypadku tego kodu jest jak najbardziej uzasadnione. Powinieneś jeszcze wiedzieć, że tak samo jak Append działa metoda Add. Różnica jest między nimi jednak taka, że Add zwraca numer indeksu do którego został dodany wiersz, np:

KOD cpp:     UKRYJ  
int index = Memo1->Lines->Add("jakiś tekst");


Wykazałeś się jednak niekonsekwencją, gdyż dla RadioGroup użyłeś metody Add, a wystarczyłaby Append.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Przemyslav
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Przemyslav » piątek, 30 maja 2014, 23:24

Dziękuję :)

Niestety witam ponownie, gdyż pojawił się nowy problem :(

Forma obecnie wygląda tak:

Obrazek

natomiast plik z danymi kilometrażu powiększył się o info dotyczące miejscowości itd... (to co w nawiasie):

KOD text:     UKRYJ  
37,4 - 41,8 km=Powiat Zgierski (Węzeł Stryków - ul. Strykowska)
41,8 - 362,9 km=Miasto Łódź (ul. Strykowska - ul. Rzgowska)
362,9 - 382 km=Powiat Łódzki Wschodni (m. Starowa Góra - Węzeł Tuszyn)
399,8 - 416,1 km=Powiat Piotrkowski (Węzeł Tuszyn - Węzeł Bełchatów)
416,1 - 447,5 km=Powiat Radomszczański (m. Poraj - m. Łęg)
>> 447,5 km=Województwo Śląskie (m. Wikłów)
Kod wygląda tak dla Memo po wybraniu z RadioGroup:

KOD cpp:     UKRYJ  
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
        // co się robi po kliknieciu w opcje RadioGroup1
        Memo1->Clear();
        Memo1->Lines->Append(Lista->Values[Lista->Names[RadioGroup1->ItemIndex]]);

        if (Memo1->Lines->Strings[0].Pos("Powiat Bełchatowski"))
        //if (Memo1->Lines->Strings[0]=="Powiat Bełchatowski") - wtedy gdy mamy tylko taki ciąg wyrazów i nic poza tym
        {
                belchatowski->Visible = true; //to sa tylko herby powiatow
                belchatowski->ShowHint = true;
                belchatowski->Hint = "Powiat Bełchatowski";
        }
        else
                belchatowski->Visible = false;
}


Czy jest jakaś możliwość odseparowania tekstu w Memo, tak, aby np. ciąg wyrazów
KOD text:     UKRYJ  
Powiat Zgierski (Węzeł Stryków - ul. Strykowska)
został podzielony w taki sposób, aby w 1 linijce Memo było tylko
KOD text:     UKRYJ  
Powiat Zgierski
a w 2
KOD text:     UKRYJ  
(Węzeł Stryków - ul. Strykowska)
Względy estetyczne. Niestety poddaję się z tymi łańcuchami znakowymi. Dziękuję z góry za pomoc :)
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Jak powiązać RadioGroup z Memo

Nowy postprzez Cyfrowy Baron » sobota, 31 maja 2014, 09:04

Musisz oprzeć się na nawiasach. Jeśli poza ostatnim nawiasem nic nie ma to wystarczy oprzeć się na pierwszym. Nie wiem po co wczytujesz cały plik do Memo skoro go widzę na formularzu, bo przecież można przetwarzać plik w pamięci np. w szybkiej liście THashedStringList. Niemniej jednak chodzi o to:

Przemyslav napisał(a):został podzielony w taki sposób, aby w 1 linijce Memo było tylko


Jest możliwe, ale nie możesz wczytywać tego pliku do Memo tylko do listy w pamięci, np:

KOD cpp:     UKRYJ  
THashedStringList *tmpList = new THashedStringList();
tnpList->LoadFromFile( "plik" );

for( int i = 0; i < tmpList->Count; i++ )
{
 String tmpText = tmpList->Strings[i];
 
 int p = tmpText.Pos( "(" );
 
 Memo1->Lines->Append( tmpText.SubString(p + 1, tmpText.Length() - 1 );
}

delete tmpList;


Nie testowałem tego kodu, ale powinien działać poprawnie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 7Firefox


  • 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ł: Brak zalogowanych użytkowników i 13 gości

cron