![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Код:
var
L, S: Integer;
for L:=1 to StringGrid1.RowCount do
begin
S:=StrToInt(StringGrid1.Cells[7,L]);
if S<=14 then
begin
Label15.Visible:=true;
Label15.Caption:='До записи осталось меньше 14 дней!';
break;
end;
end;Этот код выполняется в нескольких местах: при загрузке таблицы, при изменении содержимого и при добавлении новой записи. Хочу написать собственную процедуру этой проверки... но не получается... у меня проблема с описанием этой процедуры и с передачей параметров Я не смог найти материала по написанию собственных функций и процедур, а то что есть в книгах, очень скудный материал... Помогите пожалуйста, можно на этом примере, можно на собственных... Куда что писать? |
|
#2
|
|||
|
|||
|
Во-первых, ошибка в коде. А именно,
Код:
for L:=1 to StringGrid1.RowCount do Во-вторых, не очень понятно, что конкретно вы желаете получить от своей собственной процедуры и чем не устраивает имеющаяся... Ну создайте процедуру и вставьте этот код в нее. Параметры ей, думаю не нужны, если объект StringGrid1 все время один и тот же. |
|
#3
|
||||
|
||||
|
проблемы были, когда начальное значение L было равно 0, потому что первая строка, заголовочная пустая. а сейчас проблем с проверкой нет,
даже если L=StringGrid.RowCount Я не знаю что писать в скобках при описании процедуры и что писать в тех же скобках при вызове этой процедуры. У меня такая проблема уже не впервой... Скорей всего мне нужно знать, где можно прочитать подробный материал по написанию своих собственных функций и процедур. А эта функция просто проверяет содержимое определенных ячеек и если значение меньше, то... и если условие на какой-то ячейке выполнено, то выход из цикла... |
|
#4
|
||||
|
||||
|
На этом форуме была тема с кучей книг по Delphi для новичков. В каждой книге по Delphi ОБЯЗАТЕЛЬНО есть статья по написанию процедур и функций. Штудируй))
|
|
#5
|
|||
|
|||
|
rasamaha, а сюда не заглядывали? =)
И вообще, в нормальных книгах достаточно подробно расписывается материал о создании подпрограмм (процедур и функций) И все же по поводу ошибки: предлагаю вам заполнить всю седьмую колонку числами, заведомо бОльшими, чем 14. И посмотреть, как там "проблем нет"... |
|
#6
|
||||
|
||||
|
popyurv, спасибо за совет)) у меня дома пять книг по Делфи, и ...
а вроде не дурак, говорят знакомые))) а написать собственную так и не получилось, вечно выдает ошибку что что-то не так с параметрами или их не достаточно... я еще раз проштудирую эту тему, может где что упустил... а лучше попробую еще раз написать и выложить код, чтоб вы посмотрели) |
|
#7
|
||||
|
||||
|
Цитата:
![]() |
|
#8
|
||||
|
||||
|
Я так понял вы пытаетесь оптимизировать вашу программу, для чего повторяющиеся блоки кода хотите вынести в процедуры. Ошибки скорее всего у вас возникают потому-что вы нарушаете правила "видимости переменных". Вот с этим наверное и разберитесь в первую очередь, а уже после этого вы поймете имеет ли смысл в вашу процедуру передавать параметры или она без них будет правильно работать.
|
|
#9
|
||||
|
||||
|
вот код программы:
Код:
unit Tabliza1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ComCtrls, Menus, DateUtils, Calendar, Mask;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
GroupBox1: TGroupBox;
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N6: TMenuItem;
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button3: TButton;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
procedure DateTimePicker1Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{******************************************************************************}
procedure TForm1.FormCreate(Sender: TObject);
begin
DateTimePicker1.Date:=Date;
DateTimePicker2.Date:=DateTimePicker1.Date+10;
end;
//Показываем диалог сохранения файла.
procedure TForm1.N3Click(Sender: TObject);
begin
SaveDialog1.Execute;
end;
//Сохраняем таблицу в файл *.txt
procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
var
i, LastRow: Integer;
SList: TStringList;
begin
SList := TStringList.Create;
LastRow := StringGrid1.RowCount - 1;
try
for i := 0 to LastRow do
SList.Add(StringGrid1.Rows[i].CommaText);
SList.SaveToFile(SaveDialog1.FileName);
finally
SList.Free;
end;
end;
//Заполняем таблицу из файла *.txt
procedure TForm1.N2Click(Sender: TObject);
var
i, LastRow, CommaPos: Integer;
FirstStr: string;
SList: TStringList;
begin
if not OpenDialog1.Execute then Exit;
SList := TStringList.Create;
try
SList.LoadFromFile(OpenDialog1.FileName);
StringGrid1.RowCount := SList.Count;
FirstStr := SList.Strings[0];
i := 0; CommaPos := Pos(',', FirstStr);
while CommaPos <> 0 do
begin
Delete(FirstStr, 1, CommaPos);
Inc(i);
CommaPos := Pos(',', FirstStr);
end;
StringGrid1.ColCount := i + 1;
LastRow := StringGrid1.RowCount - 1;
for i := 0 to LastRow do
StringGrid1.Rows[i].CommaText := SList.Strings[i];
finally
SList.Free;
end;
end;
//Добавляем строку в StringGrid1
procedure TForm1.Button1Click(Sender: TObject);
var
rt: Integer;
begin
with StringGrid1 do
begin
if RowCount>2 then
begin
rt:=RowCount;
Edit4.Text:=InttoStr(rt);
Cells[0,rt-1]:=InttoStr(rt-1);
Cells[1,rt-1]:=Edit1.Text;
Cells[2,rt-1]:=ComboBox1.Text;
Cells[3,rt-1]:=DateToStr(DateTimePicker1.Date);
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Cells[4,rcnt-1]:=DateToStr(DateTimePicker2.Date);
Label14.Caption:=IntToStr(DaysBetween(Date,DateTimePicker2.Date));
Cells[5,rt-1]:=Label1.Caption;
RowCount:=RowCount+1;
end;
if RowCount=2 then
begin
rt:=RowCount-1;
Edit4.Text:=InttoStr(rt);
Cells[0,rt]:=InttoStr(rt);
Cells[1,rt]:=Edit1.Text;
Cells[2,rt]:=ComboBox1.Text;
Cells[35,rt]:=DateToStr(DateTimePicker1.Date);
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Cells[4,rt]:=DateToStr(DateTimePicker2.Date);
Label1.Caption:=IntToStr(DaysBetween(Date,DateTimePicker2.Date));
Cells[5,rt]:=Label14.Caption;
RowCount:=RowCount+1;
end;
end;
end;
//
procedure Lka (Sg: TStringGrid);
var
L, S: Integer;
StringGrid1: TStringGrid;
Label2: TLabel;
begin
for L:=1 to StringGrid1.RowCount do
begin
S:=StrToInt(StringGrid1.Cells[5,L]);
if S<=10 then
begin
Label2.Visible:=true;
Label2.Caption:='до записи осталось меньше 10 дней!';
break;
end;
end;
end;
//При изменении даты DateTimePicker1 высчитываем дату следующей записи
// и кол-во дней до следующей записи
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Label14.Caption:=IntToStr(DaysBetween(Date,DateTimePicker2.Date));
end;
//Удаляем строку со здвигом
procedure SGDeleteRow(SG: TStringGrid; RowToDelete: Integer);
var
i: Integer;
begin
if (RowToDelete > 0) and (RowToDelete < SG.RowCount) then
begin
i:=RowToDelete;
while i < SG.RowCount do
begin
SG.Rows[i].Assign(SG.Rows[i+1]);
SG.Cells[0,i]:=IntToStr(i);
i:=i+1;
end;
end;
SG.RowCount := SG.RowCount - 1;
end;
procedure TForm1.Button3Click(Sender: TObject);
var RowToDelete: Integer;
begin
if StringGrid1.RowCount <=2 then
ShowMessage('Нельзя удалить все строки из списка!')
else
begin
RowToDelete:=StringGrid1.Selection.Top;
SGDeleteRow(StringGrid1,RowToDelete);
end;
end;
//Переносим данные субъекта из строки таблицы в панель редактирования}
procedure TForm1.StringGrid1Click(Sender: TObject);
var RowToEdit: Integer;
begin
RowToEdit:=StringGrid1.Selection.Top;
Edit1.Text:=StringGrid1.Cells[1,RowToEdit];
ComboBox3.Text:=StringGrid1.Cells[2,RowToEdit];
if StringGrid1.Cells[5,RowToEdit] = '' then
begin
DateTimePicker1.Date:=Date;
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Label1.Caption:=IntToStr(DaysBetween(Date,DateTimePicker2.Date));
end
else
begin
DateTimePicker1.Date:=StrToDate(StringGrid1.Cells[5,RowToEdit]);
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Label1.Caption:=StringGrid1.Cells[5,RowToEdit];
end;
end;
//Обновляем отредактированную строку, переносим данные в таблицу
procedure TForm1.Button2Click(Sender: TObject);
var nst: Integer;
begin
with StringGrid1 do
begin
nst:=StrToInt(Edit4.Text);
Cells[0,nst]:=InttoStr(nst);
Cells[1,nst]:=Edit1.Text;
Cells[2,nst]:=ComboBox1.Text;
Cells[3,nst]:=DateToStr(DateTimePicker1.Date);
Cells[4,nst]:=DateToStr(DateTimePicker2.Date);
Cells[5,nst]:=Label1.Caption;
end;
Edit4.Text:='';
Edit1.Text:='';
ComboBox1.ItemIndex:= -1;
DateTimePicker1.Date:=Date;
DateTimePicker2.Date:=DateTimePicker1.Date+10;
Label1.Caption:=IntToStr(DaysBetween(Date,DateTimePicker2.Date));
Lka;
end;
// Закрываем программу
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var buttomSel: Integer;
begin
buttomSel:= MessageDlg('Сохранить список перед закрытием?'
,mtCustom, [mbOk], 0);
// Показ типа выбранной кнопки
if buttomSel = mrOK then
SaveDialog1.Execute;
end;
end.
есть панель редактирования со Editoм, ComboBoxом и календарями. Моя собственная процедура Lka, не работает... что я тут не так сделал? Последний раз редактировалось rasamaha, 13.04.2009 в 03:20. |
|
#10
|
|||
|
|||
|
rasamaha, во-первых, ваша собственная процедура Lka принимает параметр Sg, который нигде не использует. Отсюда скорейший вывод — параметры ей не нужны, т.е. следует переписать ее как-то так:
Код:
procedure Lka; var L, S: Integer; // и так далее ............. Код:
procedure Lka;
var
L, S: Integer;
begin
for L:=1 to Form1.StringGrid1.RowCount - 1 do
begin
S := StrToInt(Form1.StringGrid1.Cells[5,L]);
if S <= 10 then
begin
Form1.Label2.Visible:=true;
Form1.Label2.Caption:='до записи осталось меньше 10 дней!';
break;
end;
end;
end; |
|
#11
|
||||
|
||||
|
Для работоспособности процедуры ее бы неплохо было еще и объявить:
Код:
...
procedure Button3Click(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Lka (Sg: TStringGrid);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}Да и описание процедуры в implementation делается следующим образом: Код:
procedure TForm1.Lka (Sg: TStringGrid);
var
L, S: Integer;
StringGrid1: TStringGrid;
Label2: TLabel;
begin
for L:=1 to StringGrid1.RowCount do
begin
S:=StrToInt(StringGrid1.Cells[5,L]);
if S<=10 then
begin
Label2.Visible:=true;
Label2.Caption:='до записи осталось меньше 10 дней!';
break;
end;
end;
end; |
|
#12
|
|||
|
|||
|
glaZZ, процедура Lka не обязана быть методом объекта Form1. И тогда она может не объявляться, если описана раньше в коде, чем происходит ее вызов.
|
|
#13
|
||||
|
||||
|
Nyctos Kasignete, не буду спорить - для определенных случаев можно и не объявлять, но в большинстве случаев лучше сделать так, как я написал
![]() |