CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Stringgrid i Ctrl+c

Stringgrid i Ctrl+c

dział ogólny

Stringgrid i Ctrl+c

Nowy postprzez oneiro » sobota, 12 stycznia 2013, 23:36

Witam,

Chcę w stringgridzie zaznaczony wiersz/kolumnę przy pomocy poniższej procedury

http://programowanie.cal.pl/cyfbar/stri ... tml#grid17

za pomocą kombinacji klawiszy CTRL+C zapisać zaznaczony uprzednio wiersz/kolumnę do systemowego schowka. A idealnie byłby, aby wklejając do Excela/OO Calc (lub innego arkusza kalkulacyjnego) wkleiło mi moje dane (w tej chwili bawię się przez zapis do CVS'a, ale staje się to meczące)

PS. Czy da się zaznaczyć więcej niż 1 wiersz/kolumnę za pomocą linkowanej porady (kodu jeszcze nie uruchomiłem) za pomocą klawisza np. SCHIFT?

Pozdrawiam, Krzysiek
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 01:22

Musisz zrozumieć jedno. StringGrid to nie jest arkusz kalkulacyjny, to tylko taka tabela, a wszystko co znajduje się w tej tabeli to wartości typu AnsiString lub UnicodeString, czyli zwykły łańcuch znaków. Zaznaczyć kilka wierszy można, ale to niczego nie zmienia w kwestii kopiowania, gdyż liczy się nie to co zaznaczysz za pomocą kodu, ale komórka która jest aktualnie wybrana. Kopiując cokolwiek np. z dwóch wierszy to będzie nic więcej niż łańcuch znaków.

To całe zaznaczanie z podanej przez ciebie porady nie ma tak naprawdę nic wspólnego z zaznaczaniem. Po prostu jest to graficzna reprezentacja zaznaczania i tak zaznaczonej kolumny nie da się skopiować do schowka.

Taki mechanizm dało by się zrobić, ale tekst należałoby skopiować do schowka z wszystkich zaznaczonych komórek oddzielnie i połączyć go w jeden ciąg znaków rozdzielony np. średnikami: tekst1;tekst2;tekst3. Potem w Excel'u należałoby wybrać polecenie Wklej -> Użyj kreatora importu tekstu, następnie w kreatorze wybrać opcję Rozdzielany, kliknąć [ Dalej ], w następnym oknie wybrać Ograniczniki -> Średnik [ Dalej ], potem Format danych w kolumnie -> Ogólny [ Zakończ ].

Jeżeli znalazłeś na to prostszy sposób to chętnie go poznam.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 17:24

Dziękuję za odpowiedź, zmotywowało mnie to samodzielnego znalezienia rozwiązania.

Wzorując się na: http://www.awalum.com/x_delphi/tstringgrid.htm

KOD cpp:     UKRYJ  
String S;
TGridRect GRect;
GRect = Form5->StringGrid1->Selection;
S="";
for (int R=GRect.Top; R<= GRect.Bottom;R++)
 {
  for (int C=GRect.Left; C<= GRect.Right;C++)
  {
  if (C==GRect.Right) S+=Form5->StringGrid1->Cells[C][R];
        else
        S+=Form5->StringGrid1->Cells[C][R] + char(VK_TAB);
  }
S+=char(VK_RETURN);
}
Clipboard()->AsText= S;
 


Wystarczy zaznaczyć, nacisnąć przycisk i wklejać do excela :D

PS. A jak zrobić, aby po zaznaczeniu kombinacja CTRL+C spowodowała wywołanie kodu?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 18:01

Rzeczywiście, jeżeli tekst jest rozdzielany tabulatorem to Excel wkleja go do komórek oddzielnie.

oneiro napisał(a):PS. A jak zrobić, aby po zaznaczeniu kombinacja CTRL+C spowodowała wywołanie kodu?



Właściwość KeyPreview formularza na którym ma to działać ustawiasz na true. Następnie tworzysz dla tego formularza zdarzenie OnKeyDown (z OnKeyUp nie będzie działać) i wprowadzasz taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if(Key == 'C' && Shift.Contains( ssCtrl ))
  {
        ShowMessage("Wciśnięto kombinację klawiszy Ctrl+C");
  }
}
Kod działa dla wszystkich kontrolek na formularzu, czyli wciśnięcie tych klawiszy zostanie przechwycone zawsze gdy okno będzie aktywne. Jeżeli chcesz żeby działało tylko w StringGrid to umieszczasz ten kod w zdarzeniu OnKeyDown dla obiektu StringGrid.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 18:22

Dziękuję, działa prawie dobrze - chciałbym jeszcze zaznaczyć do skopiowania kolumnę/wiersz FIXED, da się to osiągnąć?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 19:29

oneiro napisał(a):chciałbym jeszcze zaznaczyć do skopiowania kolumnę/wiersz FIXED, da się to osiągnąć?


Da się, ale to wymaga modyfikacji kodu. W tej chwili używasz struktury TGridRect do której kopiujesz koordynaty zaznaczonego wiersza (z kodu wynika, że nie działa z zaznaczaniem kolumn) poprzez funkcję Selected obiektu StringGrid, a ta funkcja nie uwzględnia komórek nagłówkowych.

