CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - StringGrid - częściowa edycja komórek
Strona 2 z 3

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: czwartek, 7 lutego 2013, 12:51
przez oneiro
Dziękuję Wam za uwagi, ale skorzystałem z rady Barona, dopisanie.

KOD cpp:     UKRYJ  
     myPanel->Visible = false;
 


załatwiło sprawę, jest super.

PS. Będąc przy StringGridzie - dlaczego, jeśli podczas pracy zamienię wymiar StringGrida (np. z 8 wierszy zmienię na 48 wierszy) komórki zafiksowane (stałe) znikają? Radzę sobie poprzez nadanie szarego koloru, ale wraz z przewijaniem komórek, jeśli jest ich więcej niż pole potrafi wyświetlić, nagłówki znikają, tj przesuwają się (czyli komórki z Col=0).
Nie jest to uciążliwe, ale wygląda efektywnie.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: czwartek, 7 lutego 2013, 13:33
przez Cyfrowy Baron
Nie powinno się tak dziać. Pewnie znów masz coś w kodzie, co daje taki efekt. Możesz w kodzie wywołać dodawanie tych nagłówków:

KOD cpp:     UKRYJ  
StringGrid3->FixedCol = 1;
StringGrid3->FixedRows = 1;

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: piątek, 8 lutego 2013, 19:50
przez oneiro
Wrócę jeszcze je ComboBox'ów - jak odczytać aktualnie wybraną pozycję?

KOD cpp:     UKRYJ  
 Lista = new TStringList;
 Lista->Add("=");
 Lista->Add("<");
 Lista->Add("<=");
 Lista->Add(">");
 Lista->Add(">=");
 


Mam 5 pozycji do wyboru. Wykorzystałem kod z porady dotyczącej StringGridów i ComboBox'ów. Wszytko ładnie chodzi, potrafię odtworzyć zapisane wcześniej wartości (tj. przepisanie z tablicy tab_opt_sign_L i tab_opt_sing_P) za pomocą poniższego kodu:
KOD cpp:     UKRYJ  
for (unsigned i=0; i<9; i++)
  {
    Form1->myEditor->Items = Form1->Lista;

    Form1->StringGrid3->Cells[1][i+1] = Form1->myEditor->Items->Strings[Param.tab_opt_sign_L[i]];
    Form1->StringGrid3->Cells[3][i+1] = Form1->myEditor->Items->Strings[Param.tab_opt_sign_P[i]];

    Form1->MoveEditor();
    Form1->myPanel->Visible = false;
  }
 


A jak zrobić w 2-gą stronę, tj zapisać aktualnie wybraną pozycję w ComboBox'ie? Oczywiście mogę po prostu odczytać wartość komórki StringGrida i odczytaną wartość dopasować do mojej listy , ale na pewno da się to powiązać z wartości Lista->Stringa[i], gdzie "i" to wybrana pozycja.
Chodzi mi o to, że chcę zapisać nr pozycji listy, a nie wartość. I w dodatku wiedzieć, jaka to komórka w StringGridzie.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: piątek, 8 lutego 2013, 19:56
przez Mironas
int pozcja = lista->IndexOf("<=");

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: piątek, 8 lutego 2013, 20:36
przez oneiro
:) dobre, ale mimo wszystko, czy da się inaczej, np. podczas wybieranie pozycji "<=" od razu zapisze mi dodatkowo gdzieś (np. w jednej z moich tablic) korzystając z dynamicznych elementów, które odpowiedzialne są za działanie ComboBoxów w StringGridzie (pozwoli mi to lepiej zrozumieć działanie całego mechanizmu).

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 00:59
przez Cyfrowy Baron
oneiro napisał(a):podczas wybieranie pozycji "<=" od razu zapisze mi dodatkowo gdzieś (np. w jednej z moich tablic) korzystając z dynamicznych elementów


Napisz to w jakiś zrozumiały sposób, bo nie rozumiem o co Tobie właściwie chodzi.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 01:41
przez oneiro
chciałbym skorzystać np. funkcji

KOD cpp:     UKRYJ  
myEditor->ItemIndex;
 


ale nie wiem jak, bo jak spróbuje wywołać powyższe dla elementu StringGrid dla zdarzenia OnClick lub OnMouseUp/Down, to nie zadziała (wartość -1), bo kliknięcie powoduje rozwinięcie listy i drugie kliknięcie powoduje wybór. A chcę zapisać zamianę "w locie" do swojej zmiennej tj. w trakcie zmiany od razu zapisać wybraną pozycję (tj pozycję StringLista). Tylko, że nie wiem jak.

