Jak usunąć białe pole z komponentu StringGrid?

Odpowiedz Nowy wątek
2014-06-06 21:41
0

Witam.
Problem wydaje się dość banalny, wręcz można by powiedzieć głupi ale nie mogę tego ruszyć :(
Dodając Stringgrid rozmiar jego kolumn ustawiam w programie i nie umiem usunąć białego pola, którą zostaje po wstawieniu Sringgrid na formę. W prawdzie mogę je w projekcie ustawić ręcznie, ale np. po dodaniu kolumn (przycisk dodaj) gdy pokarzą się suwaki to nie pasuje to za bardzo. Dodatkowo jest to sposób mało profesjonalny.
Zdjęcia powinno dokładnie wytłumaczyć, o która pole mi chodzi. W opcjach próbowałem zmienić kolor ale zmienia się razem z kolorem pod częścią przeznaczoną do pisania.
Pewnie to jest coś banalnego, a ja nie mogę tego znaleźć :(
user image
Liczę na Waszą pomoc.
Pozdrawiam

edytowany 2x, ostatnio: Znawca tematu, 2014-06-06 21:45

Pozostało 580 znaków

2014-06-06 22:28
2

To nie jest takie banalne, bo to "białe pole" jest częścią komponentu, więc nie można go usunąć; Ja widzę dwa wyjścia:

  • ustawić tło komponentu na takie, jakie kolor formularza, a komórki rysować ręcznie - w zdarzeniu OnDrawCell; Ewentualnie możesz ustawić BorderStyle na bsNone, żeby nie było widać prawej części ramki komponentu;
  • szerokość komponentu ustawiać dynamicznie, obliczając sumę szerokości wszystkich kolumn i dodając szerokość linii siatki (GridLineWidth);
    W obu przypadkach będzie problem ze ScrollBarami - trzeba będzie pobrać szerokość pionowego paska i dodać przy obliczaniu odpowiedniej szerokości komponentu.

edytowany 1x, ostatnio: furious programming, 2014-06-06 22:29

Pozostało 580 znaków

2014-06-06 22:36
0

Trzecia opcja liczyć dynamicznie szerokość kolumn


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
To jest druga opcja :P - furious programming 2014-06-06 22:40
Nie, druga opcja szerokość komponentu. - _13th_Dragon 2014-06-06 22:55
Ojej, faktycznie... ;) - furious programming 2014-06-06 22:57

Pozostało 580 znaków

2014-06-06 22:38
0

Czwarta możliwość - ustawić na stałe szerokość kolumn.*

  • o ile się da, nie wiem tego :)
Po czym dodajesz kilka wierszy, pojawia się suwak i ... - _13th_Dragon 2014-06-06 22:39
Można po prostu ich domyślnej szerokości nie zmieniać i będzie działać ;) - furious programming 2014-06-06 22:41
_13th_Dragon ... i co się wtedy dzieje? Nie ma tu jakiejś opcji "elastycznej", w sensie ustawienia, że cały ten grid ma mieć szerokość jakąśtam, a poszczególne kolumny po X% tej szerokości, z uwzględnieniem suwaka? - fourfour 2014-06-06 22:45
A wtedy pojawia się suwak poziomy, już wolę białe pola z zapasem. - _13th_Dragon 2014-06-06 23:02
@fourfour - takiej opcji nie ma; Zresztą suwak i tak psuje robotę, więc trzeba co nieco poobliczać; - furious programming 2014-06-06 23:03
ok, dzięki za wyjaśnienie. - fourfour 2014-06-06 23:12

Pozostało 580 znaków

2014-06-06 22:59
0

Rozmiar kolumn jest stały. Myślałem tylko, że można te białe pole "automatycznie" dostosować do szerokości kolumn. W takim razie idąc po linii najmniejszego oporu pole ustawiłem tak, żeby suwak pionowy był widoczny cały czas, a poziomego nie było. To rozwiązuje prawie wszystkie problemy po ręcznym dopasowaniu rozmiarów komponentu.

Pozostało 580 znaków

2014-06-06 23:01
0

To rozwiązuje prawie wszystkie problemy po ręcznym dopasowaniu rozmiarów komponentu.

Więc z czym jest jeszcze problem?


edytowany 1x, ostatnio: furious programming, 2014-06-06 23:01

