StringGrid i automatyczne dopasowanie szerokości kolumn do danych

StringGrid i automatyczne dopasowanie szerokości kolumn do danych
joniu
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
0

Witam

Mam problem z automatycznym dopasowaniem szerokości kolumn do najszerszej wprowadzonej danej do StringGrida.
Problem jest dla mnie dość ciekawy (tym bardziej że wróciłem do programowania po 10 latach przerwy) i już go opisuję.
Wczytuję do StringGrid dane z pliku (w onCreate formy) i zaraz potem za pomocą pętli w pętli sprawdzam jakie szerokie są tam wpisane dane i dostosowuję szerokość do najszerszej z nich (+ jakiś mały margines).
Gdy wykonuję pętle tak po prostu to szerokość się zmienia ale jednak nie osiąga optymalnej szerokości i prawie zawsze jednak jest zbyt wąska.
Ale wystarczy że w pętli przejścia do następnej kolumny na końcu dam ShowMessage i wtedy szerokość jest dostosowana bardzo dobrze.
Kompletnie nie wiem o co chodzi.
Poniżej kod:

Kopiuj
  {automatyczne dopasowanie szerokości kolumn do najszerszej wartości}
  for i := 0 to StringGrid1.ColCount-1 do {wybieram kolumnę}
    begin
      for j := 0 to StringGrid1.RowCount-1 do  {sprzwdzam po kolei wiersze w kolumnie}
        if StringGrid1.ColWidths[i] < 10 + StringGrid1.Canvas.TextWidth(StringGrid1.Cells[i,j]) then
           StringGrid1.ColWidths[i] := 10 + StringGrid1.Canvas.TextWidth(StringGrid1.Cells[i,j]);
      //showmessage('ok');
    end;

Gdy odkomentuję ShowMessage dopasowanie działa, gdy jest zakomentowane - nie.
Ktoś ma pomysł dlaczego tak się dzieje i co zrobić żeby to zadziałało?
A może jakiś inny pomysł na to?
Opóźnienie wykonania pętli za pomocą sleep również nie działa (tak z ciekawości spróbowałem).
ps. Od razu mówię że robię to w Delphi 10.2 jeśli miało by to jakieś znaczenie

edytowany 2x, ostatnio: joniu
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Gorlice
1

Zamiast ShowMessage spróbuj Application.ProcessMessages choć moim zdaniem zamiast odświeżać StringGrid na bieżąco lepiej w tej pętli przechowuj potrzebną szerokość w jakieś zmiennej (tu najlepiej tablica skoro dla każdej kolumny) i nadaj szerokości po jej zakończeniu.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Łódź
  • Postów:648
1

refresh, redraw, repaint, invalidate, albo coś w tym stylu. powinno pomóc.

flowCRANE
Najbezpieczniej Invalidate, jeśli chodzi o samo odmalowanie.
joniu
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
0

Faktycznie refresh pomogło, ale co ciekawe po każdym wykonaniu przeszukania kolumny dla najszerszej wartości. Gdy refresh zrobię po obu pętlach to tak samo nie działa.
Ale aż mi głupio że na to że sam nie wpadłem z tym refresh-em :(.
Aczkolwiek z drugiej strony naprawdę zgłupiałem jak przez kompletny przypadek wpadłem na to że ten nieszczęsny showmessage działa (gdy mi nie działały te pętle to chciałem po sprawdzeniu każdej kolumny wyświetlić informacje o jej szerokości jaki ustawił na końcu i dlatego na chwilę zrobiłem sobie tę funkcję i jakieś było moje zdziwienie gdy zaczęło działać a po jej wyłączeniu przestało).
Dziękuję za pomoc
Temat do zamknięcia

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.