Na razie mam zaimplementowaną metodę @Mironasa i zorganizowałem to tak, że przed odczytaniem znaków "przelatuję" obie kolumny ze znakami i zapisuję to do wewnętrznej zmiennej i dokonuję obliczeń (a być może uda się, bez tej dodatkowej zmiennej i co ważniejsze, ciekawi mnie jak to zrobić).

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 10:02
przez Cyfrowy Baron
Metoda ItemIndex zwraca tylko wybrany numer elementu listy. Zadziała dopiero gdy element listy zostanie wybrany, a nie jest wybierany, by jednak zadziałał na liście musi być wybrany jakiś element, w przeciwnym razie ItemIndex = -1. Możesz więc zapisać wartość wybraną na liście "w locie", ale musisz w tym celu dołączyć do obiektu myEditor zdarzenie OnSelect i zapisywać "w locie", ale właśnie w tym zdarzeniu.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 13:05
przez Mironas
Ja już pogubiłem się w temacie i nie wiem co aktualnie jest problemem.
Może spróbuj uprościć pytanie do minimum i dokładnie napisz co robisz i co chcesz uzyskać.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 13:47
przez Cyfrowy Baron
Z tego co się zorientowałem to on chce pobrać coś z listy ComboBox będącej elementem tabeli i od razu po wybraniu tego z listy, gdzieś to przepisać.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 14:09
przez Mironas
To pewnie zbyt banalne ale może podpiąć do ComboBox-a zdarzenie OnChange ?

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 14:52
przez Cyfrowy Baron
Ja sugerowałem zdarzenie OnSelect.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 16:21
przez oneiro
Dla Was to banał, ale ja sobie nie radzę. Chcę pobrać w czasie wyboru ComboBox'a wybraną pozycję i przypisać jaj do swojej zmiennej.

Z tego co się orientuję, zdarzenia OnChange oraz OnSelect StringGrid nie posiada, czyli muszę wpisać to w zdarzeniu dla ComboBox'a. I tu pojawia się (dla mnie) trudność - jak to zrobić, po lewej stronie nie mam Object Inspectora, bo jest to obiekt tworzony dynamicznie.

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 16:37
przez Mironas
Aby utworzyć sobie zdarzenie OnSelect albo OnChange postaw sobie na formie ChangeBox-a i w ObiectInspector utwórz dla niego to zdarzenie (przykładowa nazwa ComboBox1OnSelect). Potem możesz usunąć ChangeBox-a a zdarzenie zostanie.

UWAGA - jeśli nie wpiszesz nic do zdarzenia to podczas kompilacji zostanie usunięte.

Następnie podczas tworzenia dynamicznie ChangeBox-ów podpinasz im to zdarzenie:
KOD cpp:     UKRYJ  
  nowychangebox->OnSelect = ComboBox1OnSelect;
 

Re: StringGrid - częściowa edycja komórek

Nowy postNapisane: sobota, 9 lutego 2013, 18:13
przez Cyfrowy Baron
oneiro napisał(a):Z tego co się orientuję, zdarzenia OnChange oraz OnSelect StringGrid nie posiada


Nie posiada i nie musi. Masz utworzyć zdarzenie OnChange dla obiektu typu TComboBox, czyli myEditor. Zauważ, że w poradzie z której korzystałeś to zdarzenie jest podłączane do obiektu myEditor, więc masz już gotowy kod. Teraz kod z pomocą którego chcesz coś pobrać z czegoś i gdzieś umieścić, wstawiasz właśnie w to zdarzenie:

KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 /* ... */

 myEditor = new TComboBox(myPanel->Handle);

 /* ... */

 myEditor->OnChange = myEditorChange; // tutaj podłączasz zdarzenie

}


nie zapomnij o deklaracji w pliku nagłówkowym:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
        void __fastcall myEditorChange(TObject *Sender);


tutaj masz definicję tego zdarzenia:

Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
void __fastcall TForm1::myEditorChange(TObject *Sender)
{
 /* jakiś Twój kod, niekoniecznie ten co niżej */

 StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row] = myEditor->Items->Strings[myEditor->ItemIndex]; /* tutaj pobierane są dane z zaznaczonego elementu listy do wybranej komórki tabeli */

 myPanel->Visible = false;
}