Zanim cokolwiek dalej zrobimy, podaj jak masz ustawione opcje dla StringGrid, bo coś mi tutaj nie pasuje. Jeżeli goRowSelect masz ustawione na true, to nie możesz nic wpisywać do tabeli, a jeżeli na false to nie możesz zaznaczyć całego wiersza.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 19:41

proszę:

KOD cpp:     UKRYJ  

goFixedVertLine = true
goFixedHorzLine = true
goVertLine = true
goHorzLine = true
goRangeSelect = true
goDrawFocusSelected = true
goRowSizing = true
goColSizing = true
goRowMoving = false
goColMoving = false
goEditing = false
goTabs =true
goRowSelect = false
goAlwayShowEditor = false
goThumbTracking = false
 
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 19:45

W jaki sposób zaznaczasz cały wiersz skoro goRowSelect masz ustawione na false?
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 19:54

Po tym co uzyskałem na razie wystarcza mi, że zaznaczam obszar, wciskam [CTRL]+[C] i mam dane w schowku.
Dobrze byłby, aby dało się zaznaczyć stałe komórki (tj należące do fixed).

A pomysł z pierwszego posta - zaznaczam wiersz/kokumnę i kopiowanie do pamięci, szczerze - jeszcze tego nie uruchomiłem...zostawiłem by to na koniec, na razie walczę z zaznaczeniem komórek należących do stałego wiersza/kolumny w celu jego skopiowania.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 19:58

oneiro napisał(a):Po tym co uzyskałem na razie wystarcza mi, że zaznaczam obszar, wciskam [CTRL]+[C] i mam dane w schowku.


Ale jak zaznaczasz całą kolumnę lub wiersz bo funkcja Selected kopiuje tylko to co jest zaznaczone w tabeli. Nie widzę nigdzie kodu na zaznaczanie całych kolumn lub wierszy.

oneiro napisał(a):że zaznaczam obszar


No właśnie, jak zaznaczasz ten obszar?

oneiro napisał(a):Dobrze byłby, aby dało się zaznaczyć stałe komórki (tj należące do fixed).


Właśnie nad tym pracuję.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 20:06

Nie odpowiadasz jak to zaznaczasz, więc kod opieram na tym co sam wymyśliłem.

Więc zaznaczanie pojedynczej kolumny lub wierszy po kliknięciu na nagłówek. Kod umieszczamy w zdarzeniu FixedCellClick:

KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1FixedCellClick(TObject *Sender, int ACol, int ARow)

{
 TGridRect gRect;

 if(ARow == 0)
 {
  gRect.Left = ACol;
  gRect.Top = 0;
  gRect.Right = ACol;
  gRect.Bottom = StringGrid1->RowCount - 1;

  StringGrid1->Selection = gRect;
  StringGrid1->Repaint();
 }

 if(ACol == 0)
 {
  gRect.Left = 0;
  gRect.Top = ARow;
  gRect.Right = StringGrid1->ColCount - 1;
  gRect.Bottom = ARow;

  StringGrid1->Selection = gRect;
  StringGrid1->Repaint();
 }
}


Teraz nie ma problemu z kopiowaniem również komórki nagłówka, gdyż ona również zostaje zaznaczona.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 20:14

Nie odpowiadasz jak to zaznaczasz, więc kod opieram na tym co sam wymyśliłem.


Normalnie myszką :) naciskam lewy przycisk myszki, ruch, zaznaczają mi się komórki (poza stałymi), puszcza lewy przycisk myszki. Po tym [CTRL]+[C]
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez Cyfrowy Baron » niedziela, 13 stycznia 2013, 20:18

Wiec sprawa jest banalnie prosta:

KOD cpp:     UKRYJ  
 String S;
 TGridRect GRect = Form5->StringGrid1->Selection;
 S = "";
 for( int R = GRect.Top - 1; R <= GRect.Bottom; R++ )
 {
  for( int C = GRect.Left - 1; C <= GRect.Right; C++ )
  {
   if( C == GRect.Right ) S += Form5->StringGrid1->Cells[C][R];
   else S += Form5->StringGrid1->Cells[C][R] + char(VK_TAB);
  }

 S += char(VK_RETURN);
}

Clipboard()->AsText= S;


U mnie zaznaczanie myszką więcej niż jednej komórki nie działało bo mam włączoną edycję komórek.
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 XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 20:55

Jeden obrazek wart 1000 słów
Obrazek


Przykładowo chcę zaznaczyć to co zaznaczone na obrazku, ale plus komórki "Izz [mm4]" oraz "Ixy [mm4]" - o to się rozchodzi.

Albo przykładowo klikam na komórkę [0,0] czyli "Sect. Prop." i zaznaczam aż do kolumny I11 [mm4] 2 wiersza.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Stringgrid i Ctrl+c

Nowy postprzez oneiro » niedziela, 13 stycznia 2013, 21:16

U mnie zaznaczanie myszką więcej niż jednej komórki nie działało bo mam włączoną edycję komórek.


Wejdź w komórkę, będącą jedną z rogów zaznaczonego obszar, naciśnije [SHIFT] + [strzałka] i zaznaczaj co chcesz
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

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

cron