Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.04.2014, 17:09
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
Сообщение Помогите исправить ошибки

Пытался создать программу, которая создаёт два одномерных массива, в каждом из которых находит минимальное значение и эти значения сравнивает, выводя в отдельный Эдит результат (t). Точную формулировку задания, к сожалению, не помню. Как я понял, у меня как-то неправильно создаются массивы, но что нужно сделать не пойму.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Panel2: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  A=array[0..100] of integer;
  B=array[0..100] of integer;
var
  Form1: TForm1;
  N1,N2:String;
  N11,N22,a1,b1,minA,minB:integer;

implementation

{$R *.dfm}

//label restart;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled:=False;
  Button3.Enabled:=False;
  Button4.Enabled:=False;
end;

procedure TForm1.Button1Click(Sender: TObject); //кнопка создания массивов
begin
  N1:=Edit1.Text;
  N2:=Edit2.Text;
  N11:=StrToInt(N1);
  N22:=StrToInt(N2);
  if N11<0 then
    N11:=1
  Else if N11>99 then
    N11:=99
  else
    ShowMessage('Длина массива X: Введите число');
  if N22<0 then
    N22:=1
  Else if N22>99 then
    N22:=99
  else
    ShowMessage('Длина массива Y: Введите число');
  randomize;
  for a1:=0 to N11-1 do
    A(a1):=(-99+random(198));;
  for b1:=0 to N22-1 do
    B(b1):=-99+random(198);
  Button2.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject); //кнопка нахождения минимумов
begin
  minA:=A(a1);
  minB:=B(b1);
  for a1:=1 to N11-1 do
    if A(a1)<minA then
      minA:=A(a1);
  for b1:=1 to N22-1 do
    if B(b1)<minB then
      minB:=B(b1);
  Button3.Enabled:=True;
end;

procedure TForm1.Button3Click(Sender: TObject); //кнопка сравнения минимумов матриц и вывода t
begin

end;

procedure TForm1.Button4Click(Sender: TObject); //кнопка для сброса полей (возврат к начальным условиям)
var m:Integer;
begin
  Edit1.Text:='Длина массива X';
  Edit2.Text:='Длина массива Y';
  for m:=1 to 15 do
    Memo1.Lines.Delete(m);
  Memo1.Lines.Add:='Здесь будет результат программы (значение t) и';
  Memo1.Lines.Add:='минимальные значения матриц X и Y.';

end;
//goto restart;

end.
Ошибки и предупреждения:
Код:
[Warning] Unit1.pas(72): For loop control variable must be simple local variable
[Error] Unit1.pas(73): Invalid typecast
[Warning] Unit1.pas(74): For loop control variable must be simple local variable
[Error] Unit1.pas(75): Invalid typecast
[Error] Unit1.pas(81): Invalid typecast
[Error] Unit1.pas(82): Invalid typecast
[Warning] Unit1.pas(83): For loop control variable must be simple local variable
[Error] Unit1.pas(84): Invalid typecast
[Error] Unit1.pas(85): Invalid typecast
[Warning] Unit1.pas(86): For loop control variable must be simple local variable
[Error] Unit1.pas(87): Invalid typecast
[Error] Unit1.pas(88): Invalid typecast
[Error] Unit1.pas(99): Not enough actual parameters
[Error] Unit1.pas(99): Incompatible types: 'Integer' and 'String'
[Error] Unit1.pas(100): Not enough actual parameters
[Error] Unit1.pas(100): Incompatible types: 'Integer' and 'String'
Ответить с цитированием
  #2  
Старый 28.04.2014, 17:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Guerron
Пытался создать программу, которая создаёт два одномерных массива, в каждом из которых находит минимальное значение и эти значения сравнивает, выводя в отдельный Эдит результат (t). Точную формулировку задания, к сожалению, не помню. Как я понял, у меня как-то неправильно создаются массивы, но что нужно сделать не пойму.
Массивы нужно объявлять не типами, а переменными:
Код:
var
  A: array[0..100] of integer;
  B: array[0..100] of integer;
Обращаться к элементам массива нужно через квадратные скобки, а не круглые:
Код:
A[a1] := (-99+random(198));
И переменные для цикла for нужно делать локальными, а не глобальными - тогда не будет выдавать "For loop control variable must be simple local variable"
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Guerron (28.04.2014)
  #3  
Старый 28.04.2014, 17:29
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

72,74,83,86 For loop control variable must be simple local variable
Дословный перевод
переменная цикла должна быть локальной переменной процедуры или функции
внутри функций Button1Click и Button2Click, перед Begin вставить строчку
Код:
var a1,b1:integer;

73,75,81,82,84,85,87,88
вот это A(a1) - вызов функции, а поскольку A это не функция, а массив, то и ругается.
Надо A[a1].

