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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2022, 22:43   #1
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию ошибка в выводе

Вот такой код, ошибка в выводе - почему-то пишет через строку, хотя надо на следующей и во время сортировки кидает все записи вниз, тоже не знаю как исправить
Помогите пожалуйста
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var a,f1,f2,f3,b,c,q:integer;
   ms1,ms2,ms3:array of string;
begin

SetLength(ms1,StringGrid1.RowCount);
SetLength(ms2,StringGrid1.RowCount);
SetLength(ms3,StringGrid1.RowCount);

Val(Trim(Edit1.Text),b,f1);
Val(Trim(Edit2.Text),b,f2);
Val(Trim(Edit3.Text),c,f3);

if (Length(Edit1.text)<>0) and (Length(Edit2.text)<>0) and (Length(Edit3.text)<>0) and (f3=0) and (f1<>0) and (f2<>0) and (c>0) then
begin

for a := 1 to StringGrid1.RowCount-1 do
  if (StringGrid1.Cells[1,a]=Trim(Edit1.Text)) and (StringGrid1.Cells[2,a]=Trim(Edit2.Text)) and (StringGrid1.Cells[3,a]=Trim(Edit3.Text)) then
    begin
      q := 1;
      break;
    end;
  if q = 0 then
  ShowMessage('Дублированная запись')
  else
  begin
  for a := 1 to StringGrid1.RowCount-1 do
    ms1[a]:= Trim(StringGrid1.Cells[1,a]);
    for a := 1 to StringGrid1.RowCount-1 do
    ms2[a]:= Trim(StringGrid1.Cells[2,a]);
    for a := 1 to StringGrid1.RowCount-1 do
    ms3[a]:= Trim(StringGrid1.Cells[3,a]);

    StringGrid1.RowCount := StringGrid1.RowCount + 1;

    for a := 1 to StringGrid1.RowCount-2 do
    StringGrid1.Cells[1,a] := ms1[a];
    for a := 1 to StringGrid1.RowCount-2 do
    StringGrid1.Cells[2,a] := ms2[a];
    for a := 1 to StringGrid1.RowCount-2 do
    StringGrid1.Cells[3,a] := ms3[a];

    StringGrid1.InsertRowWithValues(StringGrid1.RowCount-2, ['', Edit1.Text, Edit2.Text, Edit3.Text]);

    for a := 1 to StringGrid1.RowCount-1 do
    StringGrid1.Cells[0,a] := IntToStr(a);
  end;
end
else
ShowMessage('Ошибки в таблице');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 ms1,ms2,ms3:array of string;
 s1,s2,s3:string;
 i,j:integer;
begin
  SetLength(ms1,StringGrid1.RowCount);
  SetLength(ms2,StringGrid1.RowCount);
  SetLength(ms3,StringGrid1.RowCount);

  if RadioButton1.Checked = True then
  begin

    for i := 1 to StringGrid1.RowCount-1 do
    begin
      ms1[i] := StringGrid1.Cells[1,i];
      ms2[i] := StringGrid1.Cells[2,i];
      ms3[i] := StringGrid1.Cells[3,i];
    end;
    for i := 1 to StringGrid1.RowCount-1 do
      for j := 1 to StringGrid1.RowCount-i-1 do
      begin
        if ms1[j] > ms1[j+1] then
        begin
          s1 := ms1[j];
          ms1[j] := ms1[j+1];
          ms1[j+1] := s1;

          s2 := ms2[j];
          ms2[j] := ms2[j+1];
          ms2[j+1] := s2;

          s3 := ms3[j];
          ms3[j] := ms3[j+1];
          ms3[j+1] := s3;

        end;
      end;
    for i := 1 to StringGrid1.RowCount-1 do
    begin
      StringGrid1.Cells[1,i] := ms1[i];
      StringGrid1.Cells[2,i] := ms2[i];
      StringGrid1.Cells[3,i] := ms3[i];
    end;

  end
  else
    if RadioButton2.Checked = True then
    begin

      for i := 1 to StringGrid1.RowCount-1 do
      begin
        ms1[i] := StringGrid1.Cells[1,i];
        ms2[i] := StringGrid1.Cells[2,i];
        ms3[i] := StringGrid1.Cells[3,i];
      end;
      for i := 1 to StringGrid1.RowCount-1 do
        for j := 1 to StringGrid1.RowCount-i-1 do
        begin
         if ms3[j] > ms3[j+1] then
          begin
            s1 := ms1[j];
            ms1[j] := ms1[j+1];
            ms1[j+1] := s1;

            s2 := ms2[j];
            ms2[j] := ms2[j+1];
            ms2[j+1] := s2;

            s3 := ms3[j];
            ms3[j] := ms3[j+1];
            ms3[j+1] := s3;
          end;
        end;
      for i := 1 to StringGrid1.RowCount-1 do
      begin
        StringGrid1.Cells[1,i] := ms1[i];
        StringGrid1.Cells[2,i] := ms2[i];
        StringGrid1.Cells[3,i] := ms3[i];
      end;
    end;
