Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как сократить запись обращений к StringGrid


Автор: vl1639 25.1.2009, 20:14
Как сократить запись обращений к StringGrid если их много.  В программе для введения данных используются таблицы типа  StringGrid, размещенные на разных страницах TabSheet одной панели PageControl.   При первоначальной загрузке программы  надо заполнить часть столбцов(строк) однотипной информацией  (типа номера меток...). Можно ли свернуть в циклическую процедуру  обращения к StringGrid -ам, которые, например, заканчиваются номерами от 1 до 10 (StringGrid1...StringGrid10).

Автор: Rrader 26.1.2009, 09:37
Первый способ - проставляешь всем гридам Tag, соответствующий номеру (1..10)
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  I, J, K: Integer;
begin
  for K := 0 to ControlCount - 1 do
    if (Controls[K] is TStringGrid) and (Controls[K].Tag in [1..10]) then
      with (Controls[K] as TStringGrid) do
        for I := 0 to ColCount - 1 do
          for J := 0 to RowCount - 1 do
            Cells[I, J] := IntToStr(I + J);
end;

Более наглядный способ, но со старыми версиями Дельфи несовместим:
Код

procedure TForm1.FormCreate(Sender: TObject);
type
  TGridArray = array of TStringGrid;
var
  Grids: TGridArray;
  Grid: TStringGrid;
  I, J: Integer;
begin
  Grids := TGridArray.Create(StringGrid1, StringGrid2, StringGrid3,
    StringGrid4, StringGrid5, StringGrid6, StringGrid7, StringGrid8,
    StringGrid9, StringGrid10);
  for Grid in Grids do
    with Grid do
      for I := 0 to ColCount - 1 do
        for J := 0 to RowCount - 1 do
          Cells[I, J] := IntToStr(I + J);
end;

Автор: vl1639 27.1.2009, 07:42
Спасибо! У меня Delphi 6 и второй вариант не работает, выдаются ошибки в каждой строке, хотя оператор TGridArray.Create она понимает, но в каком-то другом смысле. 
Первый вариант компиляцию проходит без ошибок, но пока ничего не выводит в ячейки - пытаюсь разобраться.

Автор: Rrader 27.1.2009, 08:38
Цитата(vl1639 @  27.1.2009,  13:42 Найти цитируемый пост)
но пока ничего не выводит в ячейки - пытаюсь разобраться.

Не забыл про Tag?
Цитата(Rrader @  26.1.2009,  15:37 Найти цитируемый пост)
Первый способ - проставляешь всем гридам Tag, соответствующий номеру (1..10)


Автор: vl1639 27.1.2009, 17:21
Мне надо масштабировать ячейки Grid-ов по результатам определения используемого пользователем фонта. Все работает нормально, если все имееющиеся 12 Grid-ов масштабировать поочередно. Как уже писал,есть соблазн свернуть эти процедуры в одну. С нанесением эквивалентных меток по Вашему первому способу все работает, а с масштабированием  заминка. У меня такая последовательность дочерних объектов на форме PageConst1  -  PageControl1.TabSheet(8 страниц).StringGrid(12 штук, разбросанные по страницам). Попробовал - и пока не получается. Ни компилятор, ни исполнение претензий не имеют, но не масштабируется.
Код

Uses  ...., MXGrid, Grids;
...........
procedure TPageConst1.FormActivate(Sender: TObject);
var
 k, i :byte;
 DefaultColWidth:TCustomDecisionGrid;
 DefaultRowHeight:TCustomDecisionGrid;
begin
{масштабирование ячеек таблиц для малого фонта, 1 - это малый фонт у меня}
if (fnt_tek=1) then with PageControl1 do
 begin
  for K := 0 to 7 do 
    if ((Controls[K] is TTabSheet) and (Controls[K].Tag in [1..8])) then 
    for i := 0 to 11 do 
     if ((Controls[i] is TStringGrid) and (Controls[i].Tag in [1..12])) then 
      with (Controls[i] as TStringGrid) do
         begin DefaultColWidth:=54;
               DefaultRowHeight:=19; 
         end;
 end;
end;


Чувствую, что я чересчур наворочал. Нормально все работает, если

Код

with PageConst1 do
begin
 StringGrid1.DefaultColWidth:=54;
 StringGrid1.DefaultRowHeight:=19;
 StringGrid2.DefaultColWidth:=54;
 StringGrid2.DefaultRowHeight:=19;
// и так далее до 12-ти
end;

захотелось свернуть и въехал в тупик.

Автор: Rrader 27.1.2009, 18:22
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: Integer;
begin
  with PageControl1 do
    for I := 0 to PageCount - 1 do
      with Pages[I] do
        for J := 0 to ControlCount - 1 do
          if (Controls[J] is TStringGrid) then
            with Controls[J] as TStringGrid do
            begin
              DefaultColWidth := 54;
              DefaultRowHeight := 19;
            end;
end;

Тут все гриды на всех вкладках затрагиваются. Если нужна фильрация - то через Tag.

Автор: vl1639 28.1.2009, 09:44
Масштабирование ячеек Грида работает по последнему варианту. Нанесение меток по первичному варианту работало на простом примере, стал переносить в программу по типу последнего варианта для, например, на Гридов [2,3,5..9] - заклинило. 
Код

with PageControl1 do
  for I := 0 to PageCount - 1 do
    with Pages[I] do
      for J := 0 to ControlCount - 1 do
        if (Controls[J] is TStringGrid) and (Controls[J].Tag in [2,3,5..9]) then
           with (Controls[J] as TStringGrid) do
             for K := 1 to RowCount - 1 do Cells[0, K] := IntToStr(K);

Но могу обойтись без. Что имелось в виду под последними версиями Дельфи, где все прозрачнее и проще - .NET? 

Автор: Rrader 28.1.2009, 12:39
Цитата(vl1639 @  28.1.2009,  15:44 Найти цитируемый пост)
стал переносить в программу по типу последнего варианта для, например, на Гридов [2,3,5..9] - заклинило. 

Скажи по-простому, что значит заклинило и что тебе нужно сделать с гридами? Смысл кодов хоть понятен?

Автор: vl1639 28.1.2009, 13:40
Думал, что смысл кодов понятен. У Гридов (не у всех, а выборочно) хочу оцифровать первый(нулевой) столбец, за заклинило извиняюсь. Просто столбцы остаются пустыми, ошибок не выдается. Где неправильность в  приведенном мной тексте - не вижу. Значит смысл кодов понимаю с ошибками. 
На форум сегодня попадаю с трудом.

Автор: Rrader 28.1.2009, 14:16
Цитата(vl1639 @  28.1.2009,  15:44 Найти цитируемый пост)
 Нанесение меток по первичному варианту работало на простом примере, стал переносить в программу по типу последнего варианта

Значит стоит внимательно посмотреть, чем отличается простой проект, где все работает, от твоего...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)