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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 19:52   #1
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию Сохранение данных из двух StringGrid

Здравствуйте! Не м получается корректно реализовать процедуру сохранения в файл данных взятых из ячек двух компонентов StringGrid.
Написал код. но он какой то неправильный. Подскажите как реализовать чтобы работало как надо

Код:
procedure TMainForm.SaveToolBtnClick(Sender: TObject);
var i, j : byte;
    f : TextFile;
    s : String;
    s1: string;
begin
  AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=0 to SG1.RowCount - 1 do
    for j:=0 to SG2.RowCount - 1 do
      begin
        s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,j];
        Writeln(f,s,s1);
      end;
  CloseFile(f)
end;
При таком варианте у меня заноситься что попало
Код:
ЧислаИнверсия
Числа654
Числа987
Числа321
Числа852
Числа20
456Инверсия
456654
456987
456321
456852
45620
789Инверсия
789654
789987
789321
789852
78920
123Инверсия
123654
123987
123321
123852
12320
258Инверсия
258654
258987
258321
258852
25820
02Инверсия
02654
02987
02321
02852
0220
Хотелось бы иметь на выходе два столбика с Числом и Его инверсией друг напротив друга. Мне кажется все очень просто должно делаться. Но я в этом не силен. Подскажите пожалуйста. Заранее спасибо.
r_yevgeniy вне форума Ответить с цитированием
Старый 21.03.2010, 20:48   #2
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Здрасте! Опишите пожалуйста входные параметры (для подпрограммы - число столбцов и строк и т.д.) и как нужно сохранить в файл (хаотично или в столбцы и пр.)
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 21.03.2010, 22:13   #3
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

В этом сообщении я привел пример сохранения и загрузки содержимого StringGrid'a в файл

http://www.programmersforum.ru/showp...19&postcount=2
W0LF вне форума Ответить с цитированием
Старый 22.03.2010, 11:32   #4
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от notHaker Посмотреть сообщение
Здрасте! Опишите пожалуйста входные параметры (для подпрограммы - число столбцов и строк и т.д.) и как нужно сохранить в файл (хаотично или в столбцы и пр.)
Доброго времени суток! Изначально при запуске программы StringGridы содержат по одному столбцу и по две строки(одна фиксированная для названия). Я начинаю вводить данные в первую таблицу, затем нажимаю Enter и появляется новая строка и фокус переходит на нее. Строк можно таких вводить очень много.
Вот процедура обработки клавиатуры для первой таблицы в которую вводим значения

Код:
procedure TMainForm.SG1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  case Key of
    VK_DOWN :
      if (SG1.Row = SG1.RowCount-1) and (SG1.Cells[0, SG1.RowCount-1] <> '') then begin
        SG1.RowCount := SG1.RowCount + 1;
        CheckHeight;
      end;
    VK_UP :
      if (SG1.Row = SG1.RowCount-2) and
         (SG1.Cells[0, SG1.RowCount-1] = '') and
         (SG1.Row > 1)
      then begin
        SG1.RowCount := SG1.RowCount - 1;
      end;
    VK_RETURN :
      if (SG1.Row = SG1.RowCount-1) and (SG1.Cells[0, SG1.RowCount-1] <> '') then begin
        SG1.RowCount := SG1.RowCount + 1;
        SG1.Row := SG1.Row + 1;
        CheckHeight;
      end;
  end;
end;
Вот процедура которая выполняется по события OnCreate для MainForm

Код:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  SG1.Cells[0, 0] := 'Числа'; //SG1 - Первая таблица
  SG2.Cells[0, 0] := 'Инверсия'; // SG2 - Вторая таблица
end;
При нажатии кнопки запустить выполняется следующий код:

Код:
procedure TMainForm.RunToolBtnClick(Sender: TObject);
var I, J, Cnt : Integer; // входные параметры для таблиц
    S, S2 : string;
    R : TRect;
begin
  if SG1.Cells[0, SG1.RowCount-1] = '' then
    SG1.RowCount := SG1.RowCount-1;
    SG2.RowCount := SG1.RowCount;

  Cnt := 0;
  Mes := '';
  for I := 1 to SG1.RowCount-1 do begin
    SG1.Objects[0, I] := TObject(0);
    if SG1.Cells[0, I] = '' then begin
      SG1.Objects[0, I] := TObject(1);
      Inc(Cnt);
      Mes := Mes + IntToStr(I)+', ';
      S := 'неверно';
      continue;
    end;

    S := '';
    S2 := SG1.Cells[0, I];
    for J := 1 to Length(S2) do begin
      if S2[J] in digs then
        S := S2[J] + S
      else begin
        SG1.Objects[0, I] := TObject(1);
        Inc(Cnt);
        Mes := Mes + IntToStr(I)+', ';
        S := 'неверно';
        break;
      end;
    end;
    SG2.Cells[0, I] := S;
  end;

  if Length(Mes) > 2 then begin
    if Cnt = 1 then
      Mes := 'Неверное число в строке: '+Mes
    else
      Mes := 'Неверно введены числа в строках: '+#13#10+Mes;
      Mes := Copy(Mes, 1, Length(Mes)-2);
      //ShowMessagePos(Mes, 200, 200);
      Error1.Show;
      Error1.Error1Memo.Text:=Mes;
  end;
end;
Сохранить нужно в файл, следующего вида:

Число Инверсия
456 654
546 645
139 931
1205 5012
180 081
065 560

Хотелось бы еще реализовать количество введенных чисел, т.е. как то в цикле посчитать сколько строк в SG1 вывести в файле том же

Количество чисел: 6 (для нашего примера)

Заранее спасибо если кто нибудь хоть чем нибудь каким нибудь кусочком кода поможет.
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 13:46   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