99,100
не так
Код:
  Memo1.Lines.Add:='Здесь будет результат программы (значение t) и';
  Memo1.Lines.Add:='минимальные значения матриц X и Y.';
а вот так
Код:
  Memo1.Lines.Add ('Здесь будет результат программы (значение t) и');
  Memo1.Lines.Add( 'минимальные значения матриц X и Y.');
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Guerron (28.04.2014)
  #4  
Старый 28.04.2014, 17:31
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Настоятельно рекомендуется прочитать про массивы:

http://rucodes.com/delphi-arr.html

http://rucodes.com/array-pas.html

Касательно вашего кода
Код:
type
  A=array[0..100] of integer;
 B=array[0..100] of integer;
Здесь вы объявляете два одинаковых типа. Сами массивы при этом не объявляются. Объявить массив можно следующим образом:
Код:
var
  A=array[0..100] of integer;
 B=array[0..100] of integer;

Здесь, Вы, видимо, пытаетесь инициализовать элементы массива.
Код:
  for a1:=0 to N11-1 do
    A(a1):=(-99+random(198));;

При этом a1 - это переменная типа integer.
Команда A(a1) пытается привести целочисленную переменную a1 к выше объявленному типу А. Понятное дело у нее это не получается, поэтому выдается ошибка
Код:
[Error] Unit1.pas(73): Invalid typecast

Что бы выполнить обращение к элементу массива вам нужно:
1) Объявить переменную соответствующего типа(выше написал как)
2) Обратится к элементу массива по индексу: A[a1]

Относительно остальных ошибок. Код:
Код:
for m:=1 to 15 do
    Memo1.Lines.Delete(m);
Выглядит как генератор ошибок, что Вы тут хотели сделать?

Код
Код:
 Memo1.Lines.Add:='Здесь будет результат программы (значение t) и';
  Memo1.Lines.Add:='минимальные значения матриц X и Y.';

Неправильно использует функцию Add, правильно так
Код:
 Memo1.Lines.Add('Здесь будет результат программы (значение t) и');
  Memo1.Lines.Add('минимальные значения матриц X и Y.');
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров
Ответить с цитированием
Этот пользователь сказал Спасибо madMonia за это полезное сообщение:
Guerron (28.04.2014)
  #5  
Старый 28.04.2014, 17:45
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от madMonia
Относительно остальных ошибок. Код:
Код:
for m:=1 to 15 do
    Memo1.Lines.Delete(m);
Выглядит как генератор ошибок, что Вы тут хотели сделать?
Здесь хотел, чтобы все имеющиеся строки (ну или первые 15) были удалены вне зависимости от их содержания
Ответить с цитированием
  #6  
Старый 28.04.2014, 18:04
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Цитата:
Сообщение от Guerron
Здесь хотел, чтобы все имеющиеся строки (ну или первые 15) были удалены вне зависимости от их содержания

Тут есть два момента:
1) Индексация в TStrings (а именно такой тип имеет свойство Lines у компонента Memo) начинается с 0 а не с 1.
2) При таком удалении Вы рискуете получить ошибку, если строк в Lines меньше 29ти. Дело в том, что при каждой команде Memo1.Lines.Delete(m);
Вы удаляете строку с номером m. Последней Вы удаляете 15ю строку, а до нее удалили уже 14ть. Таким образом, до начала удаления у вас должно быть минимум 29ть строк, чтобы после удаления 14ти из них, 15я строка все же существовала и ее можно было удалить. Надеюсь я вас не запутал.

Другими словами, удаление чего бы то ни было с помощью - плохая идея
Код:
for m:=1 to 15 do

удалять следует, хотя бы так
Код:
for m:=15 downto 1 do

А лучше вообще с помощью while.

Получается нужно удалить первые 15ть строк, а остальные, если такие есть, сохранить?

Тогда как-то так
Код:
var
  StringsToDeleteCount: integer;
begin
  if Memo1.Lines.Count > 15 
      then StringsToDeleteCount = 15
      else StringsToDeleteCount = Memo1.Lines.Count;

for m:=StringsToDeleteCount -1 downto 0 do
  Memo1.Lines.Delete(m);

Если же цель - просто очистить мемо, то лучше использовать
Код:
  Memo1.Lines.Clear;
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров
Ответить с цитированием
Этот пользователь сказал Спасибо madMonia за это полезное сообщение:
Guerron (05.05.2014)
  #7  
Старый 05.05.2014, 18:02
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот исправленный код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Panel2: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

//type
//  A=array[0..100] of integer;
//  B=array[0..100] of integer;
var
  A:array[0..100] of integer;
  B:array[0..100] of integer;
  Form1: TForm1;
  N1,N2:String;
  N11,N22,minA,minB:integer;

