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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2010, 16:32   #11
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

сейчас попробую
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 16:44   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
  for i:=1 to SG1.RowCount-1  do 
    for j:=1 to SG2.RowCount-1  do
Какие строчки второй таблицы (j) надо выводить для одной конкретной строки перовй таблицы (i) одну или несколько.

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

Цитата:
попробуй хотя бы на бумажке написать весь вывод
вот что у тебя должно было получиться ничто не настораживает? Если нет по пора пойти погулять.
Код:
  AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do
    for j:=1 to SG1.RowCount-1  do
      begin
        s:=SG1.Cells[0,i];
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 16:54   #13
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
  for i:=1 to SG1.RowCount-1  do 
    for j:=1 to SG2.RowCount-1  do
Какие строчки второй таблицы (j) надо выводить для одной конкретной строки перовй таблицы (i) одну или несколько.

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


вот что у тебя должно было получиться ничто не настораживает? Если нет по пора пойти погулять.
Код:
  AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do
    for j:=1 to SG1.RowCount-1  do
      begin
        s:=SG1.Cells[0,i];
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
Я может быть некорректно выразился, но у меня в программе два компонента StringGrid, а Вы привели код для одной таблицы из двух столбцов, у меня же в программе две таблицы по одному столбцу в каждой. Вот вид программы и результаты выполнения с Вашим кодом
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 17:01   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
попробуй хотя бы на бумажке написать весь вывод (всех строк) с такой заменой
Цитата:
SG2.Cells[0,....] на SG1.Cells[1,....]
код который должен был получиться
красным выделено то что должно было насторожить
Код:
 AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do //для каждой строки 
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s:=SG1.Cells[0,i];
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 17:19   #15
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
код который должен был получиться
красным выделено то что должно было насторожить
Код:
 AssignFile(f, 'file.txt');
  Rewrite(f);
  for i:=1 to SG1.RowCount-1  do //для каждой строки 
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s:=SG1.Cells[0,i];
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
  CloseFile(f)
Да зачем меня должны они настораживать? i - это строки SG1 (первая таблица), j - это строки второй таблицы SG2. Таблицы состоят из одного столбца. Я считываю данные с первой строки по i-тую из первой таблицы, затем данные с первой строки по j-тую. Затем присваиваю переменной s значения в ячейке с 1 по i-тую из первой таблицы, и тоже самое со второй. Затем мне надо чтобы в файле они имели вид как в самой программе, т.е. столбик значений чисел, а рядом (напротив) столбик инвертированных значений. Что я не так делаю??
r_yevgeniy вне форума Ответить с цитированием
Старый 22.03.2010, 19:16   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
зачем меня должны они настораживать?
затем что именно в этих строках кроется ваша ошибка. До тех пор пока вы не научитесь отделять в пргорамме точ то ХОТИТЕ вы и БУДЕТ делать написанный код успехов не ожидайте.
Цитата:
Я считываю данные с первой строки по i-тую из первой таблицы, затем (для каждой из этих строк) данные с первой строки по j-тую. Затем присваиваю переменной s значения в ячейке с 1 по i-тую из первой таблицы, и тоже самое со второй
может будет так понятней

