![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Столкнулась с интересной проблемой.
Есть форма с StringGrid, При нажатии ячейки я ввожу туда значения в виде (счет1) : (счет2). Делала я это с помощью TMaskEdit. И все работало: Код:
procedure TForm2.MaskEdit1Change(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=MaskEdit1.Text;
end;
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
MaskEdit1.Visible := false;
if (gdFocused in State) then
begin
if (ACol<>ARow) then
begin
MaskEdit1.Visible := true;
MaskEdit1.Text:=StringGrid1.Cells[ACol, ARow];
MaskEdit1.Left := Rect.Left + StringGrid1.Left+2;
MaskEdit1.Top := Rect.Top + StringGrid1.top+2;
MaskEdit1.Width := Rect.Right - Rect.Left;
MaskEdit1.Height := Rect.Bottom - Rect.Top;
exit;
end;
end;
end;Но для полной красоты мне не хватало указания времени когда проходила игра. Я решила добавить форму в которую записывались результаты и время. Добавила кнопку и прописала в ней событие открытия формы, но выкидывалась ошибка и я решила сначала сделать с помощью Message. С ним тоже проблем не возникло. Код:
procedure TForm2.StringGrid1Click(Sender: TObject);
begin
bt:=true;
end;
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (bt=true) then //добавила, что бы срабатывало 1 раз после клика
Begin
if (gdFocused in State) then
begin
if (ACol<>ARow) then
begin
bt:=false;
ShowMessage('llllll');
exit;
end;
end;
end;
end;А вот если заменить Message на вызов формы - возникают проблемы. Запустить форму как Form.ShowModal, не выходит, только как просто Form.Show. Форма запускается, но открывается на всю форму в которой прописан StringGrid и не поддается редактированию. Закрыть ее тоже не удается. Фактически программа виснет. Код:
procedure TForm2.btn3Click(Sender: TObject);
begin
bt:=True;
if (not Assigned(Form4)) then
Form4:=TForm4.Create(Self);
Form4.Show;
end;
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (bt=true) then
Begin
if (gdFocused in State) then
begin
if (ACol<>ARow) then
begin
bt:=false;
btn3.Click;
exit;
end;
end;
end;
end;Подскажите как это исправить ![]() |
|
#2
|
|||
|
|||
|
Попробуй так:
Код:
procedure TForm2.btn3Click(Sender: TObject);
begin
bt:=True;
if (not Assigned(Form4)) then
Application.CreateForm(TForm4, Form4);// <-----
Form4.Show;
end;<exit;> - лишнее Последний раз редактировалось icsander, 23.11.2012 в 18:22. |
|
#3
|
||||
|
||||
|
Вообще никак не реагирует. Предлагает просто ввод в ячейку, форму не вызывает.
|
|
#4
|
|||
|
|||
|
Ну вообще вызов модальной формы в DrawCell не очень хорошая идея. Лучше перенести ее в StringGridDblClick либо в StringGridClick (не совсем удобно выделить ячейку или строку).
Код:
procedure TForm2.StringGridDblClick(Sender: TObject); begin Application.CreateForm(TForm4, Form4); Form4.Edit1.Text:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];//На Form4 есть Edit1, ему и передаем значение ячейки Form4.ShowModal; StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=Form4.Edit1.Text;//Новый текст в ячейку Form4.Free;//Убиваем форму end; |
| Этот пользователь сказал Спасибо icsander за это полезное сообщение: | ||
Edinora (23.11.2012)
| ||
|
#5
|
||||
|
||||
|
Нет, все-таки реагирует, но так же как и в предыдущем случае.
|
|
#6
|
|||
|
|||
|
Подробнее опишите, что и как реагирует.
И если можно выложите весь проект (в архиве). |
|
#7
|
||||
|
||||
![]() Если пишу просто Form.show ошибка та же. ![]() |
|
#8
|
|||
|
|||
|
Ну так надо ShowModal. По Show форма сразу и закрывается, если смотреть по коду.
|
|
#9
|
||||
|
||||
|
Все, разобралась. Спасибо большое за подсказки они очень помогли!!!
я в последнем случае ошибку сделала, не в тот метод добавила. Кидаю рабочий код, вдруг кому-то еще надо будет _sg1 - StringGrid bt - проверка, что бы каждый раз при перерисовке форма не вызывалась Код:
var
Form1: TForm1;
bt:Boolean=false;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var num,d,i: Integer;
begin
num:=1;
DoubleBuffered:=true;
with Form1._sg1 do
begin
num:=15;
if (num>0) then
begin
if (num>2)then
begin
RowCount:=num+1;
ColCount:=num+1;
end;
d:= trunc((Width-20)/(num+1));
for i:=0 to num do
begin
Cells[0,i]:=IntToStr(i);
Cells[i,0]:=IntToStr(i);
ColWidths[i]:=d;
end;
end;
end;
end;
procedure TForm1._sg1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var br:TBrush;
acc,arr:Integer;
begin
if (ACol=ARow) then
begin
_sg1.Canvas.Brush.Color:=clRed;
_sg1.Canvas.FillRect(Rect);
end;
if (bt = true) then
begin
if (gdFocused in State) then
begin
if (ACol<>ARow) then
begin
bt:=false;
// ShowMessage('llllll');
end;
end;
end;
end;
procedure TForm1._sg1Click(Sender: TObject);
begin
bt:= True;
Application.CreateForm(TForm2, Form2);
Form2.Edt1.Text:=_sg1.Cells[_sg1.Col, _sg1.Row];
Form2.ShowModal;
_sg1.Cells[_sg1.Col, _sg1.Row]:=Form2.Edt1.Text;
Form2.Free;
end;Огромадное СПАСИБО всем тем, кто помог в решении данного вопроса. |
|
#10
|
|||
|
|||
|
А с какого перепуга форма будет вызываться при перерисовке грида ???
|
|
#11
|
||||
|
||||
|
Она будет вызываться 1 раз при клике на грид. Если не прописать условие bt, то форма будет вызываться при каждой перерисовке формы - отлично видно в примере message.
|
|
#12
|
|||
|
|||
|
Код
Код:
if (bt = true) then
begin
if (gdFocused in State) then
begin
if (ACol<>ARow) then
begin
bt:=false;
// ShowMessage('llllll');
end;
end;
end;
end;<bt> - не при делах. Форма вызывается только при клике на ячейке грида (procedure TForm1._sg1Click(Sender: TObject) .ShowMessage('llllll'); - да, будет вызываться при перерисовке. |