end;
end.
mr.stranger вне форума Ответить с цитированием
Старый 17.05.2022, 23:47   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от mr.stranger Посмотреть сообщение
Код:
and (f3=0) and (f1<>0) and (f2<>0) and (c>0) then
Может переменную `c` стоит инициализировать? Точно флаг f3 надо проверять на равенство 0, а остальные (f1 и f2) на неравенство?

Цитата:
Сообщение от mr.stranger Посмотреть сообщение
Код:
for a := 1 to StringGrid1.RowCount-1 do // (3) {
    ms1[a]:= Trim(StringGrid1.Cells[1,a]);
    for a := 1 to StringGrid1.RowCount-1 do
    ms2[a]:= Trim(StringGrid1.Cells[2,a]);
    for a := 1 to StringGrid1.RowCount-1 do
    ms3[a]:= Trim(StringGrid1.Cells[3,a]); // } ...

    StringGrid1.RowCount := StringGrid1.RowCount + 1; // (1)

    for a := 1 to StringGrid1.RowCount-2 do // (3) ... {
    StringGrid1.Cells[1,a] := ms1[a];
    for a := 1 to StringGrid1.RowCount-2 do
    StringGrid1.Cells[2,a] := ms2[a];
    for a := 1 to StringGrid1.RowCount-2 do
    StringGrid1.Cells[3,a] := ms3[a]; // }

    StringGrid1.InsertRowWithValues(StringGrid1.RowCount-2, ['', Edit1.Text, Edit2.Text, Edit3.Text]); // (2)

    for a := 1 to StringGrid1.RowCount-1 do
    StringGrid1.Cells[0,a] := IntToStr(a); // (4)
Определитесь. Вы либо сами (1) добавляете строки вручную или используете метод вставки новой строки (2). Если (2), то массивы не нужны совсем (3) и достаточно присваивать номер только последней добавленной строке (4).

Сортировка: Подозреваю, что у вас в Инспекторе объектов для StringGrid1 настроены пустые строки. При сортировке он их поднимает наверх. Установите у компонента количество строк равное 1 (только заголовок). Или можете это сделать в TForm1Create.
macomics вне форума Ответить с цитированием
Старый 18.05.2022, 15:04   #3
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Установите у компонента количество строк равное 1 (только заголовок).
Если ставлю 1, то он загоняет новую запись над строкой с названиями колонок
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 15:06   #4
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Ввод идет через такую форму
Потом добавляется три компонента RadioButton для сортировки
Изображения
Тип файла: png ва.png (21.6 Кб, 17 просмотров)
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 16:17   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Поставьте 1 и исправьте строку (2) на
Код:
with StringGrid1 do InsertRowWithValues(RowCount, [inttostr(RowCount), Edit1.Text, Edit2.Text, Edit3.Text])
ADD: Если бы использовали отладчик и проходили выполнение каждой строки кода с контролем значений, то не возникало бы таких вопросов.

Последний раз редактировалось macomics; 18.05.2022 в 16:40.
macomics вне форума Ответить с цитированием
Старый 18.05.2022, 17:37   #6
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Поставьте 1 и исправьте строку (2) на
Кидает первую запись на вторую строчку, а следующие норм

Последний раз редактировалось mr.stranger; 18.05.2022 в 17:51.
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 17:51   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так может покажите изваяние, которое это производит. Или надо догадаться, что за изменения вы уже внесли.

Попробуйте использовать отладчик. Если нажать на строку левее ее номера, то она станет красной и программа после запуска остановится по ее достижении. Так можно сделать более чем с одной строкой. Дальше открываете окно "Локальные переменные/Local variables" и "Наблюдение/Watches" (поищите в меню "Вид/View"). И ищите место где просчитались наблюдая за значениями и выполняя программу строчка за строчкой.
macomics вне форума Ответить с цитированием
Старый 18.05.2022, 17:52   #8
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
 var a,b,c,d,f1,f2,f3,q1,q2,q3,q4:integer;
ms1,ms2,ms3: array of string;
begin
q1 := 0;
q2 := 0;
q3 := 0;
q4 := 0;

SetLength(ms1,StringGrid1.RowCount);
SetLength(ms2,StringGrid1.RowCount);
SetLength(ms3,StringGrid1.RowCount);

for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[1,a] = Trim(Edit1.Text) then
q1 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[2,a] = Trim(Edit2.Text) then
q2 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[3,a] = Trim(Edit3.Text) then
q3 := 1;
q4 := q1 + q2 + q3;