Код:
for i:=1 to SG1.RowCount-1  do //для каждой строки 
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s:=SG1.Cells[0,i]; //никак не завист от переменной j
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
поэтому данный блок можно переписать немного по другому
Код:
for i:=1 to SG1.RowCount-1  do //для каждой строки 
   begin
    s:=SG1.Cells[0,i]; //никак не завист от переменной j
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s1:=SG1.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
end;
все еще не ясно (вы для одной строки SG1
Код:
for i:=1 to SG1.RowCount-1  do //для каждой строки 
   begin
    s:=SG1.Cells[0,i]; //никак не завист от переменной j
выводите все строки SG2
Код:
     s:=SG1.Cells[0,i]; //никак не завист от переменной j
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s1:=SG1.Cells[1,j];
если до сих пор непонятно, то утро вечера мудренее.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 20:21   #17
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
for i:=1 to SG1.RowCount-1  do //для каждой строки 
   begin
    s:=SG1.Cells[0,i]; //никак не завист от переменной j
выводите все строки SG2
Код:
     s:=SG1.Cells[0,i]; //никак не завист от переменной j
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s1:=SG1.Cells[1,j];
если до сих пор непонятно, то утро вечера мудренее.
мы по моему о разных вещах говорим. Я еще раз повторяю у меня два компонента StrinGrid. Как какие то данные смогут занестись в переменную из второй таблицы если вы нигде не используете SG2. Вы данные извлекаете только из первой таблицы.

Не знаю что делать. Приведу на всякий случай почти весь код программы

Код:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  SG1.Cells[0, 0] := 'Числа';
  SG2.Cells[0, 0] := 'Инверсия';
  left := (screen.width div 2) - (width div 2);
  top := 160;
end;

procedure TMainForm.CheckHeight;
begin
  if (SG1.TopRow > 1) and (Height < Screen.Height - 52) then begin
    Height := Height + SG1.RowHeights[0]+1;
    Top := Top - (SG1.RowHeights[0]+1) div 2;
    SG1.TopRow := 1;
  end;
end;

procedure TMainForm.SG1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var Fl : word;
begin
  Fl := DT_LEFT;

  if ARow = 0 then
    SG1.Canvas.Brush.Color := clBtnFace
  else
    SG1.Canvas.Brush.Color := clWhite;
  SG1.Canvas.FillRect(Rect);

  if ARow = 0 then begin
    Fl := DT_LEFT;
    InflateRect(Rect, -2, -2);
  end else begin
    if Integer(SG1.Objects[ACol, ARow]) = 1 then begin
      SG1.Canvas.Brush.Color := $008080FF;
      SG1.Canvas.FillRect(Rect);
    end;
    Rect.Left := Rect.Left+2;
    Rect.Top := Rect.Top+2;
  end;

  DrawText(SG1.Canvas.Handle, PChar(SG1.Cells[ACol, ARow]), -1, Rect, Fl);
end;

var
  digs : set of Char = ['0'..'9'];

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;

procedure TMainForm.SG1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  if SG1.RowCount = SG2.RowCount then
     SG2.Row := ARow;
end;

{Процедура сохранения содержимого таблиц в файл}
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 //для каждой строки
   begin
    s:=SG1.Cells[1,i]; //никак не завист от переменной j
    for j:=1 to SG1.RowCount-1  do //выводим ВСЕ строки
      begin
        s1:=SG2.Cells[1,j];
        Writeln(f, i, #9, j, #9, s,'  ',s1);
      end;
end;
  CloseFile(f)
end;

{Выход из приложения}
procedure TMainForm.ExitMenuBtnClick(Sender: TObject);
begin
MainForm.Close;
end;
{вызываем окно Об авторе}
procedure TMainForm.AboutAuthorBtnClick(Sender: TObject);
begin
  AboutAuthorForm.Show;
end;

{Процедура очистки ячеек}
procedure TMainForm.ClearToolBtnClick(Sender: TObject);
var i, j: integer;
    h: THandle;
begin
  {очищаем первую таблицу}
  For i:=1 to SG1.RowCount-1 do
  SG1.Rows[i].Clear;
  SG1.RowCount:=2;
  {очищаем вторую таблицу}
  For j:=1 to SG2.RowCount-1 do
  SG2.Rows[i].Clear;
  SG2.RowCount:=2;
  SG2.Rows[1].SetText('');
  {перемещаем фокус для первой таблицы на ячейку для ввода}
  Application.ProcessMessages;
  SG1.SetFocus;
  SG1.EditorMode := true;
  Application.ProcessMessages;
  h:= Windows.GetFocus;
  SendMessage(h, EM_SETSEL, 1, 1);

end;

procedure TMainForm.HelpMenuItemClick(Sender: TObject);
begin
  ShellExecute(Application.Handle,'open','help.chm',nil,nil,1);
end;

end.
Таблица SG2 позволяет вводить данные, во второй только чтение
r_yevgeniy вне форума Ответить с цитированием
Старый 23.03.2010, 08:15   #18
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Все разобрался с кодом, спасибо)

Код:
for i:=0 to SG1.RowCount-1 do
    //for j:=1 to SG2.RowCount-1  do // это вообще не нужно
      begin
        s:=SG1.Cells[0,i];
        s1:=SG2.Cells[0,i];
        Writeln(f, {i, #9, j, #9,} s,'       ',s1);
      end;
Только как теперь выровнять, числа чтобы в файле красиво смотрелись, а то в зависимости от разрядности они сдвигаются, пробелы не спасают между s и s.
r_yevgeniy вне форума Ответить с цитированием
Старый 23.03.2010, 11:06   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Все разобрался с кодом, спасибо)
где разобрался здесь?
Цитата:
как теперь выровнять, числа чтобы в файле красиво смотрелись,
чем не устраивает тот вариант который был приведен (или смотрим но не видим)
Writeln(f, {i, #9, j,#9,} s,' ',s1);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 23.03.2010, 11:07   #20
r_yevgeniy
Пользователь
 
Регистрация: 20.03.2010
Сообщений: 21
По умолчанию

Все сделал до конца) И выравнивание тоже. Вот код
Код:
procedure TMainForm.SaveToolBtnClick(Sender: TObject);
var i, j : byte;
    f : TextFile;
    s, s0, s1, space, space1, space2 : String;
begin
  AssignFile(f, 'file.txt');
  ReWrite(f);
  for i:=0 to SG1.RowCount-1 do
    //for j:=1 to SG2.RowCount-1  do
      begin
        s:=SG1.Cells[0,i]; //номер строки
        s0:=SG1.Cells[1,i];// числа
        s1:=SG2.Cells[0,i]; // инверсия
        space:=StringOfChar(' ', 5-Length(s)); //выравние в файле
        space1:=StringOfChar(' ', 30-Length(s1));
        space2:=StringOfChar(' ', 30-Length(s1));
        Writeln(f, {i,' ',} {j, #9,} s,space,s0,space1,s1,space2);
      end;
  CloseFile(f)
end;
Спасибо за советы
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