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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2022, 18:21   #1
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
Сообщение Сортировка массива записей в StringGrid

Здравствуйте, помогите пожалуйста с заданием
Pascal Lazarus
Обработка МАССИВА ЗАПИСЕЙ при помощи ТАБЛИЦЫ. Реализовать ввод одной записи по ЧАСТЯМ через поля Edit:
если введенные данные КОРРЕКТНЫ
(написать функцию проверки, получая на выходе boolean, с вызовом после каждого ввода и показом ShowMessage при некорректности)
и в таблице не содержится ДУБЛИКАТА,
то добавить запись в КОНЕЦ таблицы и ОЧИСТИТЬ поля ввода,
иначе выдать СООБЩЕНИЕ об ошибке ввода и не очищать Editы.
Ошибки для проверки: недопустимый ввод(числа в строках/строки в числах), пустая ячейка, значения в числах <=0
Для сортировки использовать Button('Сортировать') и три режима в RadioButton:
1) сортировки массива по 1му признаку записи;
2) сортировки по 2му признаку;
3) двойной сортировки - по строковому признаку, а если строка совпадает, то по 1му числовому признаку
Таблица для библиотеки: (название книги), (автор), (год издания)


Вот код для ввода в таблицу

Код:
procedure TForm1.Button1Click(Sender: TObject);
 var a,f1,f2,f3,b,c,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]);
 
StringGrid1.ColCount := 0;
StringGrid1.ColCount := StringGrid1.ColCount + 4;
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
else
ShowMessage('Дублированная запись');
end
else
ShowMessage('Ошибки в таблице');
end;
Изображения
Тип файла: png df1.png (2.0 Кб, 16 просмотров)
Тип файла: png ва.png (21.6 Кб, 16 просмотров)

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

Цитата:
Сообщение от mr.stranger Посмотреть сообщение
Код:
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;
Код:
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 begin
  ... /* Добавление */
else
  ... /* Совпадение */
end;
Цитата:
Сообщение от mr.stranger Посмотреть сообщение
Код:
StringGrid1.ColCount := 0;
StringGrid1.ColCount := StringGrid1.ColCount + 4;
StringGrid1.RowCount := StringGrid1.RowCount + 1;
Не надо обнулять ColCount и тогда не понадобятся массивы.
Код:
/* StringGrid1.ColCount := 4; Нет необходимости, если свойство определено в конструкторе объектов */
StringGrid1.RowCount := StringGrid1.RowCount + 1;
Чтобы начать заполнять таблицу сначала либо заведите переменную инициированную начальным количеством строк и используйте ее значение в качестве индекса и количества строк, либо установите в свойствах StringGrid1 значение RowCount в 1.

Последний раз редактировалось macomics; 03.05.2022 в 02:43.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 18:29   #3
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;
Изображения
Тип файла: png fddddb.png (1.9 Кб, 11 просмотров)
mr.stranger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобраться с указателями. Сортировка массива записей. AndrzejX Общие вопросы Delphi 0 01.03.2013 07:53
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Изменение записей в StringGrid artemavd Общие вопросы Delphi 13 15.11.2010 18:31
Сортировка массива записей Юляшко Паскаль, Turbo Pascal, PascalABC.NET 5 28.04.2010 13:57
добавление записей в StringGrid в Delphi TaYgA Помощь студентам 0 23.01.2010 20:33