CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dodatkowa informacja do StringGrid przyklejona do komórki

Dodatkowa informacja do StringGrid przyklejona do komórki

dział ogólny

Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez lzommer » piątek, 15 listopada 2013, 13:44

Nie dawało mi to spokoju. Jak przykleić dodatkowa niewidoczną informację do komórki w której już coś się znajduje.
Ta informacja nie powinna ginąć pomimo sortowania czy jakiegoś przemieszczania wierszy czy kolumn.
Pytałem o to na czacie. Wreszcie polymorphism podsunął mi, myślę, właściwe rozwiązanie.
Sprawdziłem. To działa samo, nie muszę pilnować, żeby ta informacja wędrowała z wybraną komórka, która zmienia przecież indeksy.
Informacja sama wędruje za przemieszczającą się komórką.
Oto mój próbny, testowy kod, może niezręczny ale działa:
KOD cpp:     UKRYJ  
// ---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "AddObject2.h"  //     TStringGrid *StringGrid1; // w naglowku
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm9 *Form9;

// ---------------------------------------------------------------------------
__fastcall TForm9::TForm9(TComponent* Owner)
         : TForm(Owner)
{
                // Czyms wypelniam komorki:
        for (int i= StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
                for (int j= StringGrid1->FixedCols; j < StringGrid1->ColCount; j++)
                {
                        StringGrid1->Cells[j][i]= IntToStr(i) + IntToStr(j);
                }
        for (int i= StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
                StringGrid1->Cells[0][i]= IntToStr(i);
        StringGrid1->Cells[1][0]= "A";  StringGrid1->Cells[2][0]= "B"; StringGrid1->Cells[3][0]= "C";

        String *Info;  // tutaj dodatkowa informacja.
        Info= new String;
        *Info= "dodatkowa ukryta informacja";

        StringGrid1->Objects[2][2]=  (TObject*)Info;     // przypisuję do takiej komorki - (2,B).
}
// ---------------------------------------------------------------------------
void __fastcall TForm9::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect)
{
                // A tu sprawdzam kliknięciem w komorki czy ta informacja istnieje,
         // gdy jakoś przesuwam wiersze i kolumny (informacja wędruje za komorka,
         // mimo, że ona zmienia swoje polożenie, czyli indeksy.
        try
        {
                Edit1->Text= *((String*)(StringGrid1->Objects[ACol][ARow]));                    // =  *((String*)Object1);
        }
        catch (...)
        {
                Edit1->Text= StringGrid1->Cells[ACol][ARow];
        }

}
//---------------------------------------------------------------------------

 
Ostatnio edytowano sobota, 16 listopada 2013, 03:36 przez lzommer, łącznie edytowano 9 razy
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPChrome

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » piątek, 15 listopada 2013, 14:00

Rzeczywiście, odwołując się do metody Objects obiektu StringGrid można to powiązać. Ale wiesz, że jeżeli Obj1 jest tutaj dostępny tylko w zdarzeniu OnClick dla Button2, czyli poza tym zdarzeniem nie zmienisz zawartości Str2?
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 7Firefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez lzommer » piątek, 15 listopada 2013, 14:18

Cyfrowy Baron napisał(a):Rzeczywiście, odwołując się do metody Objects obiektu StringGrid można to powiązać. Ale wiesz, że jeżeli Obj1 jest tutaj dostępny tylko w zdarzeniu OnClick dla Button2, czyli poza tym zdarzeniem nie zmienisz zawartości Str2?
Nie widzę, żeby Str2 się zmieniał przy klikaniu w komórki. Dodatkowa przyklejona informacja wyświetla się w okienku Edit1, jeśli tylko kliknę we właściwą komórkę, mimo,że zmieniam w dowolny sposób jej miejsce w StringGridzie. Chyba, że czegoś nie rozumiem w Twojej uwadze.
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPChrome

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » piątek, 15 listopada 2013, 21:02

Cyfrowy Baron napisał(a):czyli poza tym zdarzeniem nie zmienisz zawartości Str2?


Chodziło mi właśnie o to, że gdybyś chciał to zmienić to nie będzie to możliwe poza zadarzeniem OnClick dla Button2, a kilkakrotne wywołanie tego zdarzenia sprawi, że powstaną nowe obiekty, a stare zostaną porzucone, czyli mamy wyciek pamięci.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
lzommer
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
    WindowsInternet Explorer 8

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez polymorphism » sobota, 16 listopada 2013, 11:08

@lzommer, pamiętaj tylko, że stringi przypisane w ten sposób do komórek grida musisz ręcznie usunąć, w przeciwnym wypadku będziesz miał wyciek.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lzommer
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » sobota, 16 listopada 2013, 11:24

Widzę, że poprawiłeś kod, ale zawartość String *Info, wciąż jest niemodyfikowalna. Ta zmienna powinna zostać zadeklarowana w sekcji private lub public pliku nagłówkowego, bo tak jak masz teraz to nawet nie możesz jej zniszczyć, gdy przestanie być potrzebna i ulegnie zniszczeniu dopiero po zamknięciu programu, a i to system będzie musiał posprzątać po programie. Poza tym dla przejrzystości kodu powinieneś deklarować nie String, lecz AnsiString lub UnicodeString w zależności od wersji środowiska C++Builder i tego czego tam potrzebujesz. W środowisku starszym niż C++Builder 2009 typ UnicodeString nie występuje.
Jeżeli takich komórek miałoby być więcej to najprościej i najwygodniej byłoby posłużyć się vector-em.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
lzommer
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 7Firefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez polymorphism » sobota, 16 listopada 2013, 12:36

(...) zawartość String *Info, wciąż jest niemodyfikowalna. Ta zmienna powinna zostać zadeklarowana w sekcji private lub public pliku nagłówkowego (...)

A dlaczego niemodyfikowalna? Jak będzie chciał modyfikować stringa przypisanego do komórki, to wystarczy że pobierze wskaźnik na niego właściwością Objects.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » sobota, 16 listopada 2013, 13:48

Chodziło mi o to, że nie ma bezpośredniego dostępu do Info, ale w sumie można modyfikować przez Objects:

KOD cpp:     UKRYJ  
 *((String*)(StringGrid1->Objects[2][2])) = "Zmodyfikowana informacja";
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 7Firefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez polymorphism » sobota, 16 listopada 2013, 13:56

No ale po co ma on tą zmienną modyfikować? Przecież nie o to tu chodzi.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » sobota, 16 listopada 2013, 14:02

Tak, ale właśnie odkryłem, że po przesunięciu komórki nie da się jej już tak zmodyfkować, bo indeksy się zmieniły i trzeba podać nową lokalizację, a to oznacza, że trzeba już pilnować indeksów. Modyfikacja zmiennej jest więc konieczna jeżeli chcemy żeby to tabela sama tego pilnowała:

KOD cpp:     UKRYJ  
String *Info;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

                                // Czyms wypelniam komorki:
        for (int i= StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
                for (int j= StringGrid1->FixedCols; j < StringGrid1->ColCount; j++)
                                {
                                                StringGrid1->Cells[j][i]= IntToStr(i) + IntToStr(j);
                                }
                for (int i= StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
                                StringGrid1->Cells[0][i]= IntToStr(i);
                StringGrid1->Cells[1][0]= "A";  StringGrid1->Cells[2][0]= "B"; StringGrid1->Cells[3][0]= "C";

         // tutaj dodatkowa informacja.
                Info= new String;
                *Info= "dodatkowa ukryta informacja";

   StringGrid1->Objects[2][2] = (TObject*)Info;     // przypisuję do takiej komorki - (2,B).
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect)
{
                try
                {
                                Edit1->Text= *((String*)(StringGrid1->Objects[ACol][ARow]));                    // =  *((String*)Object1);
                }
                catch (...)
                {
                                Edit1->Text= StringGrid1->Cells[ACol][ARow];
                }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 *Info = "Zmodyfikowana informacja";
}
//---------------------------------------------------------------------------


Można ewentualnie po prostu zaznaczyć komórkę którą modyfikujemy i wtedy uda się bez bezpośredniego modyfikowania zmiennej:

KOD cpp:     UKRYJ  
 int aCol = StringGrid1->Col;
 int aRow = StringGrid1->Row;

 *((String*)(StringGrid1->Objects[aCol][aRow])) = "Zmodyfikowana informacja";
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 7Firefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez polymorphism » sobota, 16 listopada 2013, 14:14

(...) nie da się jej już tak zmodyfkować, bo indeksy się zmieniły i trzeba podać nową lokalizację

Przecież o to właśnie chodziło lzommerowi, żeby dodatkowy napis był skojarzony z konkretną komórką, a nie z jej pozycją w gridzie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dodatkowa informacja do StringGrid przyklejona do komórki

Nowy postprzez Cyfrowy Baron » sobota, 16 listopada 2013, 14:20

Chyba nie zrozumiałeś... Tutaj chodzi o coś w rodzaju dymka przy komórce w Excel, czyli również o możliwość modyfikacji zawartości tego dymka. Problem sprowadza się do tego, że jeżeli zmienisz lokalizację komórki to dymek co prawda powędruje z nią, ale by zmodyfikować teraz zawartość tego dymka to trzeba przekazać do Objects nową lokalizację przesuniętej komórki. Można oczywiście zrobić to w ten sposób, że klikamy po prostu komórkę, która zawiera ten dymek i już mamy jej współrzędne, które przekazujemy do Objects. Wtedy działa to dokładnie tak jak w Excel'u. Ja rozważałem sytuację, gdy chcesz zmodyfikować zawartość tego dymka bez konieczności szukania go w tabeli.
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 7Firefox


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 48 gości

cron