если хотите понять что делаете не так то попробуйте заменить ваш вывод
Writeln(f,s,s1);
на следующий (выводить не только ячейки но их индексы)
Writeln(f, i, #9, j, #9, s,s1);

а еще лучше постараться и заменить две таблицы на одну с увеличенным числом колонок, тогда и ошибка кстати стане более очевидной (или же она "вдруг" исчезнет сама по себе).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2010 в 13:52.
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 14:59   #6
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
если хотите понять что делаете не так то попробуйте заменить ваш вывод
Writeln(f,s,s1);
на следующий (выводить не только ячейки но их индексы)
Writeln(f, i, #9, j, #9, s,s1);

а еще лучше постараться и заменить две таблицы на одну с увеличенным числом колонок, тогда и ошибка кстати стане более очевидной (или же она "вдруг" исчезнет сама по себе).
Попробовал сделать как вы сказали. Вот что получилось на выходе

Код:
0	0	ЧислаИнверсия
0	1	Числа321
0	2	Числа654
0	3	Числа987
0	4	Числа741
0	5	Числа852
0	6	Числа963
0	7	Числа951
1	0	123Инверсия
1	1	123321
1	2	123654
1	3	123987
1	4	123741
1	5	123852
1	6	123963
1	7	123951
2	0	456Инверсия
2	1	456321
2	2	456654
2	3	456987
2	4	456741
2	5	456852
2	6	456963
2	7	456951
3	0	789Инверсия
3	1	789321
3	2	789654
3	3	789987
3	4	789741
3	5	789852
3	6	789963
3	7	789951
4	0	147Инверсия
4	1	147321
4	2	147654
4	3	147987
4	4	147741
4	5	147852
4	6	147963
4	7	147951
5	0	258Инверсия
5	1	258321
5	2	258654
5	3	258987
5	4	258741
5	5	258852
5	6	258963
5	7	258951
6	0	369Инверсия
6	1	369321
6	2	369654
6	3	369987
6	4	369741
6	5	369852
6	6	369963
6	7	369951
7	0	159Инверсия
7	1	159321
7	2	159654
7	3	159987
7	4	159741
7	5	159852
7	6	159963
7	7	159951
Чо то я не могу понять В том и загвоздка что необходимо сделать на двух StrinGrid. С одним я делал проблем не было. Вот поэтому и спрашиваю как с двумя сделать
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 15:03   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
0 0 ЧислаИнверсия
0 1 Числа321
тебя ни капли не смущает множественное повторение значений в ПЕРВОЙ колонке. а ведь это ИНДЕКС строки из которой берутся данные.

Код:
       s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,j];
        Writeln(f, i, #9, j, #9, s,s1);
последня подсказка какая из нижеприведенных строк тебе нужна
Цитата:
1 0 123Инверсия
1 1 123321
1 2 123654
все строки взяты из твоей таблицы и какие в ней стоят значения индексов.
Точнее какое соотношение между индексами i и j (первая вторая колонки).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2010 в 15:14.
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 16:05   #8
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
тебя ни капли не смущает множественное повторение значений в ПЕРВОЙ колонке. а ведь это ИНДЕКС строки из которой берутся данные.

Код:
       s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,j];
        Writeln(f, i, #9, j, #9, s,s1);
последня подсказка какая из нижеприведенных строк тебе нужна
все строки взяты из твоей таблицы и какие в ней стоят значения индексов.
Точнее какое соотношение между индексами i и j (первая вторая колонки).
Что то у меня не получается, просто наугад тыкаю, и подсказка ваша не помогает. Изменил код немного

Код:
{Процедура сохранения содержимого таблиц в файл}
procedure TMainForm.SaveToolBtnClick(Sender: TObject);
var i, j : byte;
    f : TextFile;
    s : String;
    s1: string;
begin
  AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do
    for j:=1 to SG2.RowCount-1  do
      begin
        s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
end;
На выходе
Код:
1	1	123  321
1	2	123  654
2	1	456  321
2	2	456  654
Я понимаю что каким то образом необходимо выделенные строки убрать и должно получиться, но как...
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 16:20   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
все строки взяты из твоей таблицы и какие в ней стоят значения индексов.
Точнее какое соотношение между индексами i и j (первая вторая колонки).
Цитата:
необходимо выделенные строки убрать
сформулированного словами русского языка ответа не прозвучало

кстати не обнаружил никаких препятствий для замены
SG2.Cells[0,....] на SG1.Cells[1,....] //приведение к одной таблице

Код:
  AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do
    for j:=1 to SG2.RowCount-1  do
      begin
        s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
P>S> попробуй хотя бы на бумажке написать весь вывод (всех строк) с такой заменой (может тогда станет ясно чем проблема).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2010 в 16:33.
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 16:31   #10
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
сформулированного словами русского языка ответа не прозвучало
Программа заносит в файл

Первую строку из первой таблицы и первую строку из второй таблицы
Затем опять первую строку из первой таблицы и вторую строку из второй таблицы
Затем вторую строку из первой таблицы и первую строку из второй таблицы
И наконец вторую строку из первой таблицы и вторую строку из второй таблицы.

Я не понимаю что нужно в коде исправить чтобы убрать две лишние строки! Я уже часа 4-5 сижу...
r_yevgeniy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СОХРАНЕНИЕ данных из StringGrid в Excel monushka Общие вопросы Delphi 4 17.05.2012 18:56
сохранение\загрузка в компоненте StringGrid Lorden Помощь студентам 1 07.12.2009 17:11
Сохранение Stringgrid c ColorBOX mazdakilla Компоненты Delphi 3 12.05.2008 17:05
Сохранение StringGrid, создание .ini! Nemesisking Общие вопросы Delphi 5 24.09.2007 08:23