Wątek przeniesiony 2016-03-18 16:58 z Newbie przez furious programming.

Automatyczne dopasowanie szerokości: (DBgrida, formy, panelu, poł. przycisków) do szer.kolumn dgrida

0

Witam, czy istnieje jakaś prosta instrukcja, która odpowiadałaby za automatyczne dopasowanie szerokości (DBgrida, formy, panelu, położenia przycisków) do całkowitej szerokości wszystkich wyświetlanych kolumn w DBgridzie?

Przykład na rysunku niżej(również w załączniku):
user image

W tym przykładzie posłużyłem się napisanym przez siebie kodem, jednak czy istnieje jakiś lepszy sposób, aby w łatwiejszy sposób uzyskać identyczny efekt?

          wynik:=0;
          for i:=0 to dbgrid1.Columns.Count - 1 do
            begin
              w[i]:=dbgrid1.Columns.Items[i].Width;
              wynik:= wynik + w[i];
            end;
          if ((wynik+191) > screen.Width) then wynik:=screen.Width-191; //191 - odstęp od krawędzi ost kolumny do krawędzi formularza 
          dbgrid1.Width:=wynik+41; //dodatkowe 41 na pasek
          panel1.Width:=dbgrid1.Width+80; //dodatkowe 80 na odstęp między gridem a końcem panelu
          FmBazaWyc.Width:=panel1.Width+70; //dodatkowe 70 na odstęp między krawędzią panelu, a końcem formularza. 
          button2.Left:=FmBazaWyc.Width-185;
          button1.Left:=FmBazaWyc.Width-273;
          imagebutton4.Left:=FmBazaWyc.Width-100;
0

Jeśli DBGrid ma jakąś właściwość lub metodę, która zwraca łączną bieżącą szerokość kolumn to ją znajdź i użyj; A jeśli nie - pozostaje policzyć na piechotkę; Przy okazji:

wynik:=0;

for i:=0 to dbgrid1.Columns.Count - 1 do
begin
  w[i]:=dbgrid1.Columns.Items[i].Width;
  wynik:= wynik + w[i];
end;

Ten kod źle liczy sumę szerokości kolumn, bo nie bieże pod uwagę szerokości linii grida; Poza tym za dużo w tym kodzie hardkodowanych liczb, które nie wiadomo co oznaczają; Użyj stałych i ogólnie pisz kod czytelniej.

0

Dodałem komentarze do kodu, zanim pojawiła się Twoja odpowiedź (lub byłem w trakcie). Szerokosć linii została uwzględniona wszędzie gdzie to było wymagane - w kodzie jest to wartość 41.

2

Szerokosć linii została uwzględniona wszędzie gdzie to było wymagane - w kodzie jest to wartość 41.

No dobrze, ale co z tego?

Samo 41 nic nie mówi; Do tego liczba ta w ogóle nie powinna być hardkodowana, bo jak dodasz lub usuniesz kolumnę - będziesz musiał zmieniać kod, który w obecnej chwili nie jest uniwersalny; Zmienisz grubość linii siatki i tak samo - trzeba będzie grzebać w kodzie; Po drugie, komentarzy nie używa się do tłumaczenia kodu - one mają z grubsza opisywać np. do czego służy dana metoda; Kod ma być napisany tak, aby sam się tłumaczył - to podstawa;

Jeśli chodzi o wyliczanie sumy szerokości wszystkich linii grida to sprawa jest banalna - z tego co pamiętam liczba pionowych linii siatki jest równa liczbie kolumn, a liczba poziomych linii równa jest liczbie wierszy; Jedno pomnóż przez drugie i wpakuj rezultat do zmiennej; Jeśli dodasz lub usuniesz kolumnę czy zmienisz grubość linii to kod sam się do zmian dostosuje.

0

Jeśli bardzo Ci taka rzecz jest potrzebna, to poszukaj do tego gotowego komponentu. Z tego co kojarzę to są nawet darmowe zamienniki DBGrida które go biją na głowę pod względem dodatkowych funkcjonalności.

0

Małe sprostowanie - wartość 41 jest to suma szerokości (paska i stopek?):
user image

Co do ilości linii dbgrida, w sumie mogłem to umieścić w pętli, która zlicza szerokości kolumn (dzięki za podpowiedź).

Co do grubości linii siataki - czy jest w ogóle możliwość jakichkolwiek zmian rozmiarów linii w DBGridzie (gdzieś czytałem, że nie posiada on takiej możliwości)?

1