implementation

{$R *.dfm}

//label restart;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled:=False;
  Button3.Enabled:=False;
  Button4.Enabled:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a1,b1:Integer;
begin
  N1:=Edit1.Text;
  N2:=Edit2.Text;
  N11:=StrToInt(N1);
  N22:=StrToInt(N2);
  if N11<=0 then
    N11:=1
  Else if N11>99 then
    N11:=99;
  {else
    ShowMessage('Длина массива X: Введите число');}
  if N22<=0 then
    N22:=1
  Else if N22>99 then
    N22:=99;
  {else
    ShowMessage('Длина массива Y: Введите число');}
  randomize;
  for a1:=0 to N11-1 do
    A[a1]:=(-99+random(198));;
  for b1:=0 to N22-1 do
    B[b1]:=-99+random(198);
  Button2.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a1,b1:Integer;
begin
  N1:=Edit1.Text;
  N2:=Edit2.Text;
  N11:=StrToInt(N1);
  N22:=StrToInt(N2);
  minA:=100;
  minB:=100;
  for a1:=1 to N11-1 do
    if A[a1]<minA then
      minA:=A[a1];
  for b1:=1 to N22-1 do
    if B[b1]<minB then
      minB:=B[b1];
  Button3.Enabled:=True;
end;

procedure TForm1.Button3Click(Sender: TObject);
var t:Integer;
begin
  if minA<=minB then
    t:=minA
  else t:=minB;
  Memo1.Lines.Clear;
  Memo1.Lines.Add('t='+IntToStr(t)+' |  '+'min of A='+
  IntToStr(minA)+'  |  '+'min of B'+IntToStr(minB));
  Button4.Enabled:=True;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Edit1.Text:='Длина массива X';
  Edit2.Text:='Длина массива Y';
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Здесь будет результат программы (значение t) и'');
  Memo1.Lines.Add('минимальные значения матриц X и Y.');

end;
//goto restart;

end.
В целом всё работает, но хочу, чтобы
а) после нажатия 4-й кнопки 2,3 и 4-я кнопки отключались как при создании формы
б) при нажатии 4-й кнопки в поле Memo1

Последний раз редактировалось Guerron, 05.05.2014 в 18:07.
Ответить с цитированием
  #8  
Старый 05.05.2014, 23:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так в её обработчике (жим кнопки4) в конце пропишите тоже самое, что и при создании формы
Код:
...
Button2.Enabled:=False;
Button3.Enabled:=False;
Button4.Enabled:=False;
...
а вот с мемо не понял честно, если просто нужно очистить поле, то пропишите Memo1.Clear...
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Guerron (06.05.2014)
  #9  
Старый 06.05.2014, 09:53
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не успел дописать второй момент. В общем вещь, что мне не нравится, заключается в том, что обе строки съезжают вверх, то есть удаляется всё нормально, строки обе создаются нормально, но чтобы увидеть первую строку надо вручную прокрутить невидимый скроллбар в Мемо, т.к. она выше видимой области оказывается, хотя и само поле Мемо имеет достаточные размеры даже для 4-х строк.
Ответить с цитированием
  #10  
Старый 06.05.2014, 10:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Guerron
Не успел дописать второй момент. В общем вещь, что мне не нравится, заключается в том, что обе строки съезжают вверх, то есть удаляется всё нормально, строки обе создаются нормально, но чтобы увидеть первую строку надо вручную прокрутить невидимый скроллбар в Мемо, т.к. она выше видимой области оказывается, хотя и само поле Мемо имеет достаточные размеры даже для 4-х строк.
Чтобы отобразить скроллбары у Мемо задай свойству ScrollBars нужное значение (отличное от ssNone).
Чтобы длинные строки не разбивались на несколько коротких отключи у Мемо перенос строк установкой свойства WordWrap в False.
Ответить с цитированием
  #11  
Старый 06.05.2014, 12:47
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Попробую ещё раз объяснить - я хочу, чтобы мои две строки были сразу видны вместе после нажатия кнопки, а на данный момент после нажатия строки идут со смещением так, что первая строка оказывается чуть выше, чем должна была быть
Ответить с цитированием
  #12  
Старый 06.05.2014, 23:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

В той же самой процедуре жима кнопки4 в конце (после заполнения мемо) пропишите строчку
Код:
...
Memo1.Perform(WM_VScroll, SB_LINEUP, 0);
...
Ответить с цитированием
  #13  
Старый 12.05.2014, 17:54
Guerron Guerron вне форума
Прохожий
 
Регистрация: 28.04.2014
Адрес: Москва
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
Радость

Спасибо всем за помощь и внимание, теперь всё работает идеально
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter