Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь со СтрингГридом, загрузка в стринггрид не выводит построч 
:(
    Опции темы
FarCry66
  Дата 19.12.2010, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Помогите пожелста решить проблему с сохранением и загрузкой SthingGrid 'a.
В моей программе (заданной на курсовую, а её во вторник уже здавать)) стояла задача сделать программу - расписание. ТАк как алгоритм придумывать сложно (но и муторно и очень долго),  я решил сделать проще: стринг грид с описанием пары дня недели и номера пары.
Проблема у меня в загрузке данных написанных в этом же стринггриде опять же в него. Собственно всё будет видно на скринах)
P.S: Прилагая полный код страницы где происходит сохранение и загрузка.
Вписывание данных и сохзранение:
user posted image

Загрузка данных в стринггрид (описсаных ранее):
user posted image

Код

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Buttons, WinProcs;

type
  TForm3 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    Button1: TButton;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
//    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure BitBtn2Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

uses Unit2;

procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:    TextFile;
   i, k: Integer;
 begin
   AssignFile(f, FileName);
   Rewrite(f);
   with StringGrid do
   begin
     // Write number of Columns/Rows
    Writeln(f, ColCount);
     Writeln(f, RowCount);
     // loop through cells
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
         Writeln(F, Cells[i, k]);
   end;
   CloseFile(F);
 end;

 procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:          TextFile;
   iTmp, i, k: Integer;
   strTemp:    String;
 begin
   AssignFile(f, FileName);
   Reset(f);
   with StringGrid do
   begin
     // Get number of columns
    Readln(f, iTmp);
     ColCount := iTmp;
     // Get number of rows
    Readln(f, iTmp);
     RowCount := iTmp;
     // loop through cells & fill in values
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
       begin
         Readln(f, strTemp);
         Cells[i, k] := strTemp;
       end;
   end;
   CloseFile(f);
 end;

//uses Unit2;

{$R *.dfm}


procedure TForm3.BitBtn1Click(Sender: TObject);
begin
Form3.Hide;
Form2.Show;
end;

procedure TForm3.BitBtn2Click(Sender: TObject);
begin
SaveStringGrid(StringGrid1, 'c:\temp.txt');
end;


procedure TForm3.BitBtn3Click(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'c:\temp.txt');
end;



procedure TForm3.BitBtn4Click(Sender: TObject);
var i, j: Integer;
begin
  with StringGRid1 do
    for i:=1 to RowCount-1 do   //Заголовки строк не трогаем
    for j:=1 to ColCount-1 do   //Заголовки столбцов не трогаем
      Cells[j, i]:='';
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
StringGrid1.Options:=StringGrid1.Options+[goEditing];
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
StringGrid1.Cells[0, 1]:='Понедельник';
StringGrid1.Cells[0, 2]:='Вторник';
StringGrid1.Cells[0, 3]:='Среда';
StringGrid1.Cells[0, 4]:='Четверг';
StringGrid1.Cells[0, 5]:='Пятница';

StringGrid1.Cells[1, 0]:='1 пара';
StringGrid1.Cells[2, 0]:='2 пара';
StringGrid1.Cells[3, 0]:='3 пара';
StringGrid1.Cells[4, 0]:='4 пара';
StringGrid1.Cells[5, 0]:='5 пара';
StringGrid1.Cells[6, 0]:='6 пара';
StringGrid1.Cells[7, 0]:='7 пара';
StringGrid1.Cells[8, 0]:='8 пара';
end;


procedure TForm3.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Format: Word;
  C: array[0..255] of Char;
begin
  Format := DT_LEFT or DT_WORDBREAK;
  (Sender as TStringGrid).Canvas.FillRect(Rect);
  StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);
  WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C,
    StrLen(C), Rect, Format);
end;

end.

PM MAIL   Вверх
Akella
  Дата 19.12.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Почему нельзя взять готовый код сохранения и восстановления StringGrid?

Добавлено через 1 минуту и 25 секунд
Кстати, твой код сохранения и восстановления вполне рабочий.

Добавлено через 9 минут и 4 секунды
К сообщению прикрепил архив с проектом (D2007). Можно сразу нажать кнопку "Восстановить".

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  sg.zip 251,81 Kb
PM MAIL   Вверх
FarCry66
Дата 19.12.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Akella
Код на сохранение рабочий, это я знаю. И на загрузку тоже. Но проблема именно в загрузки данных написанных ранее мной в ячейку стринггрида (путём добавления нескольких строк в одну ячейку Ctrl+Enter).
Т.е. у меня в одной ячейке должно быть несколько строк. ДО этого когда я вписывал таким макаром (контрл+энтер) у меня выводилось всё в одну строку и где переход на строку ставились 2 квадратика. От этой проблемы я избавился путём добавления свойства procedure TForm3.StringGrid1DrawCell.
Теперь проблема состоит в том чтобы он сохранял правельно и загружул тоже правильно. 

Просто при загрузке файла в тринг он последующие строки после первой смещает на одну, как на втором рисунке (в вашем варианте у меня получилось тоже самое)

Это сообщение отредактировал(а) FarCry66 - 19.12.2010, 11:05
PM MAIL   Вверх
FarCry66
Дата 19.12.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Спасибо всем за содействие! Решение проблемы нашлось. Далее представляю вам код на тот случай если кого то ещё интересует такой же вопрос)

Код

procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:    TextFile;
   i, k: Integer;
 begin
   AssignFile(f, FileName);
   Rewrite(f);
   with StringGrid do
   begin
     // Write number of Columns/Rows
    Writeln(f, ColCount);
     Writeln(f, RowCount);
     // loop through cells
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
         Writeln(F, StringReplace(Cells[i, k], #13#10, '$@$', [rfReplaceAll, rfIgnoreCase]));
   end;
   CloseFile(F);
 end;

 procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:          TextFile;
   iTmp, i, k: Integer;
   strTemp:    String;
 begin
   AssignFile(f, FileName);
   Reset(f);
   with StringGrid do
   begin
     // Get number of columns
    Readln(f, iTmp);
     ColCount := iTmp;
     // Get number of rows
    Readln(f, iTmp);
     RowCount := iTmp;
     // loop through cells & fill in values
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
       begin
         Readln(f, strTemp);
         strTemp := StringReplace(strTemp, '$@$', #13#10, [rfReplaceAll, rfIgnoreCase]);
         Cells[i, k] := strTemp;
       end;
   end;
   CloseFile(f);
 end;

PM MAIL   Вверх
Akella
Дата 19.12.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(FarCry66 @  19.12.2010,  12:11 Найти цитируемый пост)
StringReplace(Cells[i, k], #13#10, '$@$', [rfReplaceAll, rfIgnoreCase]));

ну да, правильно smile
PM MAIL   Вверх
~FoX~
Дата 19.12.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



FarCry66, Akella
Trim - рудит  smile 


Это сообщение отредактировал(а) ~FoX~ - 19.12.2010, 12:55


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.