@pewi - ja mam bardzo starą wersję Delphi i w niej komponent DBGrid nie ma właściwości do ustawienia grubości linii siatki; Jeżeli istnieje jakaś właściwość do tego celu przeznaczona w obecnej wersji VCL to znajdziesz ją w oknie inspektora obiektów; Sprawdź też w dokumentacji; Ale nie wiem - nie uzywam nowego Delphi; Być może w ogóle czegoś takiego tam nie ma i faktycznie nie da się ustalić szerokości linii siatki;

Co do ilości linii dbgrida, w sumie mogłem to umieścić w pętli, która zlicza szerokości kolumn (dzięki za podpowiedź).

Ale po co w pętli? Liczba kolumn jest znana i przed pętlą, więc możesz to obliczyć raz; A tak poza tym to aby się upewnić co i jak liczyć, odpal program, zrób zrzut ekranu, wsadź go do Painta, powiększ ze cztery razy i zmierz narzędziem do zaznaczania jakąś kolumnę; Następnie w programie wyświetl sobie szerokość tej kolumny i porównaj te szerokości; Jeśli będą różne - musisz do sumy szerkości dodać także szerokość linii siatki; Jeżeli nie - nie będziesz musiał nic dodawać;

Edit: Zresztą zobacz do tego artykułu - http://edn.embarcadero.com/article/27548

{...}

  // compute total width used by grid columns and vertical lines if any
  TotalColumnWidth := 0;
  for i := 0 to ColumnCount-1 do
    TotalColumnWidth := TotalColumnWidth + DBGrid.Columns[i].Width;
  if dgColLines in DBGrid.Options then
    // include vertical lines in total (one per column)
    TotalColumnWidth := TotalColumnWidth + ColumnCount;

{...}

Jak widać z kodu z artykułu to prawda - DBGridowi nie można ustawić szerokości linii siatki; Można je włączyć lub wyłączyć.

0

Przerobiłem sobie ten kod pod siebie oraz inaczej zrobiłem dostosowanie szerokości panelu, formularza i położenia przycisków niż poprzednio.
Dzięki za pomoc z DBGridem.

procedure SetGridWidth(DBGrid: TDBGrid);
var
  TotalColumnWidth, ColumnCount, i: Integer;
begin
  SetGridColumnWidths(DBGrid);
  ColumnCount := DBGrid.Columns.Count;
  if ColumnCount = 0 then Exit;
  TotalColumnWidth := 0;

  for i := 0 to ColumnCount-1 do
    TotalColumnWidth := TotalColumnWidth + DBGrid.Columns[i].Width;

  if dgColLines in DBGrid.Options then
    TotalColumnWidth := TotalColumnWidth + ColumnCount;

  DBGrid.Width:= TotalColumnWidth + GetSystemMetrics(SM_CXVSCROLL);

  if dgIndicator in DBGrid.Options then
    DBGrid.Width := DBGrid.Width + IndicatorWidth;

  if DBGrid.BorderStyle = bsSingle then
    begin
      if DBGrid.Ctl3D then
        DBGrid.Width := DBGrid.Width + 4
      else
        DBGrid.Width := DBGrid.Width + 2;
    end
end;


procedure TFmBazaWyc.Button17Click(Sender: TObject);
var
  OdstepGridPanel, OdstepPanelForm, Button1Wstecz_Right, Button2Zamknij_Right, Imagebutton4Kosz_Right: integer;
begin
  OdstepGridPanel := panel1.Width - dbgrid1.Width;
  OdstepPanelForm := FmBazaWyc.Width - panel1.Width;
  Button1Wstecz_Right := FmBazaWyc.Width - Button1Wstecz.Left;
  Button2Zamknij_Right := FmBazaWyc.Width - Button1Zamknij.Left;
  Imagebutton4Kosz_Right := FmBazaWyc.Width - Imagebutton4Kosz.Left;

  SetGridWidth(DBGrid1);
  if (DBGrid1.Width + OdstepGridPanel + OdstepPanelForm) > screen.Width then
      DBGrid1.Width:=screen.Width - (OdstepGridPanel + OdstepPanelForm);

  panel1.Width := dbgrid1.Width + OdstepGridPanel;
  FmBazaWyc.Width := panel1.Width + OdstepPanelForm;
  Button1Wstecz.Left := FmBazaWyc.Width - Button1Wstecz_Right;
  Button2Zamknij.Left := FmBazaWyc.Width - Button2Zamknij_Right;
  ImageButton4Kosz.Left := FmBazaWyc.Width - Imagebutton4Kosz_Right;
end; 

..........
edit
......
w sumie dla buttonów:

FmWidth:=FmBazaWyc.Width;
.
.
.
FmBazaWyc.Width:=panel1.Width + OdstepPanelForm;
.
.
.
Button2Zamknij.Left := Button2Zamknij.Left+(FmBazaWyc.Width - FmWidth) 

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