Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программа вылетает (delphi 7), свойство кнопки Enabled или Visible  (Прочитано 5972 раз)
0 Пользователей и 1 Гость смотрят эту тему.
СвоЕобразнаЯ
Участник

ru
Offline Offline

« : 21-03-2010 11:57 » 

Доброго времени суток! Да-да
Программа:

Код:
unit laba3;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2Change(Sender: TObject);
    procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   const
 SIZE=20;
var
 a: array[1..SIZE] of integer;
  Form1: TForm1;
  I,J: integer;
   h,k,n,m: integer;


implementation

{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
begin
h:=0;
 n:=StrToInt(Edit1.text);
 If (n>20) OR (n<=0)
 then begin ShowMessage('Выход за границы массива!');
     Edit1.Text:='20';
     end;
 StringGrid1.ColCount:=n+1;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
 m:=StrToInt(Edit2.text);
if (2147483647 < StrToInt64(Edit2.Text)) or (-2147483647 > StrToInt64(Edit2.Text))
then
 begin
  ShowMessage('Превышен размер числа!');
  Edit2.Text:='0';
 end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9': ;
  else
    begin
      Key := #0;
      ShowMessage('Недопустимый элемент!');
    end;
    end;
    end;

    procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
    '0'..'9': ;
  else
    begin
      Key := #0;
      ShowMessage('Недопустимый элемент!');
    end;
    end;
end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
   h:=h+1;
   Label1.Caption:=IntToStr(h);
   for i:=1 to n-1 do
  a[i]:=StrToInt(StringGrid1.Cells[i,1]);
case Key of
    '0'..'9': ;
  else
    begin
      Key := #0;
      ShowMessage('Недопустимый элемент!');
    end;
end;
end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
if (2147483647 < StrToInt64(Value)) or (-2147483647 > StrToInt64(Value))
then begin
  ShowMessage('Превышен размер числа!');
  for i:=1 to n do
  StringGrid1.Cells[i,j+1]:='';
 end;
 //if h=StrToInt(Edit1.Text) then Button1.Enabled:=True;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
var
 found: boolean;
 i: integer;
begin
 {ввод числа элементов массива n<20}
 {ввод массива }
 {ввод искомого элемента массива}
 {процедура поиска в массиве}
 found:=false;
 i:=1;
 repeat
  if a[i]=m then
   found:=true
  else
   i:=i+1;
 until (i>n) or (found = true);
 if found=true then
  ShowMessage('Совпадение с элементом номер '+ IntToStr(i)+#13+
              'Поиск успешно завершен')
 else
  ShowMessage('Заданный элемент не найден!');
end;
end.


Преподаватель дал задание сделать Button1 недоступной или невидимой до тех пор пока не будут заполнены все ячейки StringGrid1. Подсказал что из процедуры Button1.Click нужно переместить всё что не связано непосредственно с кнопкой в Edit'ы и поставить в свойствах Button1 Enabled=False, а в тексте программы ввести счётчик и условие "если счётчик=кол-ву эл-тов то Enabled:=True" Я это сделала. Но как только пытаюсь щёлкнуть в Edit'ы или на StringGrid - программа вылетает с ошибкой "is not a valid integer value".  Быть такого не может С чем это связано? Я бы хотела доделать эту программу.  Здесь была моя ладья...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 21-03-2010 12:19 » 

Первокурсница, пользуйся отладкой: запускай программу в IDE и смотри точку, где произойдет ошибка. Быстрее всего, это один из StrToInt64(). Перехватывай исключение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
СвоЕобразнаЯ
Участник

ru
Offline Offline

« Ответ #2 : 21-03-2010 12:24 » 

RXL, спасибо:)
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 22-03-2010 15:16 » 

1) OnChange едита - вещь довольно опасная. это событие присходит каждый раз, когда меняется содержимое. при вводе числа 20, например - оно вызовется два раза, и кол-во ячеек в гриде будет изменено дважды.

2) вместо констант 2147483647 и -2147483647 разумнее использовать функции Low (integer) и High (integer)

3) вместо IntToStr при преобразованиях подобного рода лучше юзать TryIntToStr, которая не выдаст ошибку в случае, если строка не является числом

4) для ввода целых чисел обычно используется TMaskEdit, в который в принципе невозможно ввести ничего, кроме числа. в вашем случае это позволит избавится большей части кода.

5) для смены состояния кнопки принято использовать следующий механизм:
  5.1) кладём на форму TActionList
  5.2) создаём Action
  5.3) назначаем этот Action вашей кнопке
  5.4) в событии OnUpdate Action-а проверяем, что все нужные элементы заполнены и в зависимости от этого выставляем Enabled/Visible у самого Action-а. соответствующее свойство у кнопки изменится автоматически.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines