TStringGrid i szerokość kolumn

dział ogólny

TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » czwartek, 28 maja 2009, 17:23

Jak można ustawić wyświetlanie kolumn w TStringGrid tak aby wszystkie kolumny mieściły się w szerokości kontrolki TStringGrid nawet jak użytkownik zmieni szerokość jakiejś kolumny (ustawione goColSizing na true).
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Cyfrowy Baron » czwartek, 28 maja 2009, 18:14

Trzeba stworzyć algorytm obliczający i ustawiający szerokość pozostałych kolumn. Do sterowania szerokością kolumn służy funkcja:

StringGrid->ColWidths[Y] = width;

gdzie Y to numer kolumny liczony od 0.
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
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » czwartek, 28 maja 2009, 19:41

Tak też myślałem ale miałem nadzieje, że jest łatwiejszy sposób.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » piÄ…tek, 29 maja 2009, 19:46

To jeszcze jedno pytanie. Jak można sprawdzić, na którą granicę dwóch kolumn wskazuje kursor? Wiem jak odczytać wskazanie kursora dla danej komórki ale nie wiem jak oczytać jeżeli kursor wskazuje na granicę dwóch komórek.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Cyfrowy Baron » piÄ…tek, 29 maja 2009, 20:01

Twórcy tego obiektu najwyraźniej tego nie przewidzieli, ale chyba można by stworzyć algorytm, który w oparciu o szerokość kolumn sprawdzałby położenie kursora względem krawędzi obiektu i wyliczał odpowiednio w jakiej pozycji znajdują się komórki i w ten sposób sprawdzałby czy wskazywana jest linia.
Takie rozwiązanie wymagałoby zastosowania pętli w zdarzeniu OnMouseMove, co opóźniałoby działanie kodu, wskaźnik myszy by się zatrzymywał, im więcej byłoby kolumn, tym dłużej trwałoby wyliczanie.
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
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » sobota, 30 maja 2009, 10:27

Nikt z was nie zajmował się tym tematem (tzn. nie macie kodu, który by coś takiego robił)? To jest tylko estetyczny wygląd i szkoda tracić na to czas.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » niedziela, 31 maja 2009, 20:46

Wymyśliłem coś lepszego. Jak sprawdzić w danej chwili jaki jest wyświetlany kursor? Pytam ponieważ podczas zmiany wielkości kolumn zmienia się też kursor (na crHSplit), coś takiego nie działa:
Kod: Zaznacz cały
if(StringGrid1->Cursor == crHSplit) {...}
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 1 czerwca 2009, 09:35

Nazwę kursora wyświetlanego można pobrać za pomocą funkcji CursorToString(TCursor Cursor), ale to nie zadziała dla kursora crHSplit, gdyż klasa TStringGrid nie zwraca takich informacji.

Kod: Zaznacz cały
void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
        TShiftState Shift, int X, int Y)
{
   Label1->Caption = CursorToString(StringGrid1->Cursor);
   Label2->Caption = CursorToString(Screen->Cursor);       
}
//---------------------------------------------------------------------------




Pożądany efekt można osiągnąć dodając funkcję GetCursor(), ale i to nie zadziała prawidłowo, gdyż ta funkcja zwraca wartość typu HCURSOR, po rzutowaniu na TCursor otrzymujemy nie nazwę kursora, lecz (chyba) jego identyfikator, a ten identyfikator jest przydzielany przez system w momencie uruchamiania aplikacji, więc za każdym uruchomieniem jest inny.

Proponowane przeze mnie rozwiązanie polega na sprawdzeniu jaki jest numer identyfikatora przydzielony kursorowi crHSplit. Program sprawdza to w chwili tworzenia aplikacji, poprzez ustawienia dla ekranu najpierw kursora crHSplit, następnie pobierany jest numer identyfikacyjny tegoż kursora i przechowywany w zmiennej cr_HSplit, potem przywracany jest dla ekranu kursor domyślny. Cała operacja przebiega w ułamku sekundy, więc użytkownik nie widzi tej operacji.
Mając identyfikator tego kursora, wystarczy go w zdarzeniu OnMouseMove dla StringGrid porównać z pobieranymi identyfikatorami na bieżąco:


plik nagłówkowy, np Unit1.h
Kod: Zaznacz cały
private:
        int cr_HSplit, cr_VSplit;


plik źródłowy, np. Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
{
  Screen->Cursor = crHSplit;
  cr_HSplit = (TCursor)GetCursor();
  Screen->Cursor = crVSplit;
  cr_VSplit = (TCursor)GetCursor();
  Screen->Cursor = crDefault;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
        TShiftState Shift, int X, int Y)
{
  if((TCursor)GetCursor() == cr_HSplit || (TCursor)GetCursor() == cr_VSplit)
     Label1->Caption = "linia";
  else
    Label1->Caption = "komórka";
}
//---------------------------------------------------------------------------


Dla innych kursorów należy postępować podobnie.
To rozwiązanie sprawdzi się tylko, gdy właściwości goRowSizing dla (crVSplit) i go ColSizing dla (crHSplit), oraz działa tylko na wierszach i kolumnach nagłówkowych.



Nie jest to szczególnie błyskotliwe rozwiązanie, ale nic lepszego nie przychodzi mi do głowy.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Miroo_007 » czwartek, 4 czerwca 2009, 21:28

Mam taki kod do zmiany szerokości kolumn ale działa poprawnie tylko dla dwóch pierszych kolumn. Jak można to przerobić tak aby poprawnie zmieniały się wszystkie kolumny
Kod: Zaznacz cały
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
#define COL_DOLICZ 1
int width;
   width = 0;
   for(int i = 0; i < StringGrid1->ColCount; i++)
      if(i != COL_DOLICZ)
         width += StringGrid1->ColWidths[i];
   StringGrid1->ColWidths[COL_DOLICZ] = StringGrid1->Width - width;
}
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringGrid i szerokość kolumn

Nowy postprzez Cyfrowy Baron » sobota, 6 czerwca 2009, 16:09

Obiekt StringGrid nie zwraca informacji o tym, która kolumna ma zwiększany rozmiar, dlatego nie można sterować rozmiarami pozostałych kolumn.
To zadanie można by zrealizować tworząc specjalną tablicę przechowującą informacje o rozmiarach kolumn. Po zamianie rozmiaru jednej kolumny, algorytm sprawdzałby w której kolumnie mienił się rozmiar i w ten sposób przeliczałby rozmiary pozostałych kolumn. Pójdź tym tropem a rozwiążesz problem.

CO do tego kody wyżej, no to zmienia rozmiar tylko dwóch kolumn, gdyż zdefiniowana wartość COL_DOLICZ jest równa 1, czyli ogranicza działanie kolumn do Col[0] i Col[1], więc ma z góry zdefiniowane, których kolumn ma dotyczyć. Zmieniając wartość tej definicji zmienisz zakres jej działania, ale to i tak nie rozwiązuje Twojego problemu.
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
    NieznanyNieznana


  • 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 39 gości

cron