Pozostało 580 znaków

2014-06-06 23:06
0

No jedynie z tym, że ustawienie ręczne nie jest do końca dokładne. Widać minimalną przerwę, a jak ustawię o piksel mniej to już dodaje się suwak. Jednak program jest z tych "mało zaawansowanych" więc tak to zostawię.
Dziękuję za pomoc, rozjaśnienie sytuacji.

A co za problem ustawiać szerokość stringgrida w zależności od tego, czy pojawił się suwak, czy go nie ma? Przecie wiadomo, kiedy on się pojawia/znika, więc można w odpowiednim momencie poszerzyć/zwężyć komponent. - marogo 2014-06-06 23:51

Pozostało 580 znaków

2014-06-06 23:58

Nie wiem którą opcję wybrałeś, w każdym razie temat mnie zaciekawił i spróbowałem z drugim podanym przeze mnie punktem - dynamiczną zmianą szerokości komponentu;

Poniższy kod realizuje dynamiczne zwiększanie szerokości komponentu, biorąc pod uwagę liczbę i indywidualne szerokości kolumn oraz szerokość linii siatki; W razie pojawienia się pionowego ScrollBara - komponent odpowiednio zwiększy swój rozmiar; Przy ustawianiu nowej szerokości komponentu, zawsze modyfikowana jest właściwość ClientWidth, dzięki czemu pionowy pasek przesuwu nie przeszkadza;

procedure TForm1.ResizeGrid(AGrid: TStringGrid);
var
  intWidth, I: Integer;
begin
  intWidth := 0;

  for I := 0 to AGrid.ColCount - 1 do
    Inc(intWidth, AGrid.ColWidths[I]);

  Inc(intWidth, (AGrid.ColCount - 1) * AGrid.GridLineWidth);
  AGrid.ClientWidth := intWidth;
end;

procedure TForm1.ChangeColsCount(AGrid: TStringGrid; AValue: Integer);
begin
  AGrid.ColCount := AGrid.ColCount + AValue;
end;

procedure TForm1.ChangeFixedColsCount(AGrid: TStringGrid; AValue: Integer);
begin
  AGrid.FixedCols := AGrid.FixedCols + AValue;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ResizeGrid(sgPreview);
end;

procedure TForm1.btnLessColumnsClick(Sender: TObject);
begin
  if sgPreview.ColCount - sgPreview.FixedCols > 1 then
  begin
    ChangeColsCount(sgPreview, -1);
    ResizeGrid(sgPreview);
  end;
end;

procedure TForm1.btnMoreColumnsClick(Sender: TObject);
begin
  ChangeColsCount(sgPreview, 1);
  ResizeGrid(sgPreview);
end;

procedure TForm1.btnLessFixedColumnsClick(Sender: TObject);
begin
  if sgPreview.FixedCols > 0 then
  begin
    ChangeFixedColsCount(sgPreview, -1);
    ChangeColsCount(sgPreview, -1);
    ResizeGrid(sgPreview);
  end;
end;

procedure TForm1.btnMoreFixedColumnsClick(Sender: TObject);
begin
  ChangeColsCount(sgPreview, 1);
  ChangeFixedColsCount(sgPreview, 1);
  ResizeGrid(sgPreview);
end;

procedure TForm1.btnShorterComponentClick(Sender: TObject);
begin
  sgPreview.ClientHeight := sgPreview.ClientHeight - 5;
  ResizeGrid(sgPreview);
end;

procedure TForm1.btnLongerComponentClick(Sender: TObject);
begin
  sgPreview.ClientHeight := sgPreview.ClientHeight + 5;
  ResizeGrid(sgPreview);
end;

Efekty działania kodu:

1.png

2.png

3.png

4.png

Pełne źródła programu oraz plik wykonywalny do pobawienia się - w załącznikach.

  • 3.png (0,01 MB) - ściągnięć: 95
  • ResizeGrid.zip (0,22 MB) - ściągnięć: 56
  • 4.png (0,01 MB) - ściągnięć: 70
  • 2.png (0,01 MB) - ściągnięć: 79
  • 1.png (0,01 MB) - ściągnięć: 67

edytowany 1x, ostatnio: furious programming, 2014-06-06 23:59
Mogłem dodać jeszcze liczniki kolumn; - furious programming 2014-06-07 00:33

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0