Val(Trim(Edit1.Text),b,f1);
Val(Trim(Edit2.Text),b,f2);
Val(Trim(Edit3.Text),c,f3);

if (Length(Edit1.text) <> 0) and (Length(Edit2.text) <> 0) and (Length(Edit3.text) <> 0) and (f3 = 0) and (f1 <> 0) and (f2 <> 0) and (c > 0) then
begin
if q4 <> 3 then
begin

for a := 1 to StringGrid1.RowCount-1 do
ms1[a]:= Trim(StringGrid1.Cells[1,a]);
for a := 1 to StringGrid1.RowCount-1 do
ms2[a]:= Trim(StringGrid1.Cells[2,a]);
for a := 1 to StringGrid1.RowCount-1 do
ms3[a]:= Trim(StringGrid1.Cells[3,a]);

for a := 1 to StringGrid1.RowCount-2 do
StringGrid1.Cells[1,a] := ms1[a];
for a := 1 to StringGrid1.RowCount-2 do
StringGrid1.Cells[2,a] := ms2[a];
for a := 1 to StringGrid1.RowCount-2 do
StringGrid1.Cells[3,a] := ms3[a];

with StringGrid1 do InsertRowWithValues(RowCount, [IntToStr(RowCount), Edit1.Text, Edit2.Text, Edit3.Text]);

for a := 1 to StringGrid1.RowCount-1 do
StringGrid1.Cells[0,a] := IntToStr(a)
end
else
ShowMessage('Дублированная запись');
end
else
ShowMessage('Ошибки в записи');
end;
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 17:55   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от mr.stranger Посмотреть сообщение
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var a,b,c,d,f1,f2,f3,q1,q2,q3,q4:integer;
ms1,ms2,ms3: array of string; // *
begin
q1 := 0;
q2 := 0;
q3 := 0;
q4 := 0;

SetLength(ms1,StringGrid1.RowCount); // *
SetLength(ms2,StringGrid1.RowCount); // *
SetLength(ms3,StringGrid1.RowCount); // *

for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[1,a] = Trim(Edit1.Text) then
q1 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[2,a] = Trim(Edit2.Text) then
q2 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[3,a] = Trim(Edit3.Text) then
q3 := 1;
q4 := q1 + q2 + q3;

Val(Trim(Edit1.Text),b,f1);
Val(Trim(Edit2.Text),b,f2);
Val(Trim(Edit3.Text),c,f3);

if (Length(Edit1.text) <> 0) and (Length(Edit2.text) <> 0) and (Length(Edit3.text) <> 0) and (f3 = 0) and (f1 <> 0) and (f2 <> 0) and (c > 0) then
begin
if q4 <> 3 then
begin

for a := 1 to StringGrid1.RowCount-1 do // *
ms1[a]:= Trim(StringGrid1.Cells[1,a]); // *
for a := 1 to StringGrid1.RowCount-1 do // *
ms2[a]:= Trim(StringGrid1.Cells[2,a]); // *
for a := 1 to StringGrid1.RowCount-1 do // *
ms3[a]:= Trim(StringGrid1.Cells[3,a]); // *

for a := 1 to StringGrid1.RowCount-2 do // *
StringGrid1.Cells[1,a] := ms1[a]; // *
for a := 1 to StringGrid1.RowCount-2 do // *
StringGrid1.Cells[2,a] := ms2[a]; // *
for a := 1 to StringGrid1.RowCount-2 do // *
StringGrid1.Cells[3,a] := ms3[a]; // *

with StringGrid1 do InsertRowWithValues(RowCount, [IntToStr(RowCount), Edit1.Text, Edit2.Text, Edit3.Text]);

for a := 1 to StringGrid1.RowCount-1 do // *
StringGrid1.Cells[0,a] := IntToStr(a) // *
end
Вот эти все строки, что я отметил "// *" не нужны совсем. Компилятор наверняка вам об этом кричит и так.

add: При этом у вас должна быть только одна строка заголовка в StringGrid1 при запуске программы. Тогда все добавляется нормально.

Последний раз редактировалось macomics; 18.05.2022 в 18:03.
macomics вне форума Ответить с цитированием
Старый 18.05.2022, 17:59   #10
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вот эти все строки, что я отметил "// *" не нужны совсем. Компилятор наверняка вам об этом кричит и так.
Действительно, спасибо
Но проблему это не решило
Если поставить RowCount-1, стало вносить в первую строку

Последний раз редактировалось mr.stranger; 18.05.2022 в 18:12.
mr.stranger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выводе Pasha_Sh Общие вопросы Delphi 7 27.03.2015 19:52
ошибка в выводе Satansoft Помощь студентам 2 20.03.2013 19:08
Ошибка при выводе xml DKENT Работа с сетью в Delphi 0 08.02.2011 21:49
Ошибка при выводе trad Общие вопросы C/C++ 7 15.01.2011 11:32