Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2013, 14:30   #1
amintan
 
Регистрация: 10.07.2013
Сообщений: 3
По умолчанию Работа с динамически созданым StringGrid

Ситуация такая: программа при запуске проверяет наличие файла INI с параметрами StringGrid, если файла нет - открывает Форму 2, где задаются параметры создаваемой таблицы, вплоть до вариантов заголовков фикс. строк и столбцов. При выходе программа автоматически сохраняет таблицу в файл, который и ищет при запуске. Сделал. Всё работает. Только почему-то Форма 2 появляется всегда, независимо от того, загружена таблица из файла или нет. Уже голову сломал, не могу найти ошибку. Помогите пожалуста новичку. Вот код процедуры проверки наличия файла.

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FileName:= 'mySGrid.ini';
  if FileExists(ExtractFilePath(Application.ExeName)+FileName) then
  begin
    Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+FileName);
    OpenIniSGrid;//процедура восстановления таблицы из файла
    Exit;
  end else
    begin
      Memo1.Lines.Add('Файл не найден');
      Timer1.Enabled:=true;//запускает Форму 2 для создания таблицы
    end;
end;
А это сама процедура восстановления таблицы:
Код:
procedure TForm1.OpenIniSGrid;
var
 i,j,k,l,n,m,w,h:integer;
begin
   try
    k:=0;
    l:=0;
    Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'mySGrid.ini');
    n:=Ini.ReadInteger('TStringGrid','RowCount',0);
    m:=Ini.ReadInteger('TStringGrid','ColCount',0);
    w:=Ini.ReadInteger('TStringGrid','Width',0);
    h:=Ini.ReadInteger('TStringGrid','Height',0);
    mySGrid:= TStringGrid.Create(Form1);
    mySGrid.RowCount:=n;
    mySGrid.ColCount:=m;
    mySGrid.Width:=w;
    mySGrid.Height:=h;
    mySGrid.Parent:= Form1;
    mySGrid.Left:=20;
    mySGrid.Top:=50;
    //свойства таблицы:
    mySGrid.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
    goDrawFocusSelected,goColSizing,goThumbTracking];
    //восстанвление таблицы по сохраненным параметрам
    for i:=0 to n-1 do
     begin
      for j:=0 to m-1 do
       begin
        mySGrid.Cells[k,l]:=Ini.ReadString('TStringGrid','Item'+IntToStr(i)+IntToStr(j),'');
        inc(k);
       end;
       k:=0;
       inc(l);
     end;
   except
    on e:Exception do
   end;
end;
P.S.: саму процедуру восстановления таблицы нашел в интернете, поэтому не доконца разобрался в ней. Может кто-нибудь подскажет, что означают переменные k:=0 и l:=0?
amintan вне форума Ответить с цитированием
Старый 25.07.2013, 14:56   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а у вас таймер по дефолту отключен?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.07.2013, 14:59   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от amintan Посмотреть сообщение
что означают переменные k:=0 и l:=0?
Они явно лишние. Достаточно изменить запись в ячейки грида на:
Код:
mySGrid.Cells[j,i]:=Ini.ReadString('TStringGrid','Item'+IntToStr(i)+IntToStr(j),'');
и их можно выкинуть.
northener вне форума Ответить с цитированием
Старый 25.07.2013, 15:01   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от amintan Посмотреть сообщение
Только почему-то Форма 2 появляется всегда, независимо от того, загружена таблица из файла или нет.
Форма 2 случайно не находится ли в списке автосоздаваемых?
northener вне форума Ответить с цитированием
Старый 25.07.2013, 21:22   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

зачем столько переменных?
за такой try к стенке!
Код:
procedure TForm1.OpenIniSGrid;
const SectionName='TStringGrid';
var
  Ini:TIniFile;
  mySGrid: TStringGrid;
  i,j:integer;
begin
  Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'mySGrid.ini');
  try
    mySGrid:= TStringGrid.Create(self);
    try
      mySGrid.RowCount:=Ini.ReadInteger(SectionName,'RowCount',0);;
      mySGrid.ColCount:=Ini.ReadInteger(SectionName,'ColCount',0);
      mySGrid.Width:=Ini.ReadInteger(SectionName,'Width',0);
      mySGrid.Height:=Ini.ReadInteger(SectionName,'Height',0);
      mySGrid.Parent:= self;
      mySGrid.Left:=20;
      mySGrid.Top:=50;
      mySGrid.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goDrawFocusSelected,goColSizing,goThumbTracking];
      for i:=0 to mySGrid.RowCount-1 do
        for j:=0 to mySGrid.ColCount-1 do
          mySGrid.Cells[j,i]:=Ini.ReadString(SectionName,'Item'+IntToStr(i)+IntToStr(j),'');
    except
      mySGrid.Free;
      raise;
    end;
  finally
    Ini.Free;
  end;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 26.07.2013, 08:15   #6
amintan
 
Регистрация: 10.07.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а у вас таймер по дефолту отключен?
да, таймер отключен

Цитата:
Сообщение от northener Посмотреть сообщение
Форма 2 случайно не находится ли в списке автосоздаваемых?
Форма создана вручную при проектировании программы и вызывается через Form2.Show; Проверил - в списке главных тоже не стоит

Цитата:
Сообщение от northener Посмотреть сообщение
Они явно лишние. Достаточно изменить запись в ячейки грида на:
Код:
mySGrid.Cells[j,i]:=Ini.ReadString('TStringGrid','Item'+IntToStr(i)+IntToStr(j),'');
и их можно выкинуть.
спасибо, так и сделаю

Последний раз редактировалось amintan; 26.07.2013 в 10:06.
amintan вне форума Ответить с цитированием
Старый 26.07.2013, 10:30   #7
amintan
 
Регистрация: 10.07.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
зачем столько переменных?
за такой try к стенке!
Спасибо, действительно значительно изящнее

Последний раз редактировалось amintan; 26.07.2013 в 10:37.
amintan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со StringGrid TIXIY Помощь студентам 9 09.10.2012 16:50
Работа с StringGrid Алекссс Общие вопросы Delphi 4 19.06.2012 11:32
Работа с динамически созданными формами Port 111 Общие вопросы Delphi 1 31.05.2012 18:28
Работа с динамически созданной формой Airou C++ Builder 1 12.07.2011 10:58
Работа с динамически создаваемыми компонентами sislexa Общие вопросы Delphi 23 30.10